RabbitMQ 高可用之如何确保消息成功消费(1)

本文介绍了RabbitMQ中确保消息成功消费的两种方式:自动确认和手动确认。在自动确认模式下,消息默认会被立即删除。而在手动确认模式下,消费者需要显式发送确认信号。文中详细阐述了手动确认的推模式和拉模式,并提供了示例代码。此外,还讨论了消息拒绝和消息确认的细节,包括basicAck和basicNack方法的使用。最后,提到了消息重复消费和幂等性问题的解决策略。
摘要由CSDN通过智能技术生成
  • 拉(pull):消费者主动从 MQ 拉取消息,这种方式效率并不是很高,不过有的时候如果服务端需要批量拉取消息,倒是可以采用这种方式。

两种方式我都举个例子看下。

先来看推(push):

这种方式大家比较常见,就是通过 @RabbitListener 注解去标记消费者,如下:

@Component

public class ConsumerDemo {

@RabbitListener(queues = RabbitConfig.JAVABOY_QUEUE_NAME)

public void handle(String msg) {

System.out.println("msg = " + msg);

}

}

当监听的队列中有消息时,就会触发该方法。

再来看拉(pull):

@Test

public void test01() throws UnsupportedEncodingException {

Object o = rabbitTemplate.receiveAndConvert(RabbitConfig.JAVABOY_QUEUE_NAME);

System.out.println("o = " + new String(((byte[]) o),“UTF-8”));

}

调用 receiveAndConvert 方法,方法参数为队列名称,方法执行完成后,会从 MQ 上拉取一条消息下来,如果该方法返回值为 null,表示该队列上没有消息了。receiveAndConvert 方法有一个重载方法,可以在重载方法中传入一个等待超时时间,例如 3 秒。此时,假设队列中没有消息了,则 receiveAndConvert 方法会阻塞 3 秒,3 秒内如果队列中有了新消息就返回,3 秒后如果队列中还是没有新消息,就返回 null,这个等待超时时间要是不设置的话,默认为 0。

这是消息两种不同的消费模式。

如果需要从消息队列中持续获得消息,就可以使用推模式;如果只是单纯的消费一条消息,则使用拉模式即可。切忌将拉模式放到一个死循环中,变相的订阅消息,这会严重影响 RabbitMQ 的性能。

2. 确保消费成功两种思路


上篇文章中,我们想尽办法确保消息能够发送成功,对于消息消费成功,其实官方提供了相关的机制,我们一起来看下。

为了保证消息能够可靠的到达消息消费者,RabbitMQ 中提供了消息消费确认机制。当消费者去消费消息的时候,可以通过指定 autoAc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值