我的系统从另一个来源接收有效载荷。此有效负载包含项目信息,包括品牌等。你知道吗
我把这个有效载荷保存在一个缓冲区里。缓冲区与芹菜任务异步处理。根据有效负载,我们创建条目或在必要时更新它们。这是通过使用原子事务来完成的,在原子事务中,我们创建项目、品牌和类别。你知道吗
我遇到的问题是,有可能两个缓冲区都有一个尚未在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级别的限制?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐