RabbitMQ:消息应答与消息持久化

9824247-dbd6b84206381f8e.jpg

在正式的生产环境中,我们不想丢失任何任务,如果有一个消费者挂掉了,那么我们应该将分发给它的任务交付给另一个消费者去处理。 为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ可以删除它了。
那么如何设置RabbitMQ为手动应答模式呢?

1、Message acknowledgment(消息应答)

 boolean autoAck = false;  
 channel.basicConsume(QUEUE_NAME, autoAck, consumer);   
  • boolean autoAck = true;(自动确认模式)一旦RabbitMQ将消息分发给了消费者,就会从内存中删除。在这种情况下,如果杀死正在执行任务的消费者,会丢失正在处理的消息,也会丢失已经分发给这个消费者但尚未处理的消息。
  • boolean autoAck = false; (手动确认模式) 我们不想丢失任何任务,如果有一个消费者挂掉了,那么我们应该将分发给它的任务交付给另一个消费者去处理。 为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ可以删除它了。
  • 消息应答是默认打开的。也就是boolean autoAck =false;

2、Message durability(消息持久化)

我们已经了解了如何确保即使消费者死亡,任务也不会丢失。但是如果RabbitMQ服务器停止,我们的任务仍将失去!当RabbitMQ退出或者崩溃,将会丢失队列和消息。除非你不要队列和消息。两件事儿必须保证消息不被丢失:我们必须把“队列”和“消息”设为持久化。

boolean durable = true;  
channel.queueDeclare("hrabbit_queue_work", durable, false, false, null); 

这里有一点需要注意的问题,我们直接把durable的false改成true就可以了吗?因为我现在运行的程序中已经存在了hrabbit_queue_work这个队列,当我再次执行的时候,会抛出如下的异常

channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'hrabbit_queue_work'

尽管这行代码是正确的,他不会运行成功。因为我们已经定义了一个名叫hrabbit_queue_work的未持久化的队列。RabbitMQ不允许使用不同的参数设定重新定义已经存在的队列,并且会返回一个错误。 一个快速的解决方案——就是声明一个不同名字的队列,比如task_queue。或者我们登录控制台将队列删除就可以了。

系列文章:

RabbitMQ:RabbitMQ-理论基础
RabbitMQ:快速入门hello word
RabbitMQ:RabbitMQ:work queues 工作队列(Round-robin/Fair dispatch)
RabbitMQ:发布/订阅 Publish/Subscribe
RabbitMQ:路由Routing
RabbitMQ:Topic类型的exchange
RabbitMQ:RabbitMQ之消息确认机制(事务+Confirm)
RabbitMQ:spring整合RabbitMQ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,426评论 2 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,170评论 19 139
  • 应用场景 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种: 1.串行的方式 2.并行的...
    lijun_m阅读 1,877评论 0 3
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 16,066评论 2 11
  • 文/莘子 图/网络 2017.08.08 1 小婷是个很活泼的姑娘,有一个很疼她的男朋友,平时她抱怨她男朋友怎样时...
    莘子月阅读 786评论 3 2