有道无术,术尚可求,有术无道,止于术。
MQ是Message Queue消息队列的首字母缩写。是指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递,生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。
一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。
在当前互联网的业务场景下,比如商品秒杀,在较短时间内,瞬时涌入大量请求,这个时候系统资源可能会耗尽,造成服务器瘫痪。
可以使用消息队列来缓冲瞬时流量,通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
例如下图中,A系统每秒只能处理1000个请求,但是某个瞬时请求达到5000每秒,这个时候将导致A系统并发过高,甚至系统奔溃。

使用了MQ之后,限制消费消息的速度为1000每秒,这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000每秒,直到消费完积压的消息,这就叫做“填谷”。

以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。
当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性。

有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完。
一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个回调接口, B 执行完之后调用 api 通知 A 服务。
这两种方式都不是很优雅,使用MQ,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供回调接口。同样B 服务也不用做这些操作。A 服务还能及时的得到异步处理成功的消息。

MQ消息通信模型,主要实现方式分为两种:JMS和AMQP。
JMS 即JAVA Message Service。是 Java 平台上有关面向消息中间件的技术规范,它便于消息系统中的 Java 应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。
JMS提供了两种消息模型
Point-to-Point(P2P) :点对点
Publish/Subscribe(Pub/Sub): 发布/订阅
涉及概念:
点对点模式消息将发送到一个队列,该队列的消息只能被一个消费者消费。
特点:
多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
涉及概念:
特点:
AMQP全称为Advanced Message Queuing Protocol(高级消息队列协议),是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。总而言之,是一个进程间传递异步消息的网络协议。
在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题,兼容JMS。
特性:
direct,fanout,topic,headers,system。AMQP和JMS的主要区别:
Java语言产生的消息,可以用其他语言比如python的进行消费。http来进行类比,不关心实现接口的语言,只要都按照相应的数据格式去发送报文请求,不同语言的client可以和不同语言的server进行通讯。ActiveMQ是Apache开源,完全支持J2EE规范的消息中间件。
优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据。
缺点:官方社区现在对 ActiveMQ 5.x 维护越来越少,高吞吐量场景较少使用。
官网介绍:Kafka是一个开源的分布式事件流平台(Event StreamingPlatform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。
一般理解为一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
优点:
缺点:
RocketMQ 出自阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog 分发等场景。
优点:
缺点:
2007 年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
优点:
优点:
