【问题标题】:Managed message broker with fanout load balancing exactly once per message to each consumer group具有扇出负载平衡的托管消息代理,每条消息仅对每个消费者组进行一次
【发布时间】:2023-04-02 22:49:01
【问题描述】:

我正在尝试找到一个在(我认为是)非常标准的用例中工作的托管扇出消息代理,但我找不到任何满足我需求的东西。这些是我的标准,按重要性排序:

1) 生产者和消费者的客户端都是 Python 3.7+。

2) 消息可以任意大。实际上,它们并不庞大,但可能大于 SQS 的 256KB 限制。将消息放入 S3 并发送对它们的引用是不切实际的,即使通过客户端库透明地管理也是如此。

3) 我的生产者需要能够将消息(特定类型)发送到单个目的地(针对该消息类型),并且完全与订阅该目的地的消费者(如果有的话)隔离。

4) 我的消费者应该能够订阅和取消订阅目的地/从目的地,而无需重新配置生产者中的任何内容。 (#3 几乎暗示了这一点,但 AWS 似乎并不这么认为。)

5) 出于性能原因(Python 通常需要多线程而不是多处理),并且可能来自不同的节点,可能需要使用任意数量的并行进程来实现给定的消费者应用程序。我想将给定消费者的所有并行进程视为一个逻辑订阅单元,并将每条消息负载平衡到该订阅单元的一个且只有一个消费者进程。

6) 如果消费者明确确认消息,或者在预期的时间范围内没有收到确认,则消息会立即重新传递给所有尚未确认的消费者组,而不是任何已经确认的消费者组。

7) 应该管理代理服务,即我可以将其视为黑匣子的 AWS 服务。

8) 理想情况下,目标是具有某种通配符机制的主题,可用于形成消息类型的层次结构(例如,booking-* 匹配 booking-xyz 和 booking-abc 等)。

注意事项:

1) 我试过 SNS+SQS,但它不能正常支持超过 256KB 的消息

2)我尝试过 Amazon MQ,但它不支持 #3(他们说发送到多个队列和/或使用选择器,但这需要在我每次添加或删除消费者并完全中断时更改并重新启动生产者隔离关注点)。 #5 似乎也不起作用。

3) 我想使用 Kinesis,但它似乎根本不支持扇出。

4) 我很喜欢 RabbitMQ,但它不是托管的。

【问题讨论】:

  • 你查过 cloudamqp... 吗?

标签: rabbitmq activemq message-queue publish-subscribe messagebroker


【解决方案1】:

事实证明,所需的行为在两者中都可用:

1) ActiveMQ 使用虚拟主题(在 AmazonMQ 中进行了一些重新配置)http://activemq.apache.org/virtual-destinations.html

2) 开箱即用的 Google Pub/Sub https://cloud.google.com/pubsub/docs/overview

谁知道? (显然不是 AWS。)

【讨论】:

    猜你喜欢
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多