哪些服务器端架构可以提供高可用性并避免竞争条件?

时间:2015-07-02 18:56:46

标签: state distributed-computing race-condition distributed-system eventual-consistency

我有以下(有缺陷的)分布式架构,它具有竞争条件。我知道你们中的一些人可能已经解决了这个经典的“分布式状态传播问题” - 我很乐意听到它们。如果你忍受我,这就是架构:

假设你有两个golang app服务器,S1和S2。

还有两个Cassandra数据库节点,DB1和DB2。

S1和S2分别连接到DB1和DB2。

用户可以在两个浏览器中同时完成两件事:

  1. 他打开了一个客户端浏览器C1,它将通过websockets连接到S1并发出从DB1或DB2获取状态的请求。消息M1包含状态,并从S1发送到C1。
  2. 他打开客户端浏览器C2,它将连接到S2以切换某些状态。 S2将在DB1或DB2中更新该状态。然后,DB1和DB2将彼此同步。 S2还需要告诉C1关于新状态,并使用NSQ(或您喜欢的消息队列)将此状态更新消息发送到S1,然后S1将状态更改的消息M2发送到C1。
  3. 现在,(1)和(2)之间存在毛茸茸的竞争条件。在C1上,首先到达的是M1还是M2? M1可能包括M2中包含的状态更新,具体取决于Cassandra相对于C1请求的传播时间。

    我意识到幂等消息或CRDT会在某些用例中解决这个问题,但不是全部 - 特别是对于像布尔切换状态这样的非单调状态更改。

    我意识到OST(运营状态转移)也可以解决这个问题,但我不知道任何现成的解决方案。我之前已经建立了一个OST系统,它是一个主要的PITA。

    当然,人们可以拥有更加一致的数据库,这使得它更易于处理,但我需要具有分区容错的高可用性,这意味着要处理最终的一致性。

    它可以解决这个问题,即拥有数据库挂钩/回调,其中app服务器可以侦听某些状态的更改,并在状态传播到达该db节点时得到通知。我知道这些类型的钩子存在于一些一致的数据库中,如Rethinkdb,但(据我所知)它们不存在于Cassandra或任何其他高可用性(HA),分区容忍(PT)数据库中。

    我发现自己渴望应用程序级的状态抽象:跨平台;与HA / PT分布式持久存储集成;为我处理国家传播;并且可以在状态更改时轻松触发行为。我不知道这样的事情。

    您了解哪些工具或架构可以满足这些限制:

    • 没有竞争条件
    • 高可用性,分区容忍(最终一致)
    • 处理非单调状态变化

2 个答案:

答案 0 :(得分:0)

我认为Cassandra具有非常特殊的功能,但即使您使用单个节点也无法以您需要的方式管理事务。 我不知道你为什么使用Cassandra,也许你有理由被它缝合但是为了你的需要我会在HA配置中使用一组SQL db:Oracle或SQL Server已经解决了这些问题。当然它们可能很贵

答案 1 :(得分:0)

尝试使用您的某个Cassandra服务器,例如DB1作为锁服务器。这将保证所有操作的原子性,因此在您的情况下操作不会相互干扰。