我一直在尝试为 Azure 服务总线设置 Rebus,但我发现很难找到适合我的用例的示例,也很难自己构建解决方案。
我有多个实例产生 Message1
,每个实例都为特定的客户端运行,但是它们都生成消息类 Message1
的实例。 .这些消息需要发送到 ASB。接下来,每个租户都有很多竞争消费者。换句话说,对于每个租户,Message1
有多个消费者。但只有一个消费者可以处理此消息。这使我能够并行化繁重的计算工作。
通常,我会在每个客户的 ASB 中创建 1 个队列,从而保证来自不同客户的消息永远不会混淆,或者被执行多次。然而,Rebus 创建主题,因此启用多个订阅。就我的理解而言,这意味着所有订阅者都会收到这些消息(因此导致重复)。当然,可以过滤这些消息。但我没有找到任何明确的例子。这也感觉有点不安全;我不能过分强调这些每个租户的数据流需要分开。
到目前为止我设法做的事情:
总而言之,我的问题是:我如何设置一个场景,同一消息不能被传递两次,同时还确保来自一个租户的消息只会由为该租户工作的消费者处理。
最佳答案
使用 Rebus,基本上有两种路由消息的方式:
await bus.Send(message)
await bus.Publish(message)
当您发送消息时,Rebus 假定消息必须发送到单个队列。 在我看来,这就是你想要的。
当您发布消息时,Rebus 创建一个主题(根据发布消息的类型命名)并将其发布到该主题。订阅该主题的任何人都会在她/他的输入队列中获得该消息的副本。
开箱即用,Rebus 将鼓励您将希望发送的每种消息类型映射到特定队列,这意味着配置如下:
Configure.With(...)
.Transport(t => ...
.Routing(r => r.TypeBased().Map<SomeMessage>("some-queue"))
.Start();
将使您能够做到这一点:
await bus.Send(new SomeMessage());
然后消息将直接发送到队列“some-queue”。
在我看来,您并不想为每个租户创建主题——它们不能用于实现“竞争消费者”,因为主题的目的是将每条消息的单独副本分发给每个订阅者。
队列 ,然而,用于以您想要的方式分配工作——您只需要确保每条消息都被发送到正确的队列。
如果您想阅读更多内容,请查看 the wiki page about routing .
关于c# - 使用 Azure 服务总线重新总线、竞争消费者和 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57712821/