异步处理:假设某个接口有 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 系统都无需修改代码。
数据分发:
小结
消息队列也有它自身的一些问题和局限性,包括:
引入消息队列带来的延迟问题;
增加了系统的复杂度;
可能产生数据不一致的问题。