如何通过Djang中的芹菜异步任务处理db条目的创建

2024-05-20 02:31:35 发布

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

我的系统从另一个来源接收有效载荷。此有效负载包含项目信息,包括品牌等。你知道吗

我把这个有效载荷保存在一个缓冲区里。缓冲区与芹菜任务异步处理。根据有效负载,我们创建条目或在必要时更新它们。这是通过使用原子事务来完成的,在原子事务中,我们创建项目、品牌和类别。你知道吗

我遇到的问题是,有可能两个缓冲区都有一个尚未在db中创建的品牌。在原子块内使用update或create检查它是否已经存在。因为两个缓冲区几乎完全同时异步运行,所以两个缓冲区都认为品牌还不存在。这意味着他们两个都试图创建品牌,并产生以下数据库错误:

postgres_1 | ERROR: duplicate key value violates unique constraint "catalogue_brand_name_key" postgres_1 | DETAIL: Key (name)=(Bic) already exists. postgres_1 | STATEMENT: INSERT INTO "catalogue_brand" ("id", "created_date", "modified_date", "name") VALUES ('c8e9f328-cee7-4b9b-ba45-268180c723d8'::uuid, '2018-12-28T08:08:51.519672+00:00'::timestamptz, '2018-12-28T08:08:51.519691+00:00'::timestamptz, 'Bic')

由于这是一个db级异常,我无法在代码中捕获它,缓冲区将被标记为已完成(因为代码中没有给出异常)。你知道吗

这里的简单解决方案是不异步运行缓冲区,而是一次只运行一个缓冲区。你知道吗

以下是我的代码:

@atomic
def create(self, data):

...


brand_obj = Brand.objects.update_or_create(
        name=brand['name'],
        defaults={
            'name': brand['name']
        }
     )[0]

...

通过以下方式调用:

process_incoming.delay(buffer.pk)

有没有可能异步运行缓冲区而不受db级别的限制?你知道吗


Tags: 项目key代码namedbcreateupdatepostgres