【问题标题】:What happens when RabbitMQ's Delivery Tag overflows?当 RabbitMQ 的 Delivery Tag 溢出时会发生什么?
【发布时间】:2013-10-24 20:34:32
【问题描述】:

RabbitMQ 使用称为传递标签的非负长整数(63 位整数,因为只有非负数)来存储通过通道发送了多少消息。如果您通过频道发送 (2^63)+1 条消息会发生什么?

【问题讨论】:

    标签: rabbitmq amqp


    【解决方案1】:

    根据我的纸巾背面计算,假设maximum publish rate of 53,710 messages per second,您必须发布总共 7.06 x 10^13 年,这比已知宇宙的年龄大四个数量级.

    换一种说法,如果我们假设您可以通过某种方式在每个处理器周期发布 3 条消息,并且英特尔处理器每秒可以处理 7,000,000,000 条消息,那么仍然需要将近 84 年的时间。

    因此,可以断定您将首先遇到其他问题。但是,如果您的 RabbitMQ 服务器能够保持运行这么长时间,那么您应该得到奖励。

    但说真的,如果这真的发生了,我想这取决于 Erlang 如何处理整数。 This post 表示 Erlang 将耗尽内存 - 我不完全理解他们是如何做到这一点的,但也许整个系统会爆炸?谁知道。在 C# 中,整数只是在 overflow 之后滚动。

    【讨论】:

    • 是的,我知道不可能发送这么多消息。我对如果你这样做会发生什么感兴趣。虽然我们都可以想象会发生什么,但我想看看是否有人已经知道或可以为我提供参考。
    • 不是“不太可能” - 不可能,因为您对问题的定义。但是,我确实尝试在答案的第二部分中进行理论化:) 可能有人可以设置一个测试,从而故意将整数值设置为 (MaxValue-1) 或其他东西,尽管我认为这将是一个学术活动。
    • 例如,在 java 客户端中,您将拥有 basicPublish 函数 if (nextPublishSeqNo > 0) { unconfirmedSet.add(getNextPublishSeqNo()); nextPublishSeqNo++; } 的这个片段,其长度为负数,因此它永远不会将其添加到 unconfirmedSet 并且永远不会添加 1 以获得下一个所以我想你会得到相同的 id 并且有相关的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多