mq 指的是消息队列。在数据结构中就是 “先进先出”。例如我们在超市买东西排队,先排到的先结账,这就是典型的先进先出。
Broker
消息服务器,作为 server 提供消息核心服务
Producer
消息发布者,业务的发起方,负责生产消息传输给 broker,
Consumer
消息订阅者,业务的处理方,负责从 broker 获取消息并进行业务逻辑处理
Topic
主题,发布订阅模式下的消息统一汇集地,不同发布者发布不同的主题,由消息服务器分发到不同的订阅者,实现消息的广播
Queue
队列,某个发布者向指定 queue 发送消息,订阅者订阅特定的 queue 完成消息的点对点接收
Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
例如,电商平台在高峰期的时候可能一秒内最多处理 1 万笔订单。如果业务量达到 2 万笔,那么只有两种可能:要么挤爆服务器,要么程序控制不允许超出 1 万。
但是呢,如果我们用消息队列做个缓冲,就可以把超出一万的业务消息全部存储在消息服务器中,然后在一个时间段内去处理。对于用户的感受无非就是多等了几秒钟。总比不能下单的体验要好。
消息分发又分为两部分:消息发布和消息订阅
例如:A 发布一个消息主题之后,不论 B 还是 C 还是 D 都可以去订阅它。如果没有这种分发机制的话,bcd 在想要订阅 a,a 就得改代码去调用 bcd 的服务。。。
有了消息队列后,A 只管发送一次消息,BCD 只需要监听消息就可以了。A 服务作为基础服务完全不需要对代码有改动。
有些服务间调用是异步的。例如 A 调用 B,B 的执行时间很长,但是 A 想知道 B 什么时候可以执行完。一般有两种方式
1:A 每隔一段时间就去调用 B 的查询接口,查询一次结果;
2:A 提供一个 api,B 执行完之后调用 api 通知 A 已经完成;
这两种方法都不是很可靠
有了 MQ 之后,MQ 就可以作为一个消息中间件,监听 B 处理完的消息,然后分发给 A。这样一来,A 不用反复调用 B 的接口,也不用给 B 提供接口
A 还能及时的得到异步处理成功的消息。简直是完美。
ActiveMQ、RabbitMQ,Kafka,RocketMQ
AMQP 协议,MQTT 协议,STOMP 协议,XMPP 协议