模型基本对象
rabbitmq模型的基本对象有四种,分别是:producer、exchange、queue、consumer。
这里介绍下exchange。rabbitmq消息模型的核心思想是:生产者不会直接把消息发送给队列,队列和消息直接是通过媒介来进行接触的,这个媒介就是exchange。excahnge。exchange知道如何处理消息,并把消息发送给队列。rabbitmq把消息的分发逻辑独立了出来,使得生产者和队列更加独立单纯,界限更加清晰。exchange总共有四种,分别为direct、topic、headers和fanout。
客户端表现
在rabbitmq的客户端,使用channel在操作队列,所以要优先获取channel对象。
一般情况下,客户端的步骤如下:
- 创建连接池对象。
- 设置连接参数,并获取一个连接。
- 从连接中获取channel作为操作对类的对象。
- 创建queue或者exchange。
- 如果为生产者,则发送消息;如果为消费者,则设置处理消息逻辑,并等待消息。
- 如果为生产者,需要手动关闭channel和连接。
几种队列
- 基本队列模型
图片中没有exchange,但是根据exchange的介绍,rabbitmq的模型应该都是有exchange的,这里应该是对模型做了简化。
- 发布者-订阅者模型
- 路由队列
- 主题队列
主题是路由的加强版
如何确保消息不丢失
rabbitmq使用了两种机制来保证消息不丢失,分别是消息确认机制和持久化,如下:
- 消息确认
消息确认机制主要为了防止消费者出现故障导致的消息丢失,如消费者接收消息后发生处理异常的情况。使用消息确认前,先要设置消费者不是主动消息确认(autoAck=false),并在每次处理完消息后手动调用消息确认方法,通知rabbitmq此条消息处理完毕,rabbitmq就会把这条消息从队列中删除。
假如消费者线程终止,但是未发送ack,又会怎么样呢?rabbitmq会有两种处理机制,如果当时有其他消费者存在,则把这条消息分发给他;如果没有其他消费者存在,则这条消息会重新进入队列进行排队。这样的处理还是比较灵活的。
- 持久化
rabbitmq中的消息是保存在内存中的,所以消息丢失后无法还原的情况下,最好把消息持久化保存下来。当然持久化必然会消耗一定的性能,是否需要持久化要看具体业务情况。持久化需要对队列和消息共同做持久化标记,另外只能对新队列做持久化标记,已经存在的队列不能再进行持久化了,这点要注意。