代码之家  ›  专栏  ›  技术社区  ›  codeme

如何确保只有一个消费者实际使用已发布的消息?

  •  0
  • codeme  · 技术社区  · 6 年前

    我将Rabbitmq与微服务体系结构结合使用。我的许多用例都使用topic和directexchange,而且效果很好。然而,我有一个用例,我必须从数据库中删除一条记录。当我删除记录时,需要调用几个其他服务,并维护/删除引用的记录。我可以通过使用直接交换简单地调用这些服务来实现这一点,但我了解到这是编舞,而不是编排。这意味着我应该实现发布/订阅模式(rabbitmq中的扇出)。 我的问题是,如果在分布式系统中使用发布/订阅模式,如何确保只有一个服务实例使用发布的消息?

    2 回复  |  直到 6 年前
        1
  •  5
  •   theMayer    6 年前

    您的问题不涉及发布-订阅,而涉及基本的消息处理。最基本的问题是您是否可以保证一个操作只执行一次。简而言之,您可能希望使用直接交换,以便消息进入一个队列并由一个(可能是多个)使用者处理。

    出身背景

    最好的做法是将消息处理作为

    此外,您应该知道,不可能保证“一次准确”交付。从数学上讲,这是无法保证的。相反,您可以有两件事中的一件(相互排斥):

    • 至少一次交付(1<=n)

    从RabbitMQ文档中:

    使用确认可保证至少一次交付。如果没有确认,在发布和使用操作期间可能会丢失消息,并且最多只能保证一次传递。

    设计含义

    鉴于上述情况,您的设计依赖于“至少一次”交付是很重要的。对于删除操作,这涉及将该操作的定义重新写入断言而不是过程(例如“删除”) “变成”确保

        2
  •  1
  •   piradian    6 年前

    我想您应该为每个服务都有一个单独的队列,该服务实例应该得到关于数据库记录删除的通知。交换器在所有队列中放置消息的副本。服务实例竞争对专用队列的访问(只有一个实例获得消息)。