专栏文章 MQ 学习笔记

飞天小子的性能课堂 · 2020年05月18日 · 最后由 飞天小子的性能课堂 回复于 2020年05月19日 · 4225 次阅读

MQ

mq 指的是消息队列。在数据结构中就是 “先进先出”。例如我们在超市买东西排队,先排到的先结账,这就是典型的先进先出。

MQ 常见名称

Broker
消息服务器,作为 server 提供消息核心服务
Producer
消息发布者,业务的发起方,负责生产消息传输给 broker,
Consumer
消息订阅者,业务的处理方,负责从 broker 获取消息并进行业务逻辑处理
Topic
主题,发布订阅模式下的消息统一汇集地,不同发布者发布不同的主题,由消息服务器分发到不同的订阅者,实现消息的广播
Queue
队列,某个发布者向指定 queue 发送消息,订阅者订阅特定的 queue 完成消息的点对点接收
Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

MQ 解决的问题

流量削峰

例如,电商平台在高峰期的时候可能一秒内最多处理 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 还能及时的得到异步处理成功的消息。简直是完美。

常见的 MQ 消息中间件

ActiveMQ、RabbitMQ,Kafka,RocketMQ

常见的 MQ 中间件协议

AMQP 协议,MQTT 协议,STOMP 协议,XMPP 协议

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

ActiveMQ:轻量级的,一般企业用的比较少
RabbitMQ:erlang 开发,高性能,高并发,支持集群模式,一般针对大并发需求要求比较多,支持 python、java、golang、ruby、c++ 等语言调用,官方文档完整,对接比较方便,且整个管理控制台很友好,但流控机制比较操蛋
Kafka:java 开发,性能强悍,支持持久化,大数据企业用的比较多,属于 apache 全家桶一员,官方未提供管理控制台,不过有开源的几个版本可以自己安装部署来管理集群
RocketMQ:java 开发,目前官网文档不是很完整,也支持高并发,有 java client,c++ 基本要自己封装,业务对接有一定成本,属于 apache 全家桶一员,控制台很烂

深度思考 回复

学习了,感谢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册