文档章节

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

你我他有个梦
 你我他有个梦
发布于 2016/07/15 08:46
字数 568
阅读 7796
收藏 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结合具体的业务应用。

© 著作权归作者所有

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

你我他有个梦

粉丝 93
博文 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与Redis做队列比较

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

Edwyn王
2015/05/20
0
0
RabbitMQ消息超时时间、队列消息超时时间、队列超时时间

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

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

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

凯文加内特
2015/05/20
0
0
RabbitMQ中的工作队列(work queues)

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

m0_37884977
05/17
0
0
python使用rabbitMQ介绍二(工作队列模式)

一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收。在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者。 这时mq实现了一下几个功能: rabbitmq循环调度...

MyStitch
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
34分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
37分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
41分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
50分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部