我一直致力于通过RabbitMQ获得一些分布式任务。
我花了一些时间试图让芹菜做我想做的事,但没能让它工作。
然后我试着用Pika,一切都很好,完美无瑕,几分钟内就完成了。
用Pika代替芹菜,我错过了什么吗?
pika提供的只是芹菜所做的一小部分。Pika是用于与RabbitMQ交互的Python库。RabbitMQ是一个消息代理;在其核心,它只是向队列发送消息/从队列接收消息。它可以用作任务队列,但也可以仅用于在进程之间传递消息,而无需实际分配"工作"。
芹菜实现了一个分布式任务队列,可以选择使用RabbitMQ作为IPC的代理。它不仅提供了在进程之间发送消息的方法,还提供了在进程之间分配实际任务/作业的系统。芹菜的网站是这样描述它的:任务队列被用作跨线程分配工作的机制或机器。任务队列的输入是一个专用的工作单元,称为任务然后工作进程不断地监视队列以获取新工作执行。
芹菜通过消息进行通信,通常使用代理进行中介在客户和工人之间。要启动一个任务,客户端需要放置一个消息,则代理将该消息传递给工人。芹菜系统可以由多个工人和经纪人组成,给出实现高可用性和水平扩展。
芹菜有一大堆内置的功能,这些功能超出了pika的范围。您可以查看芹菜文档来了解它所能做的事情,但这里有一个示例:
>>> 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+1
, 2+2
, 3+3
等相加的工作分配为10个块,并将每个块分配给尽可能多的Celery worker。每个worker将在其10个项目块上运行add
,直到所有工作完成。然后通过res.get()
调用收集结果。我相信您可以想象一种使用pika完成此任务的方法,但我相信您也可以想象需要做多少工作。使用芹菜,您可以获得开箱即用的功能。
如果需要,当然可以使用pika来实现分布式任务队列,特别是当您有一个相当简单的用例时。芹菜只是提供了一个"包含电池"的解决方案,用于任务调度、管理等,如果你决定要在你的皮卡解决方案中使用它们,你必须手动实现。
我要在这里添加一个答案,因为这是今天第二次有人在不需要的时候推荐芹菜,基于这个答案,我怀疑。因此,分布式任务队列和代理之间的区别在于,代理只是传递消息。不多不少。芹菜建议使用RabbitMQ作为IPC的默认代理,并将其置于适配器之上,以管理带有守护进程的任务/队列。虽然这对于分布式任务特别有用,因为您需要非常快速的通用内容。它只是发行商/消费者流程的结构。在实际任务中,你已经定义了工作流,需要根据你的特定需求逐步完成,并确保消息的持久性,你最好编写自己的发布者/消费者,而不是依赖于芹菜。显然,你仍然需要做所有的耐久性检查等等。对于大多数与web相关的服务,人们并不控制实际的"工作"单元,而是将它们传递给服务。因此,对于分布式任务队列来说,它没有什么意义,除非你基于ip/地理区域或账号达到了一些任意的API调用限制……或者类似的东西。因此,使用芹菜并不会阻止你编写或处理状态代码或工作流管理等,它以一种容易的方式暴露了AMQP,使你可以避免编写发行者/消费者代码的结构。
所以简而言之,如果你需要一个简单的任务队列来完成工作,并且你并不真正关心性能的细微差别,通过你的工作流或实际的发布/消费过程的持久性的复杂性。芹菜的作品。如果你只是将消息传递给一个你实际上无法控制的api或服务,当然,你可以使用芹菜,但你也可以在几分钟内用Pika轻松地创建自己的发布者/消费者。如果您需要一些健壮的东西或者符合您自己的持久性场景,请像其他人一样编写您自己的发布/消费者代码。