为什么需要消息队列
异步处理:假设某个接口有ABC三个操作,A操作很快就能完成,但是BC操作比较耗时,此时就可以把BC两个操作放入到消息队列中,并直接返回,这样就能减少接口的等待时间。
流量控制:假设我们的数据库系统每秒只能处理 2k 个请求,系统正常情况下,每秒并发请求数量就 50 个。 系统高峰期时,每秒需要处理 5k 个请求,如果这 5k 个请求直接访问到数据库,那么数据库肯定是扛不住的。 如果使用 MQ,每秒 5k 个请求写入到 MQ,然后系统通过 MQ 慢慢拉取请求,每秒钟拉取 2k 个请求。 在高峰期时,会有大量的请求积压在了 MQ 中,但是高峰期过了之后,每秒就 50 个请求进入到 MQ,而系统每秒钟从 MQ 中拉取 2k 个请求,系统就能够快速的消费掉积压的消息。
服务解耦:以保险公司为例,A系统中的案件结案后:
-
B系统需要将案件的赔付信息上传到监管平台
-
C系统需要对这个案件进行风险分析,需要识别出这个案件是否骗保或者是需要追偿的案件
传统做法就是:A系统分别去调用B、C系统的接口,假设此时又有D、E、F系统也需要知道案件是否结案,那么A系统也要修改代码。
引入消息队列后,A系统的案件结案后直接往消息队列中发送一条结案消息,所有的下游系统只要订阅这个消息就可以了,无论是增加或者减少下游系统,A系统都无需修改代码。
数据分发:A系统的某条数据修改需要通知B、C、D、E、…多个系统,那么其它系统只需要监听MQ消息就可以了
优缺点
优点:解耦、削峰、数据分发
缺点包含以下几点:
-
系统可用性降低
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
如何保证MQ的高可用?
-
系统复杂度提高
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
-
一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。
如何保证消息数据处理的一致性?
小结
消息队列也有它自身的一些问题和局限性,包括:
引入消息队列带来的延迟问题;
增加了系统的复杂度;
可能产生数据不一致的问题。