【问题标题】:Microservices Concurrent Payments on The Same Account同账户微服务并发支付
【发布时间】:2018-06-27 21:02:50
【问题描述】:
假设我们有一个交易微服务,它使用 mysql 作为数据存储将资金从一个账户转移到另一个账户。
假设有一个名为 K 的请求从账户 A 向账户 B 转账。同时还有另一个请求 Z 从账户 A 向账户 C 转账。我的问题是,当账户 B 在处理过程中被锁定时,事务微服务应该使用什么策略?请求 Z 是否应该超时并返回错误,是否应该请求 Z 尝试多次?
【问题讨论】:
标签:
concurrency
locking
microservices
【解决方案1】:
金融交易的解决方案是:
1.账户 A 上的任何交易都被放入队列中,该交易中必须有账户 A。让我们将此队列称为 QueueA。有一些代码将处理 QueueA 上的事务,可能是一个单独的线程。
2.如果有新的交易请求,请查看交易涉及的账户。如果有一个添加了其中一个帐户的队列,则将该事务添加到该队列中,如果没有,则创建一个新队列并在那里添加该事务。
这个想法是对同一帐户上的交易处理进行线性化处理。这可以防止数据库连接阻塞和超时。此外,通过在每个表上添加版本列来使用乐观数据库锁定。这可确保金融系统中的数据完整性,而不是可能导致数据库连接超时的悲观锁定。