【问题标题】:Azure service bus - Session is duplicating messages in delivery to multiple instancesAzure 服务总线 - 会话将消息复制到多个实例
【发布时间】:2018-12-31 15:25:31
【问题描述】:

我在一个需要管理有序消息的系统上工作,这会引发服务总线。在我的公司,我们在 Azure 云上拥有一切,我使用 Azure 服务总线进行消息传递。 我阅读了有关该会话的信息,它似乎可以通过 Azure 服务总线解决我的挑战,但它仅适用于单个实例。一旦我将 we 作业扩展到多个实例,就会有多个实例使用来自同一个会话的相同消息。 在我的 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.");

        }

}

谢谢。 问候。

【问题讨论】:

  • 他们是使用相同的订阅还是每个实例的订阅?
  • 在我的 POC 中他们使用相同的订阅,如果不是我想接收相同的消息是正常的,

标签: session azureservicebus azure-servicebus-topics


【解决方案1】:

我使用计时器来触发我在 Web 作业中的方法。在扩展方面,计时器的数量与实例数量成正比。在那里,我将计时器替换为 Azure 服务总线主题订阅。由于消息只能接收一次,即使有多个正在运行的实例,方法也只能触发一次。

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

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

【讨论】:

  • 嗨,我遇到的问题是在使用 Session 时发生的,你也用过吗?
  • 不,我使用主题与多个订阅规则。
  • 没有会话我将无法解决消息处理的顺序。
  • 即使使用会话,消息也只能接收一次。你确定你在接收之前对客户端和AcceptMessageSession()使用了ReceiveAndDelete模式吗?
  • 实际上我使用了 PeekAndLock 和其他方法用于“活动接收器”RegisterSessionHandler。我将尝试使用 ReceiveAndDelete 和 AcceptMessageSession 更改代码。我希望能解决问题。感谢你。我会让你知道的。
【解决方案2】:

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

谢谢大家。 奥伊克斯特夫

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多