【问题标题】:Django Celery - Creating duplicate users due to mutiple workersDjango Celery - 由于多个工作人员而创建重复用户
【发布时间】:2019-05-28 10:04:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在点击时禁用注册按钮,这样用户就不会点击两次,以及其他避免重复表单提交的一般方法(隐藏输入中的唯一 ID 等)-@987654321 @
  • 你为你的经纪人使用什么?
  • @WiggyA。这是一个 facebook webhook,每次用户在页面上发送消息时,这些数据都会到达我的服务器
  • @2ps rabbitmq 代理
  • 在您的数据库中将your_facebook_id_keeper_field 设置为unique=True 怎么样?

标签: django celery


【解决方案1】:

本质上,您需要一个用户级分布式锁来防止多个工作人员在同一个用户上工作。有几种方法可以实现这一点,最直接的方法是使用 mysql 或 redis 等数据库。在 mysql 中,第一个进程将事务性地 (1) 检查数据库表中具有用户 ID(例如,电子邮件或其他唯一标识符)的现有行,以及 (2) 如果不存在行,则创建该行; (3) 如果存在一行,则提前返回而不做任何事情。你也可以在 redis 中使用 redlock 或在较小的系统中使用 SETNX

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 2020-01-28
    • 2021-09-08
    • 2021-08-18
    • 2013-02-18
    • 1970-01-01
    • 2018-07-18
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多