RabbitMQ消息确认与消息重新入队
RabbitMQ消息确认与消息重新入队
你我他有个梦 发表于1年前
RabbitMQ消息确认与消息重新入队
  • 发表于 1年前
  • 阅读 5838
  • 收藏 87
  • 点赞 1
  • 评论 16

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 介绍消息ack的原理,basicNack、basicReject、basicRecover之间的区别

消息确认

当生产者投递消息到消费者broker会立即从内存中将消息删除,在这种情况下,杀掉一个消费者将会丢失消息。

为了确认消息不会丢失,rabbitmq支持message acknowledgments。一个ACK的响应会从消费端返回,告诉rabbitmq一个特定的消息已被接收。

当rabbitmq空闲时会处理它,将它删除。

如果一个消费者挂掉(channel被关闭、connection被关闭或者TCP 连接被关闭)而没有发送ACK,那么rabbitmq会让这个消息重新入队。

如果在同一时间内有其他的消费者连接了,他快被快速的投递到其他的消费者那。即使工作者偶尔挂掉,这种方式下也可以确定没有消息会丢失。

没有任何的消息超时,当消费者挂掉,rabbitmq将重新投递这些消息。对于处理一个消息需要非常非常长的时间也没关系因为不会超时。

消息的ack默认是打开的,默认标记是autoAck=true,当完成了任务得到了ack响应那么可以删除掉这个标记,也就是autoAck=false。

示例代码在官网有详细的说明:http://www.rabbitmq.com/getstarted.html,第二个选项 Work queues页中有Message acknowledgment,选择自己对应的语言即可。

消息重新入队

basicRecover:是路由不成功的消息可以使用recovery重新发送到队列中。


basicReject:是接收端告诉服务器这个消息我拒绝接收,不处理,可以设置是否放回到队列中还是丢掉,而且只能一次拒绝一个消息,官网中有明确说明不能批量拒绝消息,为解决批量拒绝消息才有了basicNack。

basicNack:可以一次拒绝N条消息,客户端可以设置basicNack方法的multiple参数为true,服务器会拒绝指定了delivery_tag的所有未确认的消息(tag是一个64位的long值,最大值是9223372036854775807)。

示例代码:

官网中有明确的代码示例:http://www.rabbitmq.com/nack.html

API结合具体的业务应用。

共有 人打赏支持
你我他有个梦
粉丝 91
博文 109
码字总数 98629
评论 (16)
leeyi
如果有PHP或者Python的代码示例说明,就更好了
六月是你的谎言
Yo!!
12叔
说的太简单了
robotZhihu
0
心无一尘
学习一下0
心无一尘

引用来自“12叔”的评论

说的太简单了

还行的
xuanskyer
rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
你我他有个梦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
你要确定消息是否发送到了队列中并且已经ack,这时候消费者断开重连是肯定可以接收到的
心尖偏左
有代码示例就更好了
superchris
真的是太草率了。。。
小九酒
nice
笔记本
http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
逝去的回忆

引用来自“笔记本”的评论

http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
你写的那是些啥啊,一个基础写出来还不如不写,真是的。。。
你我他有个梦
代码建议参考官网的,官网中都有基础示例代码
JM衣领
你好! 请教一个关于消息重新入队的问题,新版本消费重新入队机制是放在原始位置并立马推送至其他消费端,以前的老版本是放在队列的最后。
新版中 如果当前一个消费者,消费端处理异常将当前消息重新入队,然而这个消息会一直不断的推送给自己 ,请问是否有机制处理的? 期待您的解答,先谢谢了。
陈亦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
持久化包括:exchange, queue, message。三者都要持久化。
×
你我他有个梦
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: