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

Jas*_*ion 17 python rabbitmq task-queue celery pika

我一直致力于通过RabbitMQ来完成一些分布式任务.

我花了一些时间试图让Celery做我想做的事情,但却无法让它发挥作用.

然后我尝试使用Pika和刚刚工作的东西,完美无缺,几分钟之内.

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

dan*_*ano 22

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

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

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

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

Celery通过消息进行通信,通常使用经纪人在客户和工人之间进行调解.为了启动任务,客户端将消息放入队列,然后代理将消息传递给工作者.

Celery系统可以由多个工作人员和经纪人组成,让位于高可用性和水平扩展.

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

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

这段代码想要添加x所在的每个x + y,range(0, 100)而y在其中range(0,100).它通过利用一个称为任务做到这一点add,这两个数相加,和分发的添加工作1+1,2+2,3+3,等成10块,并且有可用的每个块分配到尽可能多的芹菜工人.每个工作人员将运行add其10个项目块,直到所有工作完成.然后通过res.get()电话收集结果.我相信你可以想象一种使用鼠兔的方法,但我相信你也可以想象需要做多少工作.您正在使用Celery开箱即用.

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


Chr*_*sol 14

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

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