从零开始实现消息队列(二)
从零开始实现消息队列
- .
- 核心API
- 交换机类型
- 持久化
- 网络通信
- Connection和Channel
- 消息应答
- 模块划分
.
核心API
对于Broker来说,要实现以下核心API,通过这些API来实现消息队列的基本功能.
- 创建队列(queueDeclare)
- 销毁队列(queueDelete)
- 创建交换机(exchangeDeclare)
- 销毁交换机(exchangeDelete)
- 创建绑定(queueBind)
- 解除绑定(queueUnbind)
- 发布消息(basicPublish)
- 订阅消息(basicConsume)
- 确认消息(basicAck)
Producer和Consumer则通过网络的方式,远程调用这些API,实现生产者消费者模型
对于RabbitMQ而言,VirtualHost也只是可以进创建和删除,但是我们这里就不实现了
交换机类型
对于 RabbitMQ而言,交换机有以下四种类型
- Direct,生产者发布消息时,直接指定被该交换机绑定的队列名
- Fanout,生产者发送的消息会被复制到该交换机上的所有队列中
- Topic,绑定队列到交换机上时,指定一个字符串为bindingKey,发送消息指定一个字符串为routingKey,当bindingKey和routingKey满足一定的匹配条件的时候,则把消息投递到指定队列中
- Header
其中header比较复杂,我们这里就不进行实现了,并且常见的也就只有前三种
持久化
Exchange,Queue,Binding,Message都有持久化需求,要保证程序重启和主机重启过后,上述内容不会丢失.
网络通信
生产者和消费者都是客户端,Broker是服务器,客户端和服务器之间是通过网络进行通信的,在网络通信的过程中,客户端部分要提供对应的API,来实现对服务器的操作
- 创建Connection
- 关闭Connection
- 创建Channel
- 关闭Channel
- 加上Broker服务器有的所有API
Connection和Channel
Connection对应一个TCP连接.
Channel则是Connection中的逻辑通道.
一个Connection中可以包含多个Channel.
Channel和Channel之间的数据是独立的,不会相互干扰
这样的设计是为了避免频繁的创建关闭TCP连接,达到长连接的效果
消息应答
被消费的消息,需要进行应答
应答模式分为两种:
- 自动应答:消费者只要消费了消息,就算应答完毕了,Broker就会直接删除这个消息
- 手动应答:消费者需要手动调用应答接口,Broker接收到了应答请求之后,才会对这个消息进行删除(可靠性更高)