【问题标题】:Protocol for retrieving and publishing messages (message queues without the pub/sub)用于检索和发布消息的协议(没有 pub/sub 的消息队列)
【发布时间】:2023-03-15 09:18:01
【问题描述】:

是否有我可以像邮箱一样使用的消息传递解决方案(最好支持 Python),例如从任何给定队列中检索消息而无需订阅?我想消息队列可以工作,但我必须反复订阅,从队列中抓取消息,然后取消订阅,这听起来不是最佳选择。

【问题讨论】:

    标签: python email scalability message-queue messaging


    【解决方案1】:

    大多数(如果不是全部)消息传递解决方案支持两种消息传递模式

    • 发布\订阅——即需要订阅才能获取消息。

    • 排队 - 一方向队列发送消息,另一方从队列中读取消息 - 无需订阅,消息在读取时被使用。

    实际上,标准队列比发布订阅更常见 - 您更有机会找到支持队列但不支持 pub\sub 的工具,然后找到支持 pub\sub 但不支持队列的工具。

    您可能正在寻找第二种模式

    【讨论】:

      【解决方案2】:

      RabbitMQ - http://www.rabbitmq.com

      ZeroMQ - http://www.zeromq.org

      亚马逊 SQS - http://aws.amazon.com/sqs

      这三个都有 python 库。 前两个是免费的。如果您不发送和接收数百万条消息,SQS 成本相当低,它具有高可用性的优势,并且您无需自己进行主机管理。

      关于订阅和取消订阅,如果您从队列中拉出消息而不是让队列向您推送消息(发布/订阅),那么您就不是订阅和取消订阅。在上述所有示例中,您不会产生任何开销。

      【讨论】:

        【解决方案3】:

        有很多选择。这里有两个:

        1. 看看Redis。它有两个 Python 客户端库(参见 redis-pytxRedis)。您描述的操作(队列上类似邮箱的操作)可以通过在 Redis 中的列表上执行 blpop 来模拟。

        2. 另一个选项是RabbitMQpy-ampqlibtxAMQP 有很多 Python 客户端库。您可以通过执行basic.getbasic.ack 将其视为类似邮箱的队列(有关详细信息,请参阅this reference)。

        【讨论】:

        • 通过 Redis 或任何数据库模拟消息队列不是次优解决方案吗?毕竟,像 RabbitMQ 这样的专用消息队列已经解决了如果您自己模拟队列行为则必须自己解决的大部分问题。
        • 对于“次优”的定义是什么?队列是如何“模拟”的?你的意思是不需要确认吗?
        • 我的意思是,最好使用现有的队列实现,它可能处理最常见的问题和边缘情况,而不是自己实现。