我正在重写旧版服务,该旧版服务存储数据,例如计数器并将其用于状态机决策。 该服务会收到带有某些键的查询,查找其值,对其进行更新并在需要时执行操作。
新服务应部署在k8s上,同一服务的多个Pod可以在其中运行,每个实例都可以接收到可能导致计数器更新的查询。
如何在副本之间同步计数器/数据并保证一致性?
答案 0 :(得分:0)
您需要原子CAS(比较和交换)操作。如果该存储是RDBMS中的共享存储,则可以使用行级锁来实现。换句话说,如果您的微服务实例正在访问通用的RDBMS,则可以使用行级锁来做到这一点。
如果您的存储已被复制和分发,并且客户端或微服务可以连接到任何节点或副本并像在Cassandra中那样在其上写入,则您需要一种共识算法实现,该共识算法应允许系统整体上就哪个客户端持有该协议达成共识锁,然后执行更新。具体来说,在Cassandra中,您可以使用实现Paxos并将其公开为CAS的轻量级事务。
如果您不使用上述任何数据库,则可以使用任何其他共识系统,例如ZooKeeper(ZAB),etcd(Raft)等。
Apache Curator是ZooKeeper之上的高级库。您可以参考以下记录:https://curator.apache.org/curator-recipes/distributed-atomic-long.html