从零开始实现消息队列
- .
- 什么是消息队列
- 需求分析
- 核心概念
- 模型
.
什么是消息队列
相信大家都了解过阻塞队列和生产者消费者模型,而阻塞队列最大的用途,就是用于实现生产者消费者模型,生产者消费者模型有以下好处:
- 解耦合
解释:
当主机A给主机B发消息时,A给B发送请求,B给A返回响应,这样的场景中,A和B之间耦合性较高,但是如果在AB之间插入一个阻塞队列,在这种场景中,A发送的请求先存到阻塞队列中,B在接收来自A的请求的时候,取阻塞队列中取就行,就可以很好的解决AB之间的高耦合问题,避免了AB两个主机直接交互.
- 削峰填谷
当AB主机直接进行交互的时候,一旦用户访问量过高,可能主机A处理的业务比较轻松,因此不会出现太大的问题,但是主机B却承担着项目主要的工作,可能会因为业务过于超负荷,而导致主机B挂掉,而在有着阻塞队列的生产者消费者模型中,即使主机A接收了大量的用户请求,但是都会将其先放在阻塞队列中,主机B在这种情况下,依旧可以按照正常的状态进行工作.
在实际的后端开发中, 尤其是分布式系统里, 跨主机之间使用生产者消费者模型, 也是非常普遍的需求.因此, 我们通常会把阻塞队列, 封装成⼀个独立的服务器程序, 并且赋予其更丰富的功能.这样的程序我们就称为 消息队列 (Message Queue, MQ)
市面上成熟的消息队列有很多
• RabbitMQ
• Kafka
• RocketMQ
• ActiveMQ
今天,我们就仿照RabbitMQ,来模拟实现一个简单的消息队列
需求分析
核心概念
生产者(Producer)
消费者(Consumer)
中间者(Broker)阻塞队列
发布(Publish)生产者向中间者发送信息的过程
订阅(Subscribe)哪些消费者要从中间者这里获取数据,这个注册的过程就是订阅
消费(Consumer)消费者从中间者获取数据的动作
模型
由上述几个核心概念,构成了各种各样的生产者消费者模型,包括有一对一,一对多,多对多等
一个生产者,一个消费者
多个生产者,多个消费者
Broker是最核心的部分,负责消息的存储和转发
在Broker中,也是存在着以下几个概念
• 虚拟机 (VirtualHost): 类似于 MySQL 的 “database”, 是一个逻辑上的集合. 一个BrokerServer 上可以存在多个 VirtualHost.
• 交换机 (Exchange): 存在于VirtualHost,生产者把消息先发送到 VirtualHost的 Exchange 上. 再根据不同的规则, 把消息转发给不同的 Queue.
• 队列 (Queue): 真正用来存储消息的部分. 每个消费者决定自己从哪个 Queue 上读取消息.
• 绑定 (Binding): Exchange 和 Queue 之间的关联关系. Exchange 和 Queue 可以理解成 “多对多” 关系. 使用一个关联表就可以把这两个概念联系起来.
• 消息 (Message): 传递的内容.
这里的Exchange和Queue之间的关系可以类比生产者和消费者之间的关系
这些概念, 既需要在内存中存储, 也需要在硬盘上存储.
• 内存存储: 方便使用.
• 硬盘存储: 重启数据不丢失.