具有扇出负载平衡的托管消息代理,每个消息到每个消费者组只进行一次负载平衡



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

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( 我尝试过AmazonMQ,但它不支持#3(他们说发送到多个队列和/或使用选择器,但这需要在每次添加或删除消费者时更改和重新启动生产者,并完全打破了问题的隔离(#5似乎也不起作用。

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

4( 我很喜欢RabbitMQ,但它不受管理。

事实证明,所需的行为在以下两种情况下都可用:

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

2( 开箱即用的谷歌Pub/Subhttps://cloud.google.com/pubsub/docs/overview

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

最新更新