簡體   English   中英

確認 RabbitMQ 消息是否有超時?

[英]Is there a timeout for acking RabbitMQ messages?

我想設置一個超時,在此之后出隊的消息會自動 NACK。

當我將消息出列時,我會等到它通過套接字傳輸並且另一方確認其接收。

我需要保留一個計時器列表還是 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
    }
}

RabbitMQ 不提供任何類型的用於確認消息的超時機制。 這在官方 Python 教程中有討論:

沒有任何消息超時; RabbitMQ 只會在工作連接斷開時重新傳遞消息。 即使處理消息需要非常非常長的時間也沒關系。

AMQP 0-9-1 規范的第 3.1.8 節描述了確認,並且非常清楚它們可以是自動的(客戶端不必做任何事情,消息一傳遞就被確認)或顯式(客戶端必須對其處理的每條消息或消息組進行確認)。

以下是 2009 年過去的一些討論,證實了這種情況。

所以:是的,如果您需要超時以在一段時間后自動發送 NACK,您必須自己這樣做。

RabbitMQ 的現代版本有ack timeout 因此,如果您的消費者在交付確認之前花費了大量時間,請小心更新新版本。

如果消費者未確認其交付超過超時值(默認為 15 分鍾),則其通道將關閉,並顯示 PRECONDITION_FAILED 通道異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM