Azure Servicebus队列延迟接收有序消息

时间:2019-08-26 08:25:45

标签: azure .net-core servicebus azure-servicebus-queues

使用启用了会话(消息排序)的Azure ServiceBus队列,我的会话需要持续几分钟到几小时。

为此,我对QueueClient进行了如下配置:

_options = new SessionHandlerOptions(ExceptionReceivedHandler)
{
    AutoComplete = false,
    MaxConcurrentSessions = 50,
    MessageWaitTimeout = TimeSpan.FromSeconds(30),
};

并开始接收消息,如下所示:

_queueClient.RegisterSessionHandler(ProcessSessionMessagesAsync, _options);

在几次(介于1到6之间)成功的(几乎是瞬时的)消息接收回调之后(对于新会话和现有会话),接收处理程序只是停止触发。使用ServiceBusExplorer,我可以看到位于服务总线队列上的消息。有趣的是,它们都有一个 DeliveryCount = 1 。 经过一段时间(几秒钟到几分钟之间不等-但不是MessageWaitTimeout的倍数),我又开始收到一滴消息。如果我重新启动接收器,则有时会收到所有剩余消息的突发信息,有时仅此而已。

我为MessageWaitTimeout尝试了各种值,尽管较低的值似乎可以减轻问题,但延迟仍然存在。

有趣的是,如果我在收到每条消息后完成会话,问题仍然存在。

有人经历过这样的事情吗?行为如此令人发指的不一致。

FWIW,我的messageReceivedHander看起来像这样:

async Task ProcessSessionMessagesAsync(IMessageSession session, Message message, CancellationToken token)
{
    try
    {
        var myEvent = Serializer.Deserialize(message.Body);
        await _receiveCallback(Subscription, myEvent);
        await session.CompleteAsync(message.SystemProperties.LockToken);

        // Drop the session after every message (**makes no difference**)
        await session.CloseAsync();
    }
    catch (Exception ex)
    {
        await session.AbandonAsync(message.SystemProperties.LockToken);
    }
}

2 个答案:

答案 0 :(得分:1)

这实际上是我的白痴。

_receiveCallback()实际上是对外部服务(requestbin)的调用,该服务正在限制负载下的消息并导致我遇到的行为。当我对它进行测试时,我看到了一致(快速)的行为。

答案 1 :(得分:0)

一些建议:

  1. 请勿在ProcessSessionMessagesAsync中关闭会话。

    等待会话。CloseAsync();

  2. 当您刚刚注册处理程序时,请确保您的应用程序处于活动状态,以确保所有任务都将完成。例如:您可以在Console.Readline()之后结束应用程序。

我运行了官方示例:BasicSessionSendReceiveUsingQueueClient,它工作正常。你可以试试看。