当前位置: 首页 > 知识库问答 >
问题:

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

微生自怡
2023-03-14

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

为此,我将QueueClient配置如下:

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

并按如下方式开始接收消息:

_queueClient.RegisterSessionHandler(ProcessSessionMessagesAsync, _options);

在几次(1到6次之间)成功(几乎是瞬时的)消息接收回调之后——无论是对于新会话还是现有会话,接收处理程序都会停止触发。使用ServiceBusExplorer,我可以看到位于servicebus队列上的消息。有趣的是,它们都有一个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个答案

巫马修然
2023-03-14

只是一些建议:

>

等待会话。CloseAsync()

由于您刚刚注册了一个处理程序,因此请使您的应用程序处于活动状态,以确保所有任务都将完成。例如:您可以在控制台之后结束应用程序。Readline()。

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

孟永望
2023-03-14

事实上我是个白痴。

_receiveCallback()实际上是对外部服务(请求宾)的调用,它在负载下限制了我的消息,并导致了我正在经历的行为。当我把它掐灭时,我看到了一致的(快速的)行为。

 类似资料:
  • 因此,我使用Spring integration链接JMS和ActiveMQ,如下所示:- 如何使其工作,以便发送到此队列并从中接收消息?请帮忙。

  • 我们最近将应用程序从 Weblogic 迁移到了 JBOSS Fuse。作为此迁移的一部分,我们还必须将 JMS 实现更改为 Active MQ。由于某些约束,将请求发送到旧 Weblogic JMS 队列的客户端将无法进行更改以将请求发送到新的活动 MQ。有没有办法保持客户端不变(仅更改主机和端口以指向新服务器)并接收发送到Weblogic JMS队列的消息(当然没有weblogic服务器)并将

  • 我已经建立了AWS架构体系,以便每次对发电机数据库条目的更新都以启用重复数据删除的SQS先进先出队列结束。我还有一个测试来覆盖这个场景,在那里我清除了队列(队列可以从套装中的其他测试中获得更新。为了避免在收到正确的消息之前必须轮询大量的消息,我在运行测试之前清除队列),更新Dynamo Db,并在轮询队列时检查这些条目是否收到。这个测试是不稳定的,有时会失败,因为我发送的所有更新都没有从队列中收到

  • 本文向大家介绍RabbitMQ 怎么实现延迟消息队列?相关面试题,主要包含被问及RabbitMQ 怎么实现延迟消息队列?时的应答技巧和注意事项,需要的朋友参考一下 延迟队列的实现有两种方式: 通过消息过期后进入死信交换器,再由交换器转发到延迟消费队列,实现延迟功能; 使用 RabbitMQ-delayed-message-exchange 插件实现延迟功能。

  • 我目前正努力在nServiceBus托管的应用程序上启动并运行一些东西。我有一个第三方正在向其发布消息的azure ServiceBus队列,我希望我的应用程序(目前在本地托管)接收这些消息。 我在谷歌上搜索了如何配置endpoint的答案,但我在有效的配置中没有运气。有人这样做过吗,因为我可以找到如何连接到Azure存储队列但不是服务总线队列的示例。(由于其他原因,我需要Azure servic