gpt4 book ai didi

asynchronous - 当发布者提供有序消息时消费者的水平扩展

转载 作者:行者123 更新时间:2023-12-02 01:03:51 27 4
gpt4 key购买 nike

在面向服务的分布式架构中,假设我有一个生产者,它使用 RMQ 向消费者发送消息。

然后我们决定通过添加更多消费者来横向扩展我们架构的消费部分,但我们面临一些限制。

发布者在它发送的每条消息中都提供一个序列号。消费者根据其拥有的序列号处理消息非常重要。

每次处理给定的资源时,比如说 A,发布者都会发送 RMQ 消息说“嘿,让我们为 A 做序列 1”然后“嘿,让我们为 A 做序列 2”等等。

例如,如果发布者为 A 提供了 3 条消息,序列为 1、2 和 3,并且这 3 条消息被分发到我们消费者的 3 个不同实例。序列 2 的消息重新排队,直到序列 1 被很好地处理,序列 3 也是如此。

最后消息都得到了很好的处理,但是经过多次重试!如果我们有 100 个序列要消耗,这会在我们的系统中导致一些延迟,因为我们会重试多次。

一种可能的解决方案是确保给定资源的每组序列都必须由同一个使用者处理。但是我们怎样才能做到这一点呢?

我怎样才能避免重新排队以确保我们的消费者的每个实例总是得到有序的给定资源的消息?

最佳答案

请尝试以下操作:

  • 创建一个 topic exchange
  • 让你的生产者向它发送消息
    每个资源的主题:主题 A资源A , 话题 B为了
    资源B等等。
  • 让 1 个消费者听 1 个话题。为每个使用持久队列
    消费者,因此队列将在消费者重新启动后继续存在。如果你有
    生产者 -> 一个交换 -> 1 个队列 -> 1 个消费者消息路径,
    消息顺序是有保证的,见 RabbitMQ broker semantics
    详情。
  • 让您的消费者得到1 message at a time , 和 ack只有当
    处理完成。

  • 这有望为您提供所需的顺序处理,并且您不需要重新排队消息。

    请注意,有可能两次收到相同的消息 - 如果您的使用者在完成处理任务和 acking 之间死亡。消息。

    关于asynchronous - 当发布者提供有序消息时消费者的水平扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791411/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com