将事务存储到 NoSQL 数据库中
Storing transactions into a NoSQL Database
我们正在计划下一个项目并考虑将事务存储到 NoSQL 数据库中。基本上它是一个应用程序,用户可以在其中收集一些积分(如回报),然后用积分支付。
主要想法是将交易本身存储到 noSQL 数据库中,mysql服务器只存储当前余额。
所以我的问题是这是处理该问题的好方法还是我应该只使用 mysql 数据库?
我考虑使用 noSQL 的问题是,我们假设在短时间内有很多查询。
使用多语言持久性会增加操作负载,因此如果可以用一个数据存储来解决任务,那么最好不要引入额外的实体。
在您的情况下,您似乎希望拥有可审计的交易历史记录、一致的当前余额并且您不想放弃交易保证。的确,几乎所有现代 NoSQL 解决方案都不支持开箱即用的 ACID 事务,但它们中的大多数都支持允许您在应用程序级别实现事务的原语。
如果数据存储支持每个键的线性化和比较并设置(文档级原子性),那么它就足以实现客户端事务,而且您还有几个选项可供选择:
如果你需要Serializable隔离级别那么你可以遵循Google用于Percolator system or Cockroach Labs for CockroachDB. I've blogged about it and create a step-by-step visualization的相同算法,我希望它能帮助你理解背后的主要思想算法。
如果您预计会有高争用,但您可以使用 Read Committed 隔离级别,那么请查看 Peter Bailis 的 RAMP transactions。
第三种方法是使用补偿事务,也称为 saga 模式。在 80 年代后期的 Sagas paper but became more actual with the raise of distributed systems. Please see the Applying the Saga Pattern 灵感演讲中对其进行了描述。
我们正在计划下一个项目并考虑将事务存储到 NoSQL 数据库中。基本上它是一个应用程序,用户可以在其中收集一些积分(如回报),然后用积分支付。
主要想法是将交易本身存储到 noSQL 数据库中,mysql服务器只存储当前余额。
所以我的问题是这是处理该问题的好方法还是我应该只使用 mysql 数据库?
我考虑使用 noSQL 的问题是,我们假设在短时间内有很多查询。
使用多语言持久性会增加操作负载,因此如果可以用一个数据存储来解决任务,那么最好不要引入额外的实体。
在您的情况下,您似乎希望拥有可审计的交易历史记录、一致的当前余额并且您不想放弃交易保证。的确,几乎所有现代 NoSQL 解决方案都不支持开箱即用的 ACID 事务,但它们中的大多数都支持允许您在应用程序级别实现事务的原语。
如果数据存储支持每个键的线性化和比较并设置(文档级原子性),那么它就足以实现客户端事务,而且您还有几个选项可供选择:
如果你需要Serializable隔离级别那么你可以遵循Google用于Percolator system or Cockroach Labs for CockroachDB. I've blogged about it and create a step-by-step visualization的相同算法,我希望它能帮助你理解背后的主要思想算法。
如果您预计会有高争用,但您可以使用 Read Committed 隔离级别,那么请查看 Peter Bailis 的 RAMP transactions。
第三种方法是使用补偿事务,也称为 saga 模式。在 80 年代后期的 Sagas paper but became more actual with the raise of distributed systems. Please see the Applying the Saga Pattern 灵感演讲中对其进行了描述。