1.对于跨数据库的业务操作,如果追求强一致性,就要走2PC(two-phase commit) 协议。而这个协议在Availability方面可能表现不佳:
a.只要一个库回滚,大家都得回滚
b.导致多处的资源上锁,影响性能
2.按不同的语境,弱一致性有两种含义:
a. 不要求所有子操作原子地执行。可以容忍有的操作成功,有的操作失败,比如用于估算的数据,可以允许零星的失败
b. 不要求在甲方扣款后乙方在同一瞬间收到款,可以允许乙方隔一段时间后(最终)收到款(即最终一致性)
3.“最终一致性”一般可以通过消息队列来实现:完成一个子操作后,发出一个消息,这个消息将被异步地处理
a. 即使一个系统挂了,也不会影响上游系统继续工作
b. 如果系统处理一个消息失败,可能需要重复处理这个消息。 所以最好把消息消费设计成Idempotent