使用MQ使得应用解耦,提升容错性和可维护性,如下图,当用户下单时,如果其它几个系统出现异常,则直接导致订单失败,如果加入MQ订单系统只需把数据放入MQ中,后续其它系统直接从MQ中取就可以,即使后续系统报错,也和订单系统无关。
提升用户体验和系统吞吐量。使用MQ后,用户则只关心订单系统的处理所需的时间。
当我们短时间内有大量请求时,使用MQ可提高性能,假如每秒5000个请求进入MQ,那么我们的A系统则可以有条不紊的处理数据。如1000…2000…
使用了MQ之后,限制消费的速度为1000,这样依赖高峰期产生的数据必会被积压在MQ中高峰就被‘削掉’了,但因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ异步调用,可能会出现消息被重复消费,消息丢失,消息的顺序错乱等。
假设我们有四个系统,A系统处理完业务,通过MQ给B、C、D三个系统发消息,如果B、C处理成功,D处理失败,则无法保证消息处理的一致性。
1.生产者不需要从消费者处获得反馈,引入消息队列之前的直接调用,其接口的返回值应该为空,这才可以让明明下层的动作还没有做,上层却当成动作做完了继续往后走,即所谓异步。
2.容许短暂的不一致性。
3.确实是用了MQ有效果,即解耦、提速、削峰这些方面的收益,超过加入MQ,管理MQ的这些成本。
目前业界有很多MQ产品,而这些消息队列产品各有侧重,在实际选择是需结合自身需求,综合考虑