【发布时间】: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