【问题标题】:How to share state between instances of the same microservice如何在同一微服务的实例之间共享状态
【发布时间】:2019-06-18 06:54:21
【问题描述】:

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

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

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

【问题讨论】:

  • 不能只使用数据库吗?

标签: architecture microservices


【解决方案1】:

您需要一个原子 CAS(比较和交换)操作。如果存储是 RDBMS 中的共享存储,则可以使用行级锁来实现。换句话说,如果您的微服务实例正在访问一个通用的 RDBMS,您就可以使用行级锁来完成它。

如果您的存储是复制和分布式的,并且客户端或微服务可以连接到任何节点或副本并在其上写入,就像在 Cassandra 中一样,您需要一个共识算法实现,允许系统作为一个整体就哪个客户端持有锁,然后进行更新。特别是在 Cassandra 中,您可以使用轻量级事务,它实现了 Paxos 并将其公开为 CAS。

如果您不使用上述任何数据库,您可以使用任何其他共识系统,如 ZooKeeper (ZAB)、etcd (Raft) 等。

Apache Curator 是 ZooKeeper 之上的高级库。你可以参考这个rec​​epe:https://curator.apache.org/curator-recipes/distributed-atomic-long.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2016-03-28
    • 2021-07-04
    • 2017-10-19
    • 2017-05-27
    • 2016-07-30
    • 2016-11-05
    相关资源
    最近更新 更多