RabbitMQ如何保证消息发送、消费成功

3 篇文章 0 订阅

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受。

目录

1.发送确认机制设置

2.消息丢失、非信任或失败

3.消息重复消费

 4.消费成功通知

5.总结

消息因为其:削峰,异步,解耦的特性,被很多公司的很多工程师所用。RabbitMQ 为MQ实现的中间件之一,是如何保证消息发送成功,并且消费成功的呐?

1.发送确认机制设置

要得到rabbitmq发送消息被接收并且消费成功,必须是设置confirm 模式,即设置信道需要为 confirm 信任模式,则所有在信道上发布的消息都会分配一个唯一 ID(也可以根据业务情况手动分配一个messageID),消息被投递到exchange交换机,再投递给消费者,在消费者消费成功确认后,会给生产者(包含消息唯一ID)返回确认信息,告知生产者,消息消费成功。

信道信任确认模式配置如下图所示:

2.消息丢失、非信任或失败

如果 RabbitMQ发生内部错误从而导致消息丢失,消息消息者就会接收不到消息;如果消息的信息ID为空,会发送一条ack消息给生产者为非信任消息。

如果消息被消费失败,则会告知生成者,消息消费失败,会被nack给rabbitmq,消息信息会在次返回到队列中,不会被清除,信道处理消息返回队列设置如下:

所有被发送的消息都将被 ack 或者被nack一次。但是没有对消息被ack 或nack 的快慢做任何保证,并且同一条消息不会既被 ack又被nack。

3.消息重复消费

消息在没有做好控制的情况下,可能会重复消费,所以需要判断是否重复消费

 4.消费成功通知

消息在被消费成功之后,会告诉rabbitmq,生产者发送的消息,已经被我成功消费了。

5.总结

5.1.发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者,生产者的回调方法会被触发。
5.2 ConfirmCallback接口:只确认是否正确到达 Exchange 中,成功到达则回调。
5.3 ReturnCallback接口:消息失败返回时回调。
5.4 消费者在声明队列时,可以指定noAck参数,当noAck=false时,rabbitmq会等待消费者显式发回ack信号后才从内存(或者磁盘,持久化消息)中移去消息。否则,消息被消费后会被立即删除5.5 消费者接收每一条消息,处理完业务逻辑后须进行确认,只有消费者确认了消息,rabbitmq才能安全地把消息从队列中删除。
5.6 rabbitmq不会为未ack的消息设置超时时间,它判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。这么设计的原因是rabbitmq允许消费者消费一条消息的时间可以很长。保证数据的最终一致性;
5.7 极端情况下,如果消费者返回ack之前断开了链接,rabbitmq会重新分发给下一个订阅的消费者,这样可能存在重复消费,需要在编码的时候特别注意。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RabbitMQ是一种开源的消息中间件工具,用于在分布式系统之间进行高效可靠的消息传递。 在RabbitMQ中,发送消息是一个非常简单的过程。首先,我们需要创建一个连接到RabbitMQ的连接;然后,通过该连接创建一个通道来执行消息传递操作。 下一步是声明一个消息队列,消息将被发送到这个队列中,并且接收者将从同一个队列中接收消息。我们可以使用`channel.queueDeclare()`方法来声明队列,并指定队列的名称、是否持久化等参数。 接下来,我们可以使用`channel.basicPublish()`方法来向队列发送消息。该方法需要指定交换机的名称、队列的名称、消息的正文,以及一些其他的属性。 当消息发送到队列后,它会等待接收者来获取并处理这些消息。使用RabbitMQ提供的消费者模式,我们可以编写一个消费者程序,从队列中获取消息,并执行我们定义的处理逻辑。消费者程序可以使用`channel.basicConsume()`方法来从队列中获取消息,并指定处理消息的逻辑函数。 最后,我们需要关闭RabbitMQ连接和通道。可以使用`channel.close()`和`connection.close()`方法来关闭通道和连接。 通过以上步骤,我们可以简单地使用RabbitMQ发送消息RabbitMQ提供了强大的可靠性和灵活性,可以在分布式系统中实现高效的消息传递。 ### 回答2: RabbitMQ是一种开源的消息中间件,用于在分布式系统中进行消息传递。它遵循AMQP(高级消息队列协议)标准,同时提供了多种客户端库,可以用于不同编程语言进行消息发送和接收。 在使用RabbitMQ发送消息时,首先需要创建一个连接,然后创建一个通道。通道是消息传递的通道,每个通道可以用于发送或接收消息。创建通道后,可以使用该通道的方法来发送消息。 首先需要指定消息的目标队列,可以使用队列的名称来指定。如果目标队列不存在,可以使用`channel.queueDeclare()`方法来声明创建队列。在发送消息前,还可以使用`channel.exchangeDeclare()`来声明交换机(Exchange),根据需要进行绑定或者配置交换机的属性。 完成了队列和交换机的声明后,可以使用`channel.basicPublish()`方法来发送消息。该方法需要指定交换机的名称(可选,如果没有指定则使用默认的交换机)、目标队列的名称、消息的属性和消息的内容。方法调用成功后,消息发送到指定的队列或交换机中。 发送消息后,RabbitMQ会异步地将消息传递给消费者,消费者可以使用订阅该队列的方式来消费消息消费者可以通过订阅队列的方式来接收消息,也可以通过`channel.basicConsume()`方法来主动拉取消息,或者使用其他高级功能来消费消息。 总结来说,使用RabbitMQ发送消息的流程包括:创建连接和通道、声明队列和交换机、发送消息。通过这个简单的流程,可以实现分布式系统中的消息传递和异步通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值