使用异步任务排队进行原子数据库写入

问题描述 投票:0回答:1

如今,将面向用户的逻辑(同步部分)与后端处理(异步部分)分开是一种常见的做法(在微服务架构中),以提高服务吞吐量、可靠性和用户体验。例如,在电子商务网站中,订单的接受方式是首先验证订单,然后将其存储在数据库中,同时及时响应用户。随后,订单处理(例如履行)通过事件驱动的工作流服务在后端异步执行。

异步处理方面通常实现为基于队列的处理系统,例如 Celery 等任务队列。

现在,我的问题围绕着如何保证订单持久化和任务入队的原子性。如果没有原子保证,可能会出现几个问题:

  • 如果入队发生在DB持久化之后。那么如果服务在数据库持久化之后和任务排队之前崩溃,那么该订单可能会保持未处理状态。
  • 如果入队发生在数据库持久化之前,并且任务可能在数据库提交之前处理,则可能在数据库中找不到该订单。

我有兴趣了解在此类场景中建立异步处理的广泛接受的行业解决方案。

附注值得注意的是,可以有一个守护进程来定期检查数据库中的新订单并将其放入任务队列中。但是,这种方法通常被认为是反模式,因为它会给数据库带来不必要的负载,并且本质上将数据库视为队列。此外,如果数据库是分布式和分片的,这种方法可能会变得棘手。

谢谢!

asynchronous queue microservices task atomic
1个回答
0
投票

我建议你两种方法:

© www.soinside.com 2019 - 2024. All rights reserved.