RabbitMQ 消费者过载

2023-12-03

我一直在阅读有关 AMQP 消息传递确认的原理。 (https://www.rabbitmq.com/confirms.html)。确实很有帮助且写得很好的文章,但有关消费者致谢的一个特别的事情确实令人困惑,以下是引用:

使用自动确认模式时需要考虑的另一件事是消费者超载.

消费者超载?消息队列由代理处理并保存在 RAM 中(如果我理解正确的话)。这是关于什么过载?消费者是否有某种第二队列? 该文章的另一部分更令人困惑:

因此,消费者可能会对送货速度感到不知所措,在内存中积累积压并耗尽堆或让操作系统终止其进程。

什么积压?这一切是如何协同工作的?消费者完成哪部分工作(当然除了消费消息和处理消息)?我认为代理正在保持队列活动并转发消息,但现在我正在阅读一些神秘的积压和消费者过载。这真的很令人困惑,有人可以解释一下或者至少指出我的好来源吗?


我相信您所指的文档处理了我认为 AMQP 0-9-1 或 RabbitMQ 的实现中的设计缺陷。

考虑以下场景:

  • 队列中有数千条消息
  • 单个消费者订阅队列AutoAck=true并且没有设置预取计数

将会发生什么?

RabbitMQ 的实现是向没有预取计数的客户端传递任意数量的消息。此外,对于自动确认,预取计数是无关紧要的,因为消息在传递给消费者时得到确认。

内存缓冲区:消费者的默认客户端 API 实现有一个内存缓冲区(在 .NET 中,它是某种类型的阻塞集合(如果我没记错的话))。因此,在处理消息之前,但在从代理接收到消息之后,它进入这个内存中的保存区域。现在,设计缺陷就是这个保存区域。消费者别无选择,只能接受来自代理的消息,因为它是异步发布到客户端的。这是AMQP协议规范(参见第 53 页)。

因此,此时队列中的每条消息都将立即传递给消费者,并且消费者将被消息淹没。假设每条消息都很小,但需要 5 分钟来处理,那么这个消费者完全有可能在任何其他消费者附加到它之前耗尽整个队列。自从AutoAck打开后,代理将在传递后立即忘记这些消息。

显然,如果您想要处理这些消息,这不是一个好的场景,因为它们已经离开了代理的相对安全性,并且现在位于消费端点的 RAM 中。假设遇到了导致消费端点崩溃的异常 - 噗,所有消息都消失了。

如何解决这个问题?

您必须关闭 Auto-Ack,通常设置合理的预取计数也是一个好主意(通常 2-3 就足够了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ 消费者过载 的相关文章

随机推荐

  • Python Pandas:为源列的每个不同值创建一个新列(布尔输出作为列值)

    我试图根据数据帧的内容将其源列拆分为几列 然后按以下方式用布尔值 1 或 0 填充新生成的列 原始数据框 ID source column A value 1 B NaN C value 2 D value 3 E value 2 生成以下
  • Access 2010 限制查询结果

    MS Access 2010 中用于将查询结果限制为前 1 000 个的语法是什么 我试过这个 SELECT tblGL Cost Centre Code FROM tblGL LIMIT 1000 但我收到错误 FROM 子句中的语法错误
  • 有什么方法可以控制 blockproc 输出的串联吗?

    这是问题的后续 使用 blockproc 或 im2col 在图像上重叠滑动窗口 所以通过使用代码 B blockproc A 1 1 block fun BorderSize 2 2 TrimBorder false PadPartial
  • 使用 geom_line 连接缺失值

    我试图弄清楚是否可以使用 geom line 连接缺失值 例如 在下面的链接中 构面 F 中的时间 3 处缺少值 在这种情况下 我想要一条线来连接时间 2 和 4 有办法实现这一点吗 https farm8 staticflickr com
  • 从自定义表格视图单元格发送重新加载数据?

    我将如何从自定义 tableViewCell 向 tableView 发送 reloadData 消息 实现这一点的最简单方法是使用委托 在 CustomTableCell h 中定义一个协议 如下所示 protocol CustomTab
  • 递归 - 数字按相反顺序排列

    我需要实现一个递归方法 printDigits 它将整数 num 作为参数 并以相反的顺序打印其数字 每行一位数字 这是我到目前为止所拥有的 public class PrintDigits public static void main
  • 启动层初始化时发生错误 FindException: Module not found

    使用 Java 9 执行简单的 Hello World 程序会导致以下错误消息 boot层初始化时出错java lang module FindException 找不到模块 com pantech myModule 我执行的命令行是 ja
  • 使用 VBA 宏在 CATIA V5R19 中实例化 PowerCopy

    我不知道如何使用 VBA 宏实例化 Power copy 我有一个 CATPart1 其 Power copy 名称为 MyPC 我想在当前部分实例化这个超级副本 仅举例来说 此超级复制输入为 Plane Start point 和 End
  • 查找“立体校正”两个摄像机之间的旋转矩阵

    所以我有一个深度图以及相机的外部和内部 我想取回 3D 点和表面法线 我正在使用该函数重新投影图像至 3D 在stereo rectify函数中找到Q如何得到旋转矩阵between第一和第二相机的坐标系 我有单独的旋转矩阵和平移向量 但如何
  • Android Studio:使用 Mongo Java 驱动程序连接到 MongoDB 服务器

    关于这个问题有很多帖子 但似乎没有人能解决问题 所以也许有些事情已经改变了 我正在尝试将我的 Android 应用程序连接到位于 mLab 上的 MongoDB 服务器 我正在使用 Mongo Java Drived 当然已经将库添加到了
  • Vera ++ TCL规则:列出所有局部变量[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在尝试为 vera 静
  • Datagrid (WPF) 以编程方式设置列样式(不是 xaml)

    我已经看过了 但还没有找到我正在寻找的确切答案 我有一个绑定到数据源的 DataGrid 视图 我想在带有数据网格的窗口可见后以编程方式设置列的样式 我也想根据一些行为时不时地改变它 我尝试使用 DataGridTemplateColumn
  • 如何在C#中删除注册表值

    我可以使用 Microsoft Win32 Registry 类获取 设置注册表值 例如 Microsoft Win32 Registry SetValue HKEY CURRENT USER Software Microsoft Wind
  • 为我的条形码阅读器读取和写入数据到缓冲区的最佳方法是什么?

    我需要用 C 语言为 Linux 的条形码阅读器编写一个驱动程序 条形码阅读器通过串行总线工作 当我向条形码阅读器发送一组命令时 条形码阅读器应该向我返回状态消息 我设法配置端口并创建信号处理程序 在信号处理程序中 我读取串行总线接收的数据
  • 如何搜索在 Json 中注册为数组的日期?

    如何搜索在 Json 中注册为数组的日期 PostgreSQL 是数据库 下面是相关代码 1 Model class Business db Model tablename business id db Column db Integer
  • GitHub api 获取最后 N 次提交

    是否可以使用 GitHub API 获取 GitHub 存储库中特定分支的最后 N 次提交 我刚刚发现了一些关于提交的 GitHub api 详细信息here 但他们都没有提供有关最后 N 次提交的详细信息 任何人都可以对此提供更好的想法吗
  • 具体详细说明了 NSUserDefaultsDidChangeNotification 上的默认值已更改的内容

    我开始进入 NSUserDefaults 的内部密室 现在我可以使用提供的选择器加上 NSNotification 对象作为参数成功拦截 NSUserDefaultsDidChangeNotification 通知 然而 返回的 NSNot
  • R-lang:如果等于引号,则删除第一个字符

    R新手 我正在尝试从数据框中的行的开头和结尾删除 如果引号不是第一个或最后一个字符 我不想删除 我不确定为什么以下内容不适用于我的数据的数据框 其中每一行都是文本的数据点 引号并不是字符串 而是文本的一部分 数据框的一行看起来像这样 x l
  • 在 bash 中获取当前日期而不生成子进程

    这个问题纯粹是好奇心 通过运行以下命令很容易获得日期date来自 bash 的命令 但它是一个外部可执行文件 需要生成一个子进程 我想知道是否可以在没有子进程的情况下获取当前时间 日期的格式 我只能在以下上下文中找到对日期 时间格式的引用P
  • RabbitMQ 消费者过载

    我一直在阅读有关 AMQP 消息传递确认的原理 https www rabbitmq com confirms html 确实很有帮助且写得很好的文章 但有关消费者致谢的一个特别的事情确实令人困惑 以下是引用 使用自动确认模式时需要考虑的另