接收有序消息时的 Azure 服务总线队列延迟



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

为此,我按如下方式配置了我的队列客户端:

_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);
}
}

这实际上是我是个白痴。

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

只是一些建议:

  1. 不要关闭进程会话消息异步中的会话。

  2. 等待会话。CloseAsync((;
  3. 由于您刚刚注册了一个处理程序,因此请使您的应用程序处于活动状态,以确保所有任务都将完成。例如:您可以在 Console.Readline(( 之后结束应用程序。

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

最新更新