c# - 使用 Azure 服务总线重新总线、竞争消费者和 Multi-Tenancy

标签 c# azureservicebus azure-servicebus-queues rebus

我一直在尝试为 Azure 服务总线设置 Rebus,但我发现很难找到适合我的用例的示例,也很难自己构建解决方案。

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

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

到目前为止我设法做的事情:

  • 为每个租户创建单独的主题
  • 为每个租户创建单独的(错误)队列,但是,我不确定 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/

    相关文章:

    c# - Azure 服务总线作为 Web 作业抛出错误提供的锁无效

    java - 我们如何使用java对azure服务总线队列中存在的消息添加延迟?

    azureservicebus - Azure SB 队列将消息发送到禁用的死信队列

    c# - 如何获取标签和 NumericUpDown 中文本基线的位置?

    azure - 按计划和事件启动后台服务

    c# - 顺序引导生成器

    azure - 验证 Microsoft Azure 服务总线的连接字符串

    Azure 服务总线 AMQP 对象接收器已中止

    c# - 在数据库中存储 Dictionary<string, string>

    c# - 验证文本框以限制数字输入