芹菜RabbitMQ中的一条消息可以同时被两个或多个工人使用吗?

2024-04-19 20:09:24 发布

您现在位置:Python中文网/ 问答频道 /正文

也许我问这个问题有点傻,但在我做进一步的工作之前,我需要先把我的头脑集中在基本概念上。在

我正在处理几千个RSS提要,使用多个celerry worker节点和一个RabbitMQ节点作为代理。每个提要的URL都作为消息写入队列中。工作线程只是从队列中读取URL并开始处理它。我必须确保单个RSS源不会同时被两个工作人员处理。

本文Ensuring a task is only executed one at a time提出了一种基于Memcahced的解决方案,用于在处理feed时锁定feed。在

但我试图理解的是,为什么我需要使用Memcached(或其他东西)来确保RabbitMQ队列上的消息不会同时被多个worker使用。在RabbitMQ(或Celery)中有没有一些配置更改可以实现这个目标?在


Tags: 消息url代理task节点队列feedrabbitmq
3条回答

在正常工作设置中,单个MQ消息肯定不会被多个使用者看到。您将不得不为涉及失败/崩溃的工作人员、阅读自动确认和消息拒绝的情况做一些工作,但基本情况是合理的。在

我在您链接的文章中没有看到同步队列(read:MQ),因此(据我所知)他们正在使用锁机制(read:memcache)进行同步,作为替代。我可以想到一些在正确的MQ设置中不存在的问题。在

正如其他人所说的那样,你正在混合苹果和橘子。在

作为芹菜任务和MQ消息。在

您可以确保消息在同一时间只由一个工作线程处理。在

例如

@task(...)
def my_task(

my_task.apply(1)

apply将消息发布到您正在使用的消息代理(rabbit、redis…)。 然后,消息将被路由到队列,一次由一个工作线程使用。您不需要为此锁定,您可以免费获得它:)

芹菜食谱上的例子展示了如何防止两条类似的信息(我的_任务.应用(1) )同时运行,这是您需要在任务本身中确保的。在

你需要一些东西,你可以从所有工人(memcached,redis…)访问,因为他们可能运行在不同的机器上。在

上面提到的示例通常用于其他目标:它阻止您处理具有相同含义的不同消息(不是相同的消息)。例如,我有两个进程:第一个进程将一些URL放入队列,第二个进程从队列中获取URL并获取它们。如果第一个进程将一个URL放入队列两次(甚至更多次),会是什么情况?在

为此,我使用Redis存储和setnx操作(只能设置一次密钥)。在

相关问题 更多 >