当前位置: 首页 > 知识库问答 >
问题:

为什么芹菜需要一个消息代理?

韩寒
2023-03-14

由于芹菜是作业队列/任务队列,因此名称说明了它可以维护其任务并处理它们。那么为什么它需要像rabbymq或redis这样的消息代理呢?

共有1个答案

伯丁雷
2023-03-14

Celery是一个分布式任务队列,这意味着该系统可以通过一条集中式总线驻留在多个位置的多台计算机(容器)上

基本架构如下:

工人-可以从总线(任务队列)中获取作业(数据)并对其进行处理的进程

*它可以将结果放回总线,以便由不同的工作人员进一步处理(创建处理流程)

bus-任务队列,这基本上是一个数据库,将作业存储为消息,以便工作人员可以检索它们,

实现一个并发的、非阻塞的数据库是很重要的,这样当一个进程从/向总线上获取或放置作业时,它不会阻塞其他工人获取/放置他们的作业。

RabbitMQRedisActiveMQ Kafka等是这种行为的最佳候选者。

总线有一个api,可以为工人提交作业并检索它们(在更复杂的功能中)

大多数总线都实现了ack/fail功能,因此工作人员可以确认正在完成的工作,或者如果没有ack(或报告失败),则可以将此消息再次发送给另一个工作人员,并且这次可能会成功处理,因此不会丢失数据…(这在很大程度上取决于故障转移逻辑和作为任务输入的数据上下文)

芹菜包括一个调度器(beat),它定期将特定作业放到总线上,从而创建一个定期任务

让我们以报废为例,你想报废世界,但中国只能允许来自其所在地区的流量,欧洲和美国也是如此,所以你可以建立一个工人,把他们安置在世界各地。

您只能使用一条总线,假设它位于美国,所有其他工人都知道这条总线并可以连接到它,因此通过将特定任务(报废中国)放在位于美国的总线上,中国的流程可以对其进行处理,因此是分布式的

当然,工作人员会增加系统的吞吐量,这只是由于并行性,与他们的地理位置无关,这是使用事件驱动架构(即中央总线、消费者和生产者)的常见情况

我建议阅读正式的文档,这很简单

 类似资料:
  • 我有一个标准脚本,可以抓取页面,启动与数据库的连接,并将数据库写入其中。我需要它在x小时后定期执行。我可以使用bash脚本和伪代码来做到这一点: 根据我对消息代理的了解,它们用于将“信号”从一个正在运行的程序发送到另一个程序,原则上就像HTTP一样。就像我有一段接受用户电子邮件ID的代码一样,它将带有email-id的信号发送到另一段将发送电子邮件的代码。 我需要芹菜来运行heroku的定期任务。

  • 我是芹菜、Redis和RabbitMQ的新手。 目前,我正在使用RabbitMQ作为消息代理,并且在配置中没有设置任何内容。(使用Django、MySQL) 我想知道是否有可能使用Redis作为后端的结果存储,同时将RabbitMQ用作消息代理。 我知道的只是添加一些设置,

  • 问题内容: 我知道我有一个空指针,但不知道它在哪里发生或为什么发生。希望在这里得到一些帮助。 文件courseDBopenHelper courseDataSource.java course.java 错误日志 问题答案: 你的错误很明显 您必须为日志消息提供一条消息。不能为空。 应该

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的

  • 现在,我想将< code>register事件发布到某个特殊的交换,我可以使用celery远程检索和处理它。 实际上,我已经使用了函数来实现这一点,但是它必须传递来指示应该执行哪个任务并消费它。所以它似乎不太适合我的目标。 我想要的就是这样: 向某些发布消息; 远程机器1订阅此或并捕获消息,用于执行任务; 远程机器2-与机器1相同但执行另一个任务-接收(可能需要回复某些) 例如,就像这个工作流一样

  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使