了解队列(芹菜等)的工作原理?

时间:2013-08-13 10:57:38

标签: rabbitmq celery message-queue resque amazon-sqs

我一直在阅读很多关于队列的事情并且让自己感到困惑。我会记下我所知道的内容,如果我理解正确,请告诉我。

队列基本上可以帮助您在请求 - 响应周期之外执行操作。这意味着,如果客户端上传了图像,并且您想要保存图像的缩略图版本,则不希望让客户端等待图像被剪裁的时间,然后返回给他,你要做的就是请求 - 响应周期,通过队列。队列几乎就像传统的数据结构队列,首先是排在第一位。

这些队列的热门解决方案提供商是celerypyres,&亚马逊广场

队列如何工作?

通常会有一个守护进程在运行,例如,如果有芹菜,那么就会有一个芹菜守护进程运行,并继续对队列顶部的任何任务进行计算。 (希望我是对的)

另一个例子,稍微复杂一点,请在此纠正我。

现在说我想自动执行以下任务:

  1. 12月25日发送邮件给我的一位朋友。

  2. 祝她的朋友在12月26日生日。

  3. 希望另一位朋友在12月26日生日。

  4. 在这种情况下,我将采取以下措施:

    1. 创建一个条目,并在数据库中。

    2. 创建条目后,对该条目进行排队。

    3. 解雇将执行该任务的工作人员。

    4. 现在有疑问,第3步是否正确?

      是否有长期投票工作人员会采取行动? 这是如何运作的?我很迷惑。或者我是否需要运行cron作业,这将继续触发脚本 检查队列中是否有任何内容,如果是,则给定时间(精确度为分钟),然后解雇工作人员。

      当你看到芹菜的文档时,他们需要一个后端 - redis,mongodb,sqs等。所以如果我是对的,那么会有一个连续的进程,它将作为守护进程运行,并将跟踪事物在队列中(redis,mongodb)并且应该执行。这是灰色区域。请帮忙。

      感谢您的回答。

1 个答案:

答案 0 :(得分:0)

使用Celery有两种基本方法。我们假设您正在使用Celery + Rabbitmq

  1. 执行长时间运行的任务(>您不希望让客户端等待工作完成时间。) 您可以从Web请求中执行的代码中运行celery任务。这意味着您的任务将序列化为消息,并将被发送到Rabbit服务器的队列。 其他进程(Celery进程),有一个消息,当消息进入队列时将被初始化。 Celery worker获取此消息,对其进行反序列化,并在其他线程中执行您的任务。就是这样。

  2. 您可以通过cron启动Celery作业(它只会更改为Celery创建任务的发件人,但所有其他内容都相同)

  3. P.S。如果你使用的不是RabbitMq,比如Database,Memcached as Broker。 Celery将每N秒或毫秒进行读取。等