我想创建一个支付系统,我选择mongodb作为数据库 我想知道如何实现高一致性?
我想使用多文档交易,但是当我设置了副本集时,secondaries节点可能具有 stale 文档,如果我从陈旧的doc中读取,则我的系统坏了
在mongodb文档中,https://docs.mongodb.com/manual/replication/#read-operations
默认情况下,客户端从主数据库[1]读取数据;但是,客户端可以指定读取首选项,以将读取操作发送到辅助对象。异步复制到辅助数据库意味着从辅助数据库读取的数据可能会返回不反映主数据库上数据状态的数据。
AND
[1](1、2)在某些情况下,副本集中的两个节点可能会短暂地认为它们是主要节点,但是最多,其中一个将能够完成{{w:“ majority”写下关注。可以完成{w:“ majority”}写入的节点是当前的主节点,另一个节点是以前的主节点,由于网络分区,该主节点尚未意识到其降级。发生这种情况时,尽管已请求前一个主服务器读取优先级,但连接到前一个主服务器的客户端仍可能会观察到过时的数据,并且对前一个主服务器的新写入最终将回滚。
即使我强迫客户端从主服务器读取数据,在某些情况下,副本集中的两个节点也可能会暂时认为它们是主服务器,因此客户端可能会观察到陈旧数据
如何在mongoDb中设计支付系统?一致性非常重要
答案 0 :(得分:1)
在某些情况下,副本集中的两个节点可能会暂时认为它们是主要节点,因此客户端可能会观察到陈旧数据
要获得与multi-document
的高度一致性,可以使用Multi-document transactions(MongoDB v4.0 +)。
您可以指定不同的transaction read concern来控制读取数据的一致性和隔离性。
设置read concern to majority 和 write concern to majority,以确保事务操作已读取多数提交的数据。
如何在mongoDb中设计支付系统?
这是一个广泛的问题,因为它取决于需求和用例等。如果您能够以使用single-document
模型的方式修改data model design,则也可以考虑使用causal consistency。
因果一致的会话表示读取和确认的写操作的关联序列具有因果关系,这由它们的顺序反映出来。应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。
答案 1 :(得分:0)
查看是否要使用MongoDB数据库构建支付系统,您需要在某种程度上手动维护交易。
建议的解决方案:
维护两个交易集合。
例如, 集合1: 余额:{“ account_number”:123,“ amount”:200}
现在假设用户已请求,您需要更新余额收集中的金额。如果您直接在余额收集中应用更改,则可能会导致读取不干净的问题(对于并发事务)
创建收藏集2: 交易记录:{“ account_number”:123,状态:true,last_updated:ISODate(“ ..”)}
交易收集将维护系统中正在进行的交易。如果状态为true,则表明该用户的某笔交易已经在处理中,您需要保留第二个并发请求,直到交易中的帐号123的状态为假。
注意: 还有许多其他方法可以解决此问题,但是您可以根据自己的确切业务需求朝这个方向思考。