C# 使用Azure服务总线、竞争消费者和多租户的Rebus

C# 使用Azure服务总线、竞争消费者和多租户的Rebus,c#,azureservicebus,azure-servicebus-queues,rebus,C#,Azureservicebus,Azure Servicebus Queues,Rebus,我一直在尝试为Azure Service Bus设置REBS,但我发现很难找到适合我的用例的示例,或者自己构建解决方案 我有多个实例生成Message1,每个实例为特定的客户端运行,但是它们都生成message类Message1的实例。这些信息需要发送给ASB。接下来,每个租户都有很多相互竞争的消费者。换句话说,对于每个租户,Message1有多个使用者,但只有一个使用者可以处理此消息。这使我能够并行计算繁重的工作 通常情况下,我会为每个客户在ASB中创建一个队列,从而保证来自不同客户的消息不会

我一直在尝试为Azure Service Bus设置REBS,但我发现很难找到适合我的用例的示例,或者自己构建解决方案

我有多个实例生成
Message1
,每个实例为特定的客户端运行,但是它们都生成message类
Message1
的实例。这些信息需要发送给ASB。接下来,每个租户都有很多相互竞争的消费者。换句话说,对于每个租户,
Message1
有多个使用者,但只有一个使用者可以处理此消息。这使我能够并行计算繁重的工作

通常情况下,我会为每个客户在ASB中创建一个队列,从而保证来自不同客户的消息不会被混淆,也不会被执行多次。但是,Rebus会创建主题,从而启用多个订阅。就我的理解而言,这意味着所有订阅者都将收到这些消息(因此导致重复)。当然,人们可以过滤这些信息。但我没有找到任何明确的例子。而且这感觉有点不安全;我要强调的是,这些每个租户的数据流需要分开

到目前为止,我一直在努力:

  • 为每个租户创建单独的主题
  • 为每个租户创建单独的(错误)队列,但是,我不确定Rebus如何使用这些队列,因为消息是在主题上发布的

总之,我的问题是:如何设置一个场景,使同一条消息不能被传递两次,同时确保来自一个租户的消息只由为该租户工作的消费者处理。

对于Rebus,基本上有两种路由消息的方法:

  • 通过发送它们:
    等待总线。发送(消息)
  • 通过发布它们:
    等待总线。发布(消息)
  • 发送消息时,Rebus假定消息必须发送到单个队列我觉得这就是你想要的。

    发布消息时,Rebus会创建一个主题(根据已发布消息的类型命名),并将其发布到该主题。订阅该主题的人将在其输入队列中获得消息的副本

    Rebus将鼓励您将希望发送的每种消息类型映射到特定队列,这意味着这样的配置:

    Configure.With(…)
    .传输(t=>。。。
    .Routing(r=>r.typebase().Map(“某些队列”))
    .Start();
    
    将使您能够执行以下操作:

    wait bus.Send(new SomeMessage());
    
    然后消息将直接发送到队列“some queue”

    在我看来,您并不想为每个租户创建主题——它们不能用于实现“竞争消费者”,因为主题的目的是将每条消息的单独副本分发给每个订阅者

    队列用于按您想要的方式分发工作–您只需确保每个消息都发送到正确的队列


    如果您想阅读更多内容,请查看。

    完美!看起来我犯了一个小错误,但这确实扩大了我的理解,谢谢。我将很快构造示例代码,希望它有用