由于芹菜是一个作业队列/任务队列,名称说明它可以维护其任务并处理它们。那为什么它需要像 rabbitmq 或 redis 这样的消息代理呢?
Celery 是一个分布式任务队列,这意味着系统可以使用单个集中式总线驻留在多个位置的多台计算机(容器(上
基本架构如下:
worker- 可以从总线(任务队列(获取作业(数据(并对其进行处理的进程
*它可以将结果放回总线中,以便由不同的工作人员进行更进一步的处理(创建处理流程(
bus- 任务队列,这基本上是一个将作业存储为消息的数据库,因此工作人员可以检索它们,
实现并发和非阻塞数据库非常重要,因此当一个进程从总线上获取或放置作业时,它不会阻止其他工作线程获取/放置其作业。
RabbitMQ
、Redis
、ActiveMQ
Kafka
等都是这种行为的最佳候选者。
总线有一个API,可以为工人提交工作并检索它们(以及更复杂的功能(
大多数总线都实现了 ACK/fail 功能,因此工作人员可以确认他们的工作正在完成,或者如果没有 ACK(或报告失败(,此消息可以再次提供给另一个工作人员,并且这次可能会成功处理,因此不会丢失任何数据...(这在很大程度上取决于故障转移逻辑和数据作为任务输入的上下文(
Celery
包括一个scheduler
(节拍(,该(节拍(定期将特定作业放在总线上,从而创建定期任务
让我们举一个报废的例子,你想报废世界,但中国只能允许来自其地区的流量,欧洲和美国也是如此 所以你可以建立一个工人,并把他们安置在世界各地
你只能使用一辆公共汽车,假设它位于美国,所有其他工人都知道这辆公共汽车并且可以连接到它,所以通过在位于美国的公共汽车上放置一个特定的工作(废瓷(,中国的流程可以在它上面工作,因此分布式
当然,工作人员将增加系统的吞吐量,只是由于并行性,与其地理位置无关,这是使用事件驱动架构(即中央总线,消费者和生产者(的常见情况。
我建议阅读正式文档,这很简单