Django Celery-由于员工众多而创建重复用户

时间:2019-01-01 10:39:54

标签: django celery

我在生产芹菜时遇到了一个奇怪的问题。目前,生产服务器上有4位芹菜工人,这些工人处理我django应用程序注册的所有任务。没有定义自定义队列。工人基本上是4个独立的主管conf文件。

现在,在我的应用程序中,我正在处理facebook webhook数据,并且希望具有特定FacebookID的用户只能在后端创建一次。但是,最近我检查了一下,发现有些用户具有相同的FacebookID,这本不应该发生。

我认为发生的事例如FacebookID 666的用户向我发送了一个webhook数据。现在,创建了一个任务,该任务将在我的数据库中使用FacebookID 666创建一个新的用户实例。现在,在用户在我的数据库中创建该用户之前,该用户用另一个数据打了我,这也创建了一个任务,但使用了另一个工作人员,因此,我让两个用户使用了相同的FacebookID。

有什么方法可以配置celery来处理具有特定FacebookID的用户,使其仅在ONE worker中创建任务?还是我完全误判了这里的情况?

1 个答案:

答案 0 :(得分:0)

本质上,您需要一个用户级别的分布式锁,以防止多个工作人员在同一用户上工作。有几种方法可以完成此操作,最直接的方法是使用mysql或redis等数据库。在mysql中,第一个过程将以交易方式(1)检查具有用户ID(例如电子邮件或其他唯一标识符)的数据库表中的现有行,以及(2)如果不存在该行,则创建该行; (3)并且如果存在一行,请尽早返回而无需执行任何操作。您也可以使用redlock在redis中执行此操作,或者对于仅使用SETNX的较小系统也可以执行此操作