一、消息可靠性
背景/需求:消息从发送,到消费者接收,会经历多个过程:
其中的每一步都可能导致消息丢失,常见的丢失原因包括:
发送时丢失:
生产者发送的消息【未送达exchange】——返回nack(消息确认模式)
消息【到达exchange】——返回ack(消息确认模式)
到达queue后,MQ宕机,queue将消息丢失
——返回ACK,及路由失败原因(回退模式)
consumer接收到消息后还未消费就宕机——消息持久化
1、【生产者】消息确认
RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。
返回结果有两种方式:
publisher-confirm,发送者确认
消息成功投递到交换机,返回ack
消息未投递到交换机,返回nack
publisher-return,发送者回执
消息投递到交换机了,但是没有路由到队列。返回ACK,及路由失败原因。
注意:确认机制发送消息时,需要给每个消息设置一个全局唯一id,以区分不同消息,避免ack冲突
2、AMQP核心概念
Server:又称Broker,接受客户端的连接,实现AMQP实体服务
Connection:连接,应用程序与Broker的网络连接
Channel:网络信道,几乎所有的操作都在Channel在进行,Channel是进行消息的读写的通道.客户端可建立多个Channel,每个Channel代表一个会话任务.
Message:消息,服务器与应用程序之间传送的数据,由Properties和Body组成.Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性;Body则就是消息体内容.
Virtual host:虚拟地址,用于进行逻辑分离,最上层的消息路由.一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue.
Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列.
Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
Routing key:一个路由规则,虚拟机可以用它来确定如何路由一个特定消息
Queue:也称Message Queue,消息队列,保存消息并将它们转发给消费者