也许我问这个问题有点傻,但在我做进一步的工作之前,我需要先把我的头脑集中在基本概念上。在
我正在处理几千个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)中有没有一些配置更改可以实现这个目标?在
在正常工作设置中,单个MQ消息肯定不会被多个使用者看到。您将不得不为涉及失败/崩溃的工作人员、阅读自动确认和消息拒绝的情况做一些工作,但基本情况是合理的。在
我在您链接的文章中没有看到同步队列(read:MQ),因此(据我所知)他们正在使用锁机制(read:memcache)进行同步,作为替代。我可以想到一些在正确的MQ设置中不存在的问题。在
正如其他人所说的那样,你正在混合苹果和橘子。在
作为芹菜任务和MQ消息。在
您可以确保消息在同一时间只由一个工作线程处理。在
例如
apply将消息发布到您正在使用的消息代理(rabbit、redis…)。 然后,消息将被路由到队列,一次由一个工作线程使用。您不需要为此锁定,您可以免费获得它:)
芹菜食谱上的例子展示了如何防止两条类似的信息(我的_任务.应用(1) )同时运行,这是您需要在任务本身中确保的。在
你需要一些东西,你可以从所有工人(memcached,redis…)访问,因为他们可能运行在不同的机器上。在
上面提到的示例通常用于其他目标:它阻止您处理具有相同含义的不同消息(不是相同的消息)。例如,我有两个进程:第一个进程将一些URL放入队列,第二个进程从队列中获取URL并获取它们。如果第一个进程将一个URL放入队列两次(甚至更多次),会是什么情况?在
为此,我使用
Redis
存储和setnx
操作(只能设置一次密钥)。在相关问题 更多 >
编程相关推荐