gpt4 book ai didi

c# - acking RabbitMQ 消息是否有超时?

转载 作者:可可西里 更新时间:2023-11-01 08:57:29 24 4
gpt4 key购买 nike

我想设置一个超时时间,在该超时时间之后,出队的消息将被自动取消确认。

当我将一条消息从队列中取出时,我会一直等到它通过套接字传输并且另一方确认接收到它。

我是否需要保留一个计时器列表,或者 RMQ 可以自动处理吗?

private void Run()
{
_rmqConnection = _queueConnectionFactory.CreateFactory().CreateConnection();

_rmqReadchannel = _rmqConnection.CreateModel();

_rmqReadchannel.QueueDeclare(QueueIdOutgoing(), true, false, false, null);

_rmqReadchannel.BasicQos(0, 1, false);
var consumer = new QueueingBasicConsumer(_rmqReadchannel);
_rmqReadchannel.BasicConsume(QueueIdOutgoing(), false, consumer);
while (true)
{
if (!_rmqReadchannel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonData = Encoding.UTF8.GetString(ea.Body);
if (OnOutgoingMessageReady != null)
{
OnOutgoingMessageReady(this, new QueueDataEventArgs(jsonData, ea.DeliveryTag));
}
//waiting for ACK from a different thread
}
}

最佳答案

是的。这在 official Python tutorial 中进行了讨论。 :

A timeout (30 minutes by default) is enforced on consumer delivery acknowledgement. This helps detect buggy (stuck) consumers that never acknowledge deliveries.

您可以在 Delivery Acknowledgement Timeout 的 RabbitMQ 文档中找到更多可用信息

然而,情况并非总是如此。旧版本的 RabbitMQ(至少到 3.6.x 版)没有提供任何类型的超时机制来确认消息。这在 older versions of the official Python tutorial 中提到过:

There aren't any message timeouts; RabbitMQ will redeliver the message only when the worker connection dies. It's fine even if processing a message takes a very, very long time.

Section 3.1.8 of the AMQP 0-9-1 specification描述了确认,并且非常清楚它们可以是自动(客户端不需要做任何事情,消息在传递后立即被确认)或显式 (客户端必须对其已处理的每条消息或每组消息进行确认)。

这是一些 past discussion早在 2009 年就证实了这种行为。

我能看到的关于更改此行为的第一个引用是 this PR从 2019 年 4 月开始。我不确定更改的服务器版本包含在哪个版本中,但听起来默认值最初是“无超时”,然后是 15 分钟 RabbitMQ 3.8.15 , 然后 30 分钟 RabbitMQ 3.8.17 (截至 2021 年 10 月它仍然存在)。

因此:此行为取决于您的 RabbitMQ 版本。旧版本要求您在一段时间后明确发送 NACK。较新的版本有默认超时。

关于c# - acking RabbitMQ 消息是否有超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30546977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com