LCFlxfldy 2020-07-05
假设系统A需要直接调用系统B、C、D,其中,系统A是主要业务,B、C、D为非主要业务,系统A调用系统B的接口需要200ms,调用系统C的接口需要200ms,调用系统D的接口需要200ms,那么这次请求就需要600ms,如果加入一些其他的业务,执行时间可能会更长,多达数十秒都有可能。此时,为了提高用户体验和吞吐量,其实可以异步地调用系统B、C、D的接口。所以,我们可以通过引入消息中间件,再系统A执行完后将数据写入到消息队列中直接返回,而BCD系统则负责监听执行。
但是这里需要注意的是,为什么异步问题我们不考虑使用线程来处理,基于可扩展性和紧耦合两个点。首先在可扩展性上是极为不便的,一个全链路流程本身是比较长的,需要接很多接口,并且这种添加是动态的,这样会导致添加一次就得重新发布一次。其次系统是紧耦合的,出问题排查也很麻烦,流程里面随便一个地方出问题搞不好会影响其他点。
在异步基础上,通过引入消息中间件,即解决了流程RT过高的问题,同时解耦系统,提高了系统的可扩展性。
我们再来一个场景,假设我们每个月要搞一次大促,大促期间的并发可能会很高的,比如每秒3000个请求。假设我们现在有两台机器处理请求,并且每台机器只能每次处理1000个请求。那多出来的1000个请求,可能就把我们整个系统给搞崩了。所以,有一种办法,我们可以写到消息队列中。各个子系统根据自己的处理能力去消息队列中拿数据,即便有每秒有8000个请求,那只是把请求放在消息队列中,去拿消息队列的消息由系统自己去控制,这样就不会把整个系统给搞崩。
消息队列的优势在前面介绍了,但是技术是把双刃剑,使用之后问题也是接踵而至,具体的问题包括系统复杂性、数据一致性与可用性:
市面上比较流行的消息中间件主要有:ActiveMQ、RabbitMQ、RocketMQ、Kafka等,具体如下:
通过以上分析可知,消息中间件最佳选型为RocketMQ。