概念
这里的消息队列, 大致上就是一个生产者消费者模型.
我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的
需求分析
有几个核心的概念:
- 生产者(Producer)
- 消费者(Consumer)
- 中间人(Broker)
- 发布(Publish) :生产者向中间人投递消息的过程
- 订阅(Subcribe) :记录哪些消费者要从中间人这里取数据
- 消费(Consume): 消费者从中间人这里取数据的过程
上面是大概的一个流程, 但在消息队列中生产者和消费者远远不止一个
BrokerServer
内部关键概念
1. 虚拟主机(VirtualHost): 类似于MySQL 中的 database, 是一个逻辑上的数据集合
2. 交换机(Exchange): 生产者把消息投递给 Broker Server, 实际上是把消息交给 了 BrokerServer 上的某一个交换机, 再有交换机把消息转发给对应的队列
3. 队列(Queue): 真正用来存储处理消息的实体, 消费者也是从队列中取出数据
4. 绑定(Binding): 把交换机和队列中间, 绑定起关联关系, 交换机和队列之间类似与 与数据库中的 "多对多" 的关系
5. 消息(Message): 服务器 A 给 B 发送的请求就是一个消息, 服务器 B 给 A 发送的响应也是一个消息, 一个消息可以视为一个字符串(二进制数据), 具体包含的数据就得看业务场景
重要的属性
交换机(Exchange)
1. name: 一个作为标识的字符串, 相当于主键
2. type: 交换机有以下几种类型:
Direct 直接交换机:
生产者发送消息的时候, 会指定一个"目标队列"的名字, 交换机收到后, 就会看看绑定的队列里有没有匹配的队列, 有就转发过去, 没有就丢弃消息
Fanout: 扇出交换机:
将与该交换机绑定的所有队列都发送一份一样的消息
Topic: 主题交换机:
有两个关键概念: routingKey 和 bindingKey.
routingKey 在 Message 手里, bindingKey 在 Binding 手里
说白了他们就是两个字符串, 如果这两个字符串通过一些匹配规则匹配上了就能够将消息发送给对应绑定的队列手里
3. durable: 是否持久化, 意思就是会不会保存在硬盘中
队列(MSGQueue)
1. name: 标识符
2. durable: 是否持久化
绑定(Binding)
1. ExchangeName
2. QueueName
Binding 主要就是靠 exchange 和 queue 直接的联系而存在的, 因此由这个两个进行定义
3. durable: 是否持久化
4. bindingKey: 匹配符, 上面有介绍
消息(Message)
1. MessageID 标识符
2. body 消息主体内容
3. durable 是否持久化
4. offsetBeg 消息在硬盘中头的偏移量
5. offsetEnd 消息在硬盘中尾的偏移量
这个两个偏移量就能很好的找到消息在硬盘中的位置
6. routingKey 匹配符