RabbitMQ:芹菜提供什么Pika没有?

时间:2014-05-20 17:50:55

标签: python rabbitmq celery task-queue pika

我一直在努力通过RabbitMQ来完成一些分布式任务。

我花了一些时间试图让芹菜做我想做的事情而且无法使它发挥作用。

然后我尝试使用Pika和完美无缺的事情,并在几分钟内完成。

使用Pika而不是Celery,有什么我错过的吗?

2 个答案:

答案 0 :(得分:20)

什么鼠兔提供的只是芹菜正在做的一小部分。 Pika是用于与RabbitMQ交互的Python库。 RabbitMQ是一个消息代理;在其核心,它只是向队列发送消息/从队列接收消息。它可以用作任务队列,但也可以用于在进程之间传递消息,而不实际分发“工作”。

Celery实现分布式任务队列,可选择使用RabbitMQ作为IPC的代理。它提供了一个在进程之间分配实际任务/作业的系统,而不仅仅是提供一种在进程之间发送消息的方法。以下是Celery网站的描述:

  

任务队列用作跨线程分配工作的机制   或机器。

     

任务队列的输入是一个工作单元,称为任务,专用   然后,工作进程会不断监视队列中的新工作   执行。

     

Celery通过消息进行通信,通常使用经纪人进行调解   客户和工人之间。要启动任务,客户会提出一个   然后,代理将队列中的消息传递给队列   工人。

     

芹菜系统可以由多个工人和经纪人组成   高可用性和水平扩展的方法。

Celery内置了一大堆功能,超出了pika的范围。您可以查看Celery docs以了解它可以执行的操作,但这是一个示例:

>>> from proj.tasks import add

>>> res = add.chunks(zip(range(100), range(100)), 10)()
>>> res.get()
[[0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
 [20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
 [40, 42, 44, 46, 48, 50, 52, 54, 56, 58],
 [60, 62, 64, 66, 68, 70, 72, 74, 76, 78],
 [80, 82, 84, 86, 88, 90, 92, 94, 96, 98],
 [100, 102, 104, 106, 108, 110, 112, 114, 116, 118],
 [120, 122, 124, 126, 128, 130, 132, 134, 136, 138],
 [140, 142, 144, 146, 148, 150, 152, 154, 156, 158],
 [160, 162, 164, 166, 168, 170, 172, 174, 176, 178],
 [180, 182, 184, 186, 188, 190, 192, 194, 196, 198]]

此代码想要添加每个x + y,其中x在range(0, 100)中,y在range(0,100)中。它通过执行名为add的任务来执行此操作,该任务会添加两个数字,并将添加1+12+23+3等的工作分配到10个块中,并将每个块分配给尽可能多的芹菜工人。每个工作人员将在其10个项目块上运行add,直到所有工作完成。然后通过res.get()调用收集结果。我相信你可以想象一种使用鼠兔的方法,但我相信你也可以想象需要做多少工作。您正在使用Celery开箱即用。

如果需要,您当然可以使用pika来实现分布式任务队列,特别是如果您有一个相当简单的用例。 Celery只提供“电池包含”解决方案,用于任务安排,管理等,如果您决定使用pika解决方案,则必须手动实施。

答案 1 :(得分:14)

我将在这里添加一个答案,因为这是今天第二次根据我怀疑的答案,有人根据需要推荐了芹菜。因此,分布式任务队列和代理之间的区别在于代理只是传递消息。没有更多,没有更少。 Celery建议使用RabbitMQ作为IPC的默认代理,并放置在该适配器之上,以使用守护进程管理任务/队列。虽然这对于需要非常快速通用的分布式任务尤其有用。它只是为发布者/消费者流程构建的。您已定义工作流程的实际任务需要逐步完成并根据您的特定需求确保消息持久性,您最好不要依赖芹菜来编写自己的发布者/消费者。显然你仍然需要进行所有的耐久性检查等。对于大多数与Web相关的服务,人们不会控制实际的“工作”单位,而是将它们传递给服务。因此,对于分布式任务队列来说没有多大意义,除非您根据ip /地理区域或帐号来达到某个任意的API调用限制......或者沿着这些行。因此,使用celery不会阻止您编写或处理状态代码或工作流管理等,并且它会以一种让您轻松避免编写发布者/消费者代码构造的方式公开AMQP。

因此,简而言之,如果您需要一个简单的任务队列来咀嚼工作,您并不真正关心性能的细微差别,通过您的工作流程或实际的发布/消费流程的复杂性。芹菜的作品。如果您只是将消息传递给api或服务而您实际上无法控制,当然,您可以使用Celery,但您可以在几分钟内轻松地用Pika鞭打您自己的发布者/消费者。如果您需要强大的东西或符合您自己的耐久性场景,请像其他人一样编写您自己的发布/消费者代码。