繁体   English   中英

使用 Azure 服务总线重新总线、竞争消费者和多租户

[英]Rebus with Azure Service Bus, Competing consumers and multi-tenancy

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

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

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

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

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

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

使用 Rebus,基本上有两种路由消息的方式:

  1. 通过发送它们: await bus.Send(message)
  2. 通过发布它们: 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”。

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

然而,队列旨在以你想要的方式分配工作——你只需要确保每条消息都被发送到正确的队列。

如果您想阅读更多内容,请查看关于 routing 的 wiki 页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM