Rabbitmq 扩展MessageBroker订阅服务器以防止双重消息

Rabbitmq 扩展MessageBroker订阅服务器以防止双重消息,rabbitmq,azureservicebus,messagebroker,Rabbitmq,Azureservicebus,Messagebroker,我在考虑一个在发布/订阅模式下使用的经典消息代理(例如RabbitMQ或Azure服务总线) 让我们来谈谈这个例子: -发布者1(示例顺序发射器) -订户A(计费) -订户B(发货) 如果我想扩大一个订户(例如订户B),会发生什么 当然,我会有这样的组合: -发布者1(示例顺序发射器) -订户A(计费) -订户B-节点1(发货) -订户B-节点2(发货) 应该使用哪种模式来防止MessageBroker向订阅服务器2的两个节点发送相同的消息 当然,我不是指我作为示例列出的服务的一些API,但我想

我在考虑一个在发布/订阅模式下使用的经典消息代理(例如RabbitMQ或Azure服务总线)

让我们来谈谈这个例子:

-发布者1(示例顺序发射器)

-订户A(计费)

-订户B(发货)

如果我想扩大一个订户(例如订户B),会发生什么

当然,我会有这样的组合:

-发布者1(示例顺序发射器)

-订户A(计费)

-订户B-节点1(发货)

-订户B-节点2(发货)

应该使用哪种模式来防止MessageBroker向订阅服务器2的两个节点发送相同的消息


当然,我不是指我作为示例列出的服务的一些API,但我想象的是当存在消息代理并且一些订阅者应该向外扩展时的经典用例。

当添加同一逻辑节点的实例时,您是向外扩展,而不是向上扩展。这两个代理都支持,并且在向外扩展时不需要任何特殊要求。消息将仅由单个实例处理,除非未能及时处理(在Azure Service Bus案例中)或未成功完成。

添加同一逻辑节点的实例时,您是在向外扩展,而不是向上扩展。这两个代理都支持,并且在向外扩展时不需要任何特殊要求。消息将仅由单个实例处理,除非未能及时处理(在Azure Service Bus案例中)或未成功完成。

我为一家名为的公司工作,我们制作消息代理。您的用例非常典型,并且很容易构建。正如肖恩所说,这是相互竞争的消费者。以下是您如何配置它:

由于您的示例消息是订单,我假设您不想丢失这些订单,因此需要使用持久消息。作为安慰,当消息到达队列时,它们会被持久化。因此:

  • 您的Publisher 1将发布“订单”主题(例如,
    orders/new/[ORDER\u ID]
  • 您将配置两个队列(
    qa
    qb
    ):
    • 在每个队列上添加主题
      orders/new/*
      的订阅
    • 第二个队列将被配置为非独占队列,允许向所有连接的使用者进行循环或负载平衡传递
  • 订阅服务器A将绑定到
    qa
    ,订阅服务器B1和B2将绑定到
    qb
由于发布/订阅机制,每个队列将接收消息的副本。为了提高效率,Solace中的持久性存储都是基于指针的(通过引用计数),因此每个消息只在磁盘上写入一次,即使它跨多个队列复制。(与将每个副本写入磁盘的Rabbit不同)


qb
添加更多的消费者/订阅者将动态地平衡所有消费者/订阅者的负载。

我为一家名为“我们制作消息代理”的公司工作。您的用例非常典型,并且很容易构建。正如肖恩所说,这是相互竞争的消费者。以下是您如何配置它:

由于您的示例消息是订单,我假设您不想丢失这些订单,因此需要使用持久消息。作为安慰,当消息到达队列时,它们会被持久化。因此:

  • 您的Publisher 1将发布“订单”主题(例如,
    orders/new/[ORDER\u ID]
  • 您将配置两个队列(
    qa
    qb
    ):
    • 在每个队列上添加主题
      orders/new/*
      的订阅
    • 第二个队列将被配置为非独占队列,允许向所有连接的使用者进行循环或负载平衡传递
  • 订阅服务器A将绑定到
    qa
    ,订阅服务器B1和B2将绑定到
    qb
由于发布/订阅机制,每个队列将接收消息的副本。为了提高效率,Solace中的持久性存储都是基于指针的(通过引用计数),因此每个消息只在磁盘上写入一次,即使它跨多个队列复制。(与将每个副本写入磁盘的Rabbit不同)


将更多消费者/订阅者添加到
qb
将动态平衡所有消费者/订阅者的负载。

因此,解决方案看起来像是添加一个队列作为主题订阅者,以便在同一服务的多个节点之间平衡消息

通过这种方式,我应该知道我是否会扩展该服务,因为它将改变我关于如何使用MessageBroker客户端API的编程模型

-最佳做法是什么?不要直接使用主题订阅,而是在中间放置一个队列,以便最终在不同节点中扩展接收者(

)。 正如我所见,Solace提供了一种将队列声明为主题订阅并使用队列中的消息的方法。Azure服务总线和Rabbit MQ如何,我可以用那种方式配置它们吗


感谢您的耐心

因此,解决方案看起来像是添加一个队列作为主题的订户,以便在同一服务的多个节点之间平衡消息

通过这种方式,我应该知道我是否会扩展该服务,因为它将改变我关于如何使用MessageBroker客户端API的编程模型

-最佳做法是什么?不要直接使用主题订阅,而是在中间放置一个队列,以便最终在不同节点中扩展接收者(

)。 正如我所见,Solace提供了一种将队列声明为主题订阅并使用队列中的消息的方法。Azure服务总线和Rabbit MQ如何,我可以用那种方式配置它们吗


谢谢你的耐心

谢谢!我用错了放大法(我的英语语法错误)。我的意思显然是水平缩放,这是d