我有以下(有缺陷的)分布式架构,它具有竞争条件。我知道你们中的一些人可能已经解决了这个经典的“分布式状态传播问题” - 我很乐意听到它们。如果你忍受我,这就是架构:
假设你有两个golang app服务器,S1和S2。
还有两个Cassandra数据库节点,DB1和DB2。
S1和S2分别连接到DB1和DB2。
用户可以在两个浏览器中同时完成两件事:
现在,(1)和(2)之间存在毛茸茸的竞争条件。在C1上,首先到达的是M1还是M2? M1可能包括M2中包含的状态更新,具体取决于Cassandra相对于C1请求的传播时间。
我意识到幂等消息或CRDT会在某些用例中解决这个问题,但不是全部 - 特别是对于像布尔切换状态这样的非单调状态更改。
我意识到OST(运营状态转移)也可以解决这个问题,但我不知道任何现成的解决方案。我之前已经建立了一个OST系统,它是一个主要的PITA。
当然,人们可以拥有更加一致的数据库,这使得它更易于处理,但我需要具有分区容错的高可用性,这意味着要处理最终的一致性。
它可以解决这个问题,即拥有数据库挂钩/回调,其中app服务器可以侦听某些状态的更改,并在状态传播到达该db节点时得到通知。我知道这些类型的钩子存在于一些一致的数据库中,如Rethinkdb,但(据我所知)它们不存在于Cassandra或任何其他高可用性(HA),分区容忍(PT)数据库中。
我发现自己渴望应用程序级的状态抽象:跨平台;与HA / PT分布式持久存储集成;为我处理国家传播;并且可以在状态更改时轻松触发行为。我不知道这样的事情。
您了解哪些工具或架构可以满足这些限制:
答案 0 :(得分:0)
我认为Cassandra具有非常特殊的功能,但即使您使用单个节点也无法以您需要的方式管理事务。 我不知道你为什么使用Cassandra,也许你有理由被它缝合但是为了你的需要我会在HA配置中使用一组SQL db:Oracle或SQL Server已经解决了这些问题。当然它们可能很贵
答案 1 :(得分:0)
尝试使用您的某个Cassandra服务器,例如DB1作为锁服务器。这将保证所有操作的原子性,因此在您的情况下操作不会相互干扰。