【问题标题】:Azure ServiceBus: wait until all subscribers processed a messageAzure ServiceBus:等到所有订阅者都处理完一条消息
【发布时间】:2019-12-23 14:55:34
【问题描述】:

我的场景是我计划创建一个包含多个(未知)订阅者的 ServiceBus 主题。他们可以使用主题过滤器,因此不会处理来自主题的每条消息。

我需要一个给定的消息 (Id) 等到所有处理程序完成其工作以继续工作流程。自然,每个处理程序都会在完成后产生一条消息,我可以使用例如 Durable Function 来等待事件列表。

但问题是我如何知道订阅消息已经/将要发送到的列表?

使用Microsoft.Azure.ServiceBus.Management.ManagementClient.GetSubscriptionsAsync(),我可以获得我的主题的所有订阅列表。但是我找不到如何根据过滤器评估它是否会接收给定的消息。

如果使用 ServiceBus 无法实现,是否有任何替代方案(除了通过自定义实现 Pub/Sub 重新发明轮子)来实现这种场景?

【问题讨论】:

  • 您能否将订阅拆分为多个主题?你能解释一下你正在尝试做什么的更广泛的图景吗? (例如,请解释为什么你需要这样做,而不是什么你需要做。)
  • @Slothario 如果我们将主题分成多个流:每个订阅者一个,我们将打破发布者独立于订阅者的整个想法。如果不修改发布者的代码,我们将无法动态添加新订阅者...
  • 你最终想要做什么?听起来您正在尝试基于负载进行分片之类的事情,这是一种极为常见的情况。我不怀疑 Service Bus 开箱即用,我知道像 Kafka 这样的东西可能可以处理它。但是,除非我知道您要解决什么问题,否则很难说。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 我明白了。但是我从微服务中了解到的是,它们很容易实现,但很快就会变得非常复杂,因为分布式计算比看起来更难。微服务是一种减少组织内沟通渠道的策略,而不是组织代码。要组织代码,请使用良好的设计模式。我强烈建议您阅读以说服自己这是真的。但是,如果您在组织中没有做出改变的影响力,我也理解这一点。
  • 我将拥有一个核心服务来监听事件并通过休息来协调“插件”调用以进行处理。此外,每个插件都需要在核心中“注册”(您可以轻松地将其作为 azure devops 的一部分进行),以说明我可以处理某种类型的事件。在这种情况下,您将拥有微服务的灵活性,因此您可以单独部署每个块,但您仍然可以控制谁以及何时处理您的事件。甚至更多您现在可以订购事件处理,您还可以在需要时中断执行,这样您就不会调用其他处理器,您可以添加规则等等。

标签: c# .net azure servicebus


【解决方案1】:

我将首先删除过滤功能。

创建近似于过滤器的多个主题(不是每个订阅者的主题)。

订阅某个主题的每个订阅者都必须处理该主题的所有消息。即使这样说他们什么也没做。

然后你就知道谁订阅了每个主题,谁处理了每个主题的每条消息。

【讨论】:

  • 我认为 ServiceBus 的想法是由订阅者决定他们想收听哪些消息。当他们能够使用标准 API 进行订阅时,很难让他们不使用过滤器......并且已经引入过滤器以节省成本 - 如果某些 Azure Function 需要每小时处理 1% 的百万个请求,那将是应用过滤器的一个很好的节省成本的方法。但实际上,我得出了相同的结论,即目前似乎不支持它,不幸的是,每个订阅者都需要回复每条消息。
  • 当您需要区分他们想要和尚未阅读的消息,以及他们不感兴趣并被过滤掉的消息时,问题就出现了。
猜你喜欢
  • 2017-07-08
  • 2019-08-29
  • 1970-01-01
  • 2022-01-25
  • 2019-06-02
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多