RabbitMQ如何保证消息的可靠性

在了解RabbitMQ消息可靠性之前,先来了解一下RabbitMQ整个消息投递的路径:

producer ——> exchange ——> queue ——> consumer

RabbitMQ保证消息的可靠性主要分为两个部分:

(1)消息投递(生产者向MQ发送消息,确保MQ接收到消息)

(2)消息确认(消费者签收消息)

1、消息投递

在使用RabbitMQ的时候,作为消息发送方拒绝任何消息丢失或者投递失败场景,RabbitMQ为我们提供了两种方式来保证消息的投递可靠性。

  • confirm确认模式
  • return退回模式

confirm确认模式

(1)消息从producer——>exchange,会回调confirmCallback,重写confirm方法有3个参数:

correlationData:相关配置信息

ack:exchange交换机是否成功收到信息,true成功,false失败

cause:失败原因

RabbitMQ如何保证消息的可靠性_第1张图片

return退回模式

消息从exchange——>queue,当交换机到队列路由失败时才会执行returnCallback 

步骤:

RabbitMQ如何保证消息的可靠性_第2张图片

代码: 

RabbitMQ如何保证消息的可靠性_第3张图片

2、消息确认

Consumer ack 消费者确认

ack指Acknowledge,确认,表示消费者收到消息后的确认方式。

有3种确认方式:

  • 自动确认:acknowledge="none"
  • 手动确认:acknowledge="manual"
  • 根据异常情况确认:acknowledge="auto"

其中自动确认是指,一旦消息被consumer收到,则自动确认收到,并将相应的message从RabbitMQ缓存中移除,但在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如果设置了手动确认模式,则在业务处理成功后,调用channel.basicAck()手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。

步骤: 

RabbitMQ如何保证消息的可靠性_第4张图片

代码:

RabbitMQ如何保证消息的可靠性_第5张图片

你可能感兴趣的:(rabbitmq,分布式,java)