如今,将面向用户的逻辑(同步部分)与后端处理(异步部分)分开是一种常见的做法(在微服务架构中),以提高服务吞吐量、可靠性和用户体验。例如,在电子商务网站中,订单的接受方式是首先验证订单,然后将其存储在数据库中,同时及时响应用户。随后,订单处理(例如履行)通过事件驱动的工作流服务在后端异步执行。
异步处理方面通常实现为基于队列的处理系统,例如 Celery 等任务队列。
现在,我的问题围绕着如何保证订单持久化和任务入队的原子性。如果没有原子保证,可能会出现几个问题:
我有兴趣了解在此类场景中建立异步处理的广泛接受的行业解决方案。
附注值得注意的是,可以有一个守护进程来定期检查数据库中的新订单并将其放入任务队列中。但是,这种方法通常被认为是反模式,因为它会给数据库带来不必要的负载,并且本质上将数据库视为队列。此外,如果数据库是分布式和分片的,这种方法可能会变得棘手。
谢谢!
我建议你两种方法:
使用变更数据捕获 (https://en.wikipedia.org/wiki/Change_data_capture),它是执行操作时数据库发出的事件流。例如,PostgreSQL 公开了其预写日志记录机制 (https://www.postgresql.org/docs/current/wal-intro.html)。通过使用 Debezium (https://debezium.io/documentation/reference/stable/connectors/postgresql.html) 之类的工具,您可以将这些事件流式传输到 Kafka 主题或 RabbitMQ 队列。
首先写入消息队列,然后使用队列来更新数据库。