ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ 之消息应答

2021-07-22 17:03:26  阅读:195  来源: 互联网

标签:消费者 应答 RabbitMQ 自动应答 deliveryTag 消息


消息应答概念

消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况?
RabbitMQ 一旦向消费者传递了一条消息,便立即将该消息标记为删除。在这种情况下,突然有个消费者挂掉了,我们将丢失正在处理的消息。以及后续发送给该消费这的消息,因为它无法接收到。
为了保证消息在发送过程中不丢失,RabbitMQ 引入消息应答机制,消息应答就是:消费者在接收到消息并且处理该消息之后,告诉 RabbitMQ 它已经处理了,RabbitMQ 可以把该消息删除了。
RabbitMQ 的应答模式分为两种:手动应答,自动应答

/**
 * 消费者消费消息
 * var1.消费哪个队列
 * var2.消费成功之后是否要自动应答, true 代表自动应答, false 代表手动应答
 * var3.消费者未成功消费的回调
 * var4.消费者成功消费的回调
 */
channel.basicConsume(ConnectUtil.QUEUE_NAME,Boolean.TRUE,deliverCallback,cancelCallback );

第二个参数代表是否要自动应答, true 代表自动应答, false 代表手动应答

自动应答

消息发送后立即被认为已经传送成功,这种模式需要在高吞吐量和数据传输安全性方面做权衡,因为这种模式如果消息在接收到之前,消费者那边出现连接或者 channel 关闭,那么消息就丢失了。
当然另一方面这种模式消费者那边可以传递过载的消息,没有对传递的消息数量进行限制,当然这样有可能使得消费者这边由于接收太多还来不及处理的消息,导致这些消息的积压,最终使得内存耗尽,最终这些消费者线程被操作系统杀死,所以这种模式仅适用在消费者可以高效并以某种速率能够处理这些消息的情况下使用。

手动应答

手动应答的好处是可以批量(multiple 参数控制)应答并且减少网络拥堵

/** 
 * deliveryTag:该消息的index
 * multiple:是否批量.true:将一次性ack所有小于deliveryTag的消息。
 */
channel.basicAck(deliveryTag,multiple);

用于肯定确认,RabbitMQ 已知道该消息并且成功的处理消息,可以将其丢弃了

/**
 * deliveryTag:该消息的index
 * multiple:是否批量应答。true:将一次性拒绝所有小于deliveryTag的消息。
 * requeue:被拒绝的是否重新入队列
 */
channel.basicNack(deliveryTag,multiple,requeue);

用于否定确认

/**
 * deliveryTag:该消息的index
 * requeue:被拒绝的是否重新入队列
 */
channel.basicReject(deliveryTag,requeue);

用于否定确认,与 channel.basicReject() 的区别在于 basicNack() 可以拒绝多条消息,而 basicReject() 一次只能拒绝一条消息

参考:https://www.cnblogs.com/piaolingzxh/p/5448927.html

标签:消费者,应答,RabbitMQ,自动应答,deliveryTag,消息
来源: https://www.cnblogs.com/lggtt/p/15044985.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有