当RabbitMQ的Delivery Tag溢出时会发生什么?

6

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

1个回答

15
根据我粗略的计算,假设最大发布速度为每秒53,710条消息(参见这里),你需要总共发布7.06 x 10^13年,这比已知宇宙的年龄还要大4个数量级。
换一种说法,如果我们假设您能在每个处理器周期内发布3条消息,并且Intel处理器可以处理7,000,000,000条消息每秒,则仍需要近84年时间。
因此,可以放心地得出结论,您将首先遇到其他问题。但是,如果您的RabbitMQ服务器能够保持运行那么长时间,那么您应该得到奖励。
但是说真的,如果真的发生了这种情况,我想这取决于Erlang如何处理整数。 这篇文章表明,Erlang会耗尽内存 - 我不完全理解他们如何实现,但也许整个系统就会崩溃?谁知道呢。在C#中,整数会在溢出后自动循环。

是的,我知道发送这么多消息可能不太可能。我对如果您这样做感到感兴趣。虽然我们都可以想象会发生什么,但我想看看是否有人已经知道或可以指引我参考资料。 - Carlos Rendon
1
不是“不可能”,而是根据您对问题的定义来看,这是不可能的。但是,在我的答案的第二部分中,我尝试进行了理论推测 :) 可能可以设置一个测试,使整数值故意设置为(MaxValue-1)或其他值,尽管我认为这将是一项学术性的练习。 - theMayer
在Java客户端中,例如,您将具有此basicPublish函数的片段 if (nextPublishSeqNo > 0) { unconfirmedSet.add(getNextPublishSeqNo()); nextPublishSeqNo++; },使用负长整型,因此它永远不会将其添加到unconfirmedSet中,并永远不会添加1以获取下一个,因此我认为您将获得相同的ID并且与此相关的问题。 - PhoneixS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接