如何在同一微服务的实例之间共享状态

时间:2019-06-18 06:54:21

标签: architecture microservices

我正在重写旧版服务,该旧版服务存储数据,例如计数器并将其用于状态机决策。 该服务会收到带有某些键的查询,查找其值,对其进行更新并在需要时执行操作。

新服务应部署在k8s上,同一服务的多个Pod可以在其中运行,每个实例都可以接收到可能导致计数器更新的查询。

如何在副本之间同步计数器/数据并保证一致性?

1 个答案:

答案 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

相关问题