一、概述
- 主要功能:应用解耦,异步消息,流量削锋等问题
- 架构设计:实现高性能,高可用,可伸缩和最终一致性架构
- 常用消息队列:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
- 使用场景:
1)RabbitMQ:对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次(集群不能动态扩展)
2)RocketMQ:具有高吞吐量、高可用性、适合大规模分布式系统应用的特点(支持的语言较少,语言支持的情况下优先选择)
3)Kafka:基于Pull的模式来处理消息消费,追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务(多数用于处理日志)
二、核心功能理解
- 解耦:一个事务,只关心核心的流程。而需要依赖其他系统但不那么重要的事情,有通知即可,无需等待结果
- 异步消息:
- 一致性:保证消息的可靠性
1)强一致性:
2)最终一致性:主要是用“记录”和“补偿”的方式。在做所有的不确定的事情之前,先把事情记录下来,然后去做不确定的事情,结果可能是:成功、失败或是不确定,“不确定”(例如超时等)可以等价为失败。成功就可以把记录的东西清理掉了,对于失败和不确定,可以依靠定时任务等方式把所有失败的事情重新执行一遍,直到成功为止
三、使用总结
1.消息队列不是万能的,对于需要强事务保证而且延迟敏感的,RPC是优于消息队列的。
2.对于一些无关痛痒,或者对于别人非常重要但是对于自己不是那么关心的事情,可以利用消息队列去做。
3.支持最终一致性的消息队列,能够用来处理延迟不那么敏感的“分布式事务”场景,而且相对于笨重的分布式事务,可能是更优的处理方式。
4.当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”,在下游有能力处理的时候,再进行分发。