RabbitMQ如何保证消息的发送和接收

一、RabbitMQ如何保证消息的发送和接收

1.ConfirmCallback方法

ConfirmCallback是一个回调接口,消息发送到broker后触发回调,确认消息是否到达broker服务器,也就是只确认消息是否正确到达Exchange交换机中。

2.ReturnCallback方法

通过实现ReturnCallback接口,启动消息失败返回,此接口是在交换机路由不到队列时触发回调,该方法可以不使用,因为交换机和队列是在代码里绑定的,如果消息投递到broker后几乎几乎不存在绑定队列失败,除非你代码写错了。

3.消息确认接收

RabbitMQ消息确认机制ack是默认自动确认的,自动确认会在消息发送给消费者后立即确认,但存在消息丢失的可能,如果消费逻辑出现异常,假如回滚了,也只是保证了数据一致性,但是消息还是丢了,也就是消费端没有成功处理这个消息,相当于消息丢失。

消费者收到消息后,手动调用Basic.ack或Basic.Nack或Basic.Reject后,RabbitMQ收到这些消息后,才认为本次投递完成。

Basic.ack 用于确认当前消息,Basic.Nack 用于否定当前消息 ,Basic.Reject 用于拒绝当前消息

Nack ,Reject 后有能力要求是否requeue消息或进入死信队列。

1.1 生产时消息重复

由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。这时候生产者就会重新发送一遍这条消息。

生产者中如果消息未被确认,或确认失败,我们可以使用定时任务+(redis/db)来进行消息重试。

1.2消费时消息重复

消费者消费成功后,再给MQ确认的时候出现了网络波动,MQ没有接收到确认,为了保证消息被消费,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息。

让每个消息携带一个全局的唯一ID,即可保证消息的幂等性,具体消费过程为:

  1. 消费者获取到消息后先根据id去查询redis/db是否存在该消息

  1. 如果不存在,则正常消费,消费完毕后写入redis/db

  1. 如果存在,则证明消息被消费过,直接丢弃。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RabbitMQ是一个开源的消息中间件,可以提供可靠的消息传输机制。它可以通过多种方法来确保消息发送接收。 首先,RabbitMQ使用AMQP(Advanced Message Queuing Protocol)作为消息传输协议,该协议具有可靠性和可靠发布确认机制,可以确保消息的成功发送。当消息发送时,发送者将收到一个确认,表示消息已被接收并成功传输给队列。如果发送者未收到确认,它可以重新发送消息或采取其他措施来确保消息发送。 其次,RabbitMQ提供了持久化机制,可以确保即使在服务器故障或重启之后,消息也能够被正确地传递。发送者可以将消息标记为持久性,这样即使服务器发生故障,消息也不会丢失,当服务器恢复正常运行时,消息将被正确地传递给接收者。 此外,RabbitMQ使用队列来存储消息发送者将消息发送到队列中,接收者从队列中获取消息进行处理。这种机制可以确保消息的顺序性传递,即先发送消息将先被接收和处理,这样可以保证消息的正确性和一致性。 另外,RabbitMQ还提供了一些其他机制来确保消息发送接收。例如,可以设置消息的过期时间,如果消息在指定的时间内没有被接收,则会被RabbitMQ删除。还可以设置消息的优先级,确保重要的消息能够优先被处理。 总之,RabbitMQ通过使用AMQP协议、持久化机制、队列、消息的过期时间和优先级等多种机制,可以确保消息的可靠发送接收。无论是在普通的消息传递,还是在分布式系统中,RabbitMQ都是一个可靠的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wy971744839

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值