文章目录
一、项目背景
什么是消息队列?
消息队列就是,基于阻塞队列,封装成一个独立的服务器程序,实现跨主机使用生产者-消费者模型。生产者生产消息到消息队列,消费者从消息队列消费数据。
二、需求分析
1.核心概念
- 生产者(Producer):生产消息的客户端
- 消费者 (Consumer) :消费消息的客户端
- 中间人 (Broker):消息队列服务器
- 发布 (Publish):生产者发送消息给中间人
- 订阅 (Subscribe) :要消费消息的消费者
- 消费 (Consume):消费者从中间人读取消息
Producer Client:生产者客户端
Broker Server:消息队列服务器
Consumer Client:消费者客户端
Publish Message:生产消息
Subscribe Messge:订阅消息
2.BrokerServer核心组件
- 虚拟主机(VirtualHost):类似于MySQL的dataBase,用来区分不同组的业务。
- 交换机(Exchange):生产者发送消息给BrokerServer,实际上是给某个交换机发送消息,交换机再把消息转发给队列。
- 队列(Queue):存储消息
- 绑定(Binding):交换机和队列之间的绑定关系(多对多)
- 消息(Message):传递的内容
3.核心API
- 创建交换机(exchangeDeclare)
- 删除交换机(exchangeDelete)
- 创建队列(queueDeclare)
- 删除队列(queueDelete)
- 创建绑定(queueBind)
- 删除绑定(queueUnbind)
- 发布消息(basicPublish)
- 订阅消息(basicConsume)
注意,消费者得到服务器中的消息有两种方式:
一种是消费者主动从服务器中取。
一种是服务器推送消息给消费者。这里的订阅消息,只支持服务器推送消息给消费者。
- 确认消息(basicAck)
消费者主动告诉消息队列已经收到消息了。(成功确认)
4.交换机类型
- 直接交换机 (Direct Exchange)
根据队列名查找队列,如果存在,转发消息;不存在,就把消息丢弃。 - 扇出交换机(Fanout Exchange)
转发消息至该交换机绑定的所有队列。 - 主题交换机(Topic Exchange)
交换机和队列绑定的时候,绑定关系中带有一个bindingKey(上联)。发送消息的时候,消息带有一个routingKey(下联)。在该交换机绑定的所有队列中查找,如果routingKey和bindingKey对上的话,就转发给该队列。没有,就丢弃消息。
5.持久化
当服务器重启后,内存的数据都会丢失。这个时候,需要通过持久化来保证数据不丢失。通过将数据保存到硬盘上来实现持久化。
- 交换机、队列、绑定通过数据库来管理
- 消息通过二进制的格式保存到文件中,重启后,从文件中读取数据到内存。
(序列化/反序列化)
6.网络通信
生产者和消费者都是客户端,需要通过网络与服务器进行交互。这里的通信协议是基于TCP的自定义应用层协议。
在网络通信过程中,客户端要提供对应API,通过调用这个API来远程调用服务器的API,实现对服务器的操作。
客户端这边除了对应服务器的方法外,还需要实现其他的方法。
- 创建Connection(newConnection)
- 销毁Connection(close)
一个Connetion对象视作一次TCP连接。
- 创建Channel (createChannel)
- 销毁Channel(close)
Channel是一次逻辑上的连接。一个Connection里包含多个Channel。连接/断开TCP的成本太高。但是客户端和服务器的交互业务很多,所以通过多个Channel,传输不同的数据(channel之间互不相干),达到复用TCP的效果。
7.消息应答
- 服务器推送消息给消费者的时候,自动确认。
- 消费者手动调用basicAck这个方法。