【问题标题】:Azure Service Bus Queues vs. Topics (Pub/Sub)Azure 服务总线队列与主题(发布/订阅)
【发布时间】:2020-10-08 17:18:28
【问题描述】:

需要一些架构指导。我有一组执行各种功能的 stateless 服务。我的架构允许每个服务的多个副本同时运行(因为它们是无状态的),因此我可以:

  1. 根据需要扩展以处理更大的工作负载
  2. 具有容错能力(如果服务的一个实例失败,没有问题,因为会有其他人来承担这项工作)。

但是,我不希望重复工作。

如果 Service A, Instance 1 已经接受了 Job ABC,我不希望 Service A, Instance 2 接受同样的工作。因此,我可以通过使用 Azure 服务总线队列来避免这个问题。只有单个工作人员会从队列中获取特定项目,并且只会重新分配给另一个工作人员,如果工作人员没有在设定的时间内将其标记为完成。

那么,什么是主题(Pub/Sub)的合适用例? 似乎如果我曾经拥有同一服务的多个副本,我必须依赖队列。对吗?

问另一种方式,有没有办法在 Azure 服务总线或类似产品/服务中使用主题,但避免重复工作?另外,如果有办法锁定消息(对于短时间)当使用主题时,是否可以将该消息锁定到服务 A 的一个实例(因此服务 A 的其他实例将无法访问它)但该消息将被广播到服务 B、服务、C等?

【问题讨论】:

    标签: azure microservices azureservicebus azure-servicebus-queues azure-servicebus-topics


    【解决方案1】:

    有没有办法在 Azure 服务总线或类似中使用主题 产品/服务,但避免重复工作?

    是的,有。基本上,您需要将每个订阅用作队列。您需要做的是定义适当的过滤器,以便将一种消息发送到单个订阅(这样它充当队列)并让多个侦听器(在您的情况下为服务实例)仅侦听特定订阅。

    另外,如果有办法锁定消息(短时间) 使用主题时,是否可以将该消息锁定为一个 服务 A 的实例(因此服务 A 的其他实例不会有 访问它)但消息将被广播到服务 B,服务, C等?

    当然可以锁定消息。为此,您需要以Peek-Lock 模式获取消息。但是,如果涉及多个订阅者(服务),则只有一个订阅者能够锁定消息并访问它。对于其他订阅者,该消息将不可见。您不能有一个服务获得锁而其他服务仍然收到消息的情况。

    【讨论】:

    • 不确定如何解决同时运行同一服务的多个精确副本的问题,正如我在问题中所描述的那样。当服务相同、自动供应和取消供应(例如通过 Kubernetes)时,我如何将消息定向到该服务的一个特定实例?
    • 理想情况下您不应该这样做,因为它会限制您的扩展能力。服务的每个实例都应该能够处理消息,但使用锁定机制只有一个实例应该处理该消息。
    【解决方案2】:

    Azure 函数触发器将提供您正在寻找的所有内容。

    如果您没有利用服务总线的任何高级排队功能,那么我建议您查看storage queues 以节省一些钱。

    如果您需要服务总线,那么您可以使用service bus triggers

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-19
      • 2021-09-23
      • 1970-01-01
      • 2018-08-27
      • 2016-02-10
      • 2016-12-29
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多