Azure服务总线-会话正在复制传递到多个实例的消息

时间:2018-07-24 05:47:22

标签: session azureservicebus azure-servicebus-topics

我在需要管理有序消息的系统上投入了服务总线。在我的公司中,我们所有内容都在Azure云上,并且我正在使用Azure服务总线进行消息传递。 我阅读了有关该会话的信息,似乎可以使用Azure服务总线解决开箱即用的问题,但它仅适用于单个实例。一旦将we job扩展到多个实例,一个以上的实例就会使用同一会话中的相同消息。 在我的POC中,我使用带有订阅的主题。

有人能够使其扩展到接收器的多个实例吗? 我的第二个选择是自己实施Resequencer企业模式,您有什么建议吗?

这是我用来接收消息的代码:

static async Task InitializeReceiver(string connectionString, string queueName, CancellationToken ct)
    {
        var receiverFactory = MessagingFactory.CreateFromConnectionString(connectionString);

        ct.Register(() => receiverFactory.Close());

        var client = receiverFactory.CreateSubscriptionClient(queueName, "parallel", ReceiveMode.ReceiveAndDelete);

        client.RegisterSessionHandler(
            typeof(SessionHandler),
            new SessionHandlerOptions
            {
                AutoRenewTimeout = TimeSpan.FromMinutes(5),
                MessageWaitTimeout = TimeSpan.FromSeconds(120),
                MaxConcurrentSessions = 100,
                AutoComplete = false
            });
    }

这是我用于处理的代码:

public async Task OnMessageAsync(MessageSession session, BrokeredMessage message)
    {
      await ProcessMessage(session, message, currentInstanceId, recipeStep);
      // If I process the last message of the session
      if (message.Sequence == numberOfMsgPerSession)
        {
            // end of the session!
            await session.CloseAsync();
            logger.LogInformation($"Session with id {message.SessionId} is completed.");

        }

}

谢谢。 问候。

2 个答案:

答案 0 :(得分:1)

我使用计时器来触发Web作业中的方法。在扩展方面,计时器的数量与实例的数量成比例地增加。在那里,我用Azure Service Bus主题订阅替换了计时器。由于消息只能接收一次,因此即使有多个正在运行的实例,这些方法也只能触发一次。

我有一个活动的接收者正在监听消息,请检查here以创建活动的监听器。

正如您所说的,消息是在多个实例中接收的,您可能偷看了这些消息,而不是接收到它们。窥视消息不会将其从订阅中删除。仅接收它会从“订阅”中删除它,从而导致该消息对其他接收者不可用。

答案 1 :(得分:0)

我解决了。 如果您看到我在问题中发布的代码,则在我根据其序列号处理最后一条消息时,对于每个会话,我都将其关闭。 一次,我删除了这段代码,一切都开始正常工作,我每会话发送200条消息,其中包含10个会话。对于每个会话,邮件都是按顺序处理的,并且不超过一个实例像我期望的那样进行会话。

谢谢大家。 OaicStef

相关问题