Как разделить состояние между экземплярами одного и того же микросервиса - PullRequest
1 голос
/ 18 июня 2019

Я переписываю устаревшую службу, которая хранит данные, например, счетчики и использует его для решений конечного автомата. служба получает запрос с некоторым ключом, ищет его значение, обновляет его и при необходимости выполняет действие.

Новая служба должна быть развернута в k8s, где могут работать несколько модулей одной и той же службы, каждый из экземпляров может получить запрос, который может привести к обновлению счетчика.

Как можно синхронизировать счетчик / данные между репликами и согласованность обещаний?

1 Ответ

0 голосов
/ 18 июня 2019

Вам нужна атомарная операция CAS (сравнить и поменять). Если хранилище является общим хранилищем, как в СУБД, вы можете сделать это с помощью блокировки на уровне строк. Другими словами, если ваши экземпляры микросервиса обращаются к общей СУБД, вы сможете сделать это с помощью блокировки на уровне строк.

Если ваше хранилище реплицируется и распределяется, и клиент или микросервис могут подключаться к любому узлу или реплике и записывать на них, как в Cassandra, вам нужна реализация согласованного алгоритма, которая позволит системе в целом договориться о том, какой клиент хранит заблокировать, а затем сделать обновление. В частности, в Cassandra вы можете использовать легковесную транзакцию, которая реализует Paxos и выставляет ее как CAS.

Если вы не используете ни одну из вышеуказанных баз данных, вы можете использовать любые другие согласованные системы, такие как ZooKeeper (ZAB), etcd (Raft) и т. Д.

Apache Curator - это библиотека высокого уровня поверх ZooKeeper. Вы можете обратиться к этому рецепту: https://curator.apache.org/curator-recipes/distributed-atomic-long.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...