【问题标题】:Queueing: N producers to N consumers排队:N 个生产者到 N 个消费者
【发布时间】:2012-02-23 18:25:15
【问题描述】:

要求如下:

  • 有 N 个生产者,它们生成消息或作业或任何您想调用的名称。
  • 来自每个生产者的消息必须按顺序处理,并且每条消息必须只处理一次。
  • 还有一个限制:在任何时候,对于任何给定的生产者,处理的消息都不得超过一条。
  • 消费端由分布在多个进程中的多个线程(它们的功能相同)组成 - 它是一个通过 mod_wsgi 运行的 WSGI 应用程序。

目前,消费端的排队是作为自定义队列实现的,它是Queue 的子类,但它有它自己的问题,我不会深入探讨,主要问题是在进程重新启动它的队列时丢失了。

是否有一种产品可以满足我上面列出的要求?对持久性的支持会很好,尽管这并不是那么重要(因为队列将不再驻留在工作进程的内存中)。

【问题讨论】:

标签: python queue message-queue beanstalkd


【解决方案1】:

有许多产品可以满足您的需求。有 Django 经验的人可能会告诉你“芹菜”,但这不是一个完整的答案。 Celery 是实际排队系统的(有用的)包装器,使用包装器并不意味着您不必考虑底层技术。

ZeroMQ、Redis 和 RabbitMQ 是我想到的几种不同的解决方案。当然还有更多的选择。我相当肯定,没有排队解决方案将支持您的“在任何时候对于任何给定的生产者,必须处理的消息不得超过一条”作为配置参数的要求;您可能应该在生产者处实施此要求(即,在您收到作业 #1 已完成的确认之前不要提交作业 #2)。

Redis 不是真正的排队系统,而是一个非常快的数据库,具有 pub/sub 特性;尽管您可以使用 Redis pub/sub 将作业发布到单个订阅者,然后将它们作为列表(穷人的队列)。然后,您的消费者会自动从列表中拉出一份工作。如果你想走这条路,它会起作用。

RabbitMQ 是一个“企业”排队系统,绝对可以满足您的要求,但是您必须在某个地方部署 RabbitMQ 服务器,这可能有点矫枉过正。作为记录,我在许多项目中使用 RabbitMQ,它完成了工作。设置“直接”类型的交换,将其绑定到单个队列,并将所有消费者订阅到该队列。你也可以从 RabbitMQ 获得很好的持久性。

ZeroMQ 有一个非常灵活的队列模型,ZeroMQ 绝对可以做你想做的事。然而,ZeroMQ 基本上只是一种传输机制,所以当涉及到让你的发布者和订阅者以及一个代理来分发它们时,你最终可能会自己滚动。

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2018-03-07
    • 2023-03-06
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多