文档章节

RabbitMQ消息确认与消息重新入队

你我他有个梦
 你我他有个梦
发布于 2016/07/15 08:46
字数 568
阅读 8443
收藏 88

消息确认

当生产者投递消息到消费者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结合具体的业务应用。

© 著作权归作者所有

共有 人打赏支持
你我他有个梦

你我他有个梦

粉丝 95
博文 110
码字总数 98858
作品 0
昌平
程序员
私信 提问
加载中

评论(16)

陈亦
陈亦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
持久化包括:exchange, queue, message。三者都要持久化。
J
JM衣领
你好! 请教一个关于消息重新入队的问题,新版本消费重新入队机制是放在原始位置并立马推送至其他消费端,以前的老版本是放在队列的最后。
新版中 如果当前一个消费者,消费端处理异常将当前消息重新入队,然而这个消息会一直不断的推送给自己 ,请问是否有机制处理的? 期待您的解答,先谢谢了。
你我他有个梦
你我他有个梦
代码建议参考官网的,官网中都有基础示例代码
逝去的回忆
逝去的回忆

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

http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
你写的那是些啥啊,一个基础写出来还不如不写,真是的。。。
笔记本
http://blog.csdn.net/movie0125 我的博客中有python代码示例,大家可以看看
小九酒
小九酒
nice
superchris
superchris
真的是太草率了。。。
心尖偏左
心尖偏左
有代码示例就更好了
你我他有个梦
你我他有个梦

引用来自“xuanskyer”的评论

rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
你要确定消息是否发送到了队列中并且已经ack,这时候消费者断开重连是肯定可以接收到的
xuanskyer
xuanskyer
rabbitmq的持久化熟悉么,我试了下开启持久化,消费者断开重新连的化,之前的消息并没有接收到
RabbitMQ消息超时时间、队列消息超时时间、队列超时时间

一、为队列设置消息TTL TTL是 Time-To-Live 的缩写,指的是存活时间,RabbitMQ可以为每个队列设置消息的超时时间。 代码中声明如下: 只要给队列设置x-message-ttl 参数,就设定了该队列所有...

哲别0
07/03
0
0
RabbitMQ与Redis做队列比较

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,...

Edwyn王
2015/05/20
0
0
RabbitMQ与Redis队列对比

本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比 具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,...

凯文加内特
2015/05/20
0
0
基于 RabbitMQ 构建一个类似 Resque 的作业处理系统

RabbitMQ的是一个复杂的野兽。 它灵活,强大,但也很难完全把控和掌握。 许多不同的使用情况和使用模式都可以建立在这个强大的软件之上,但在第一次尝试为一个特定的解决方案编写代码时,差错...

oschina
2014/10/15
3.4K
2
RabbitMQ中的工作队列(work queues)

工作队列的设计思想:避免立即执行资源密集型任务。 我们将任务封装为消息并将其发送到队列,消费者从队列中取出任务并执行任务。当我们开启了多个消费者的时候,任务将在他们之间共享。 循环...

m0_37884977
05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部