Чтобы лучше объяснить мою цель, я упросту задачу до основ моих требований.Пожалуйста, дайте мне знать, если для ясности требуются дополнительные сведения.
Предположим, у меня есть 10 уникальных номеров (0-9), которые доступны для назначения.Какие номера зарезервированы или свободны, содержится в базе данных.Цель запуска веб-службы интерфейса - успешно запросить номер для назначения.Как только номер назначен определенному узлу, он зарезервирован, и никакой другой узел не может назначить его.
Имейте в виду, что это должна быть распределенная система без единой точки отказа.
Предостережение, которое доставляет мне неприятности, - это понятие Кассандры о возможной последовательности.Обратите внимание, что я мог настроить Кассандру на полную согласованность за счет более высокой задержки.Если это мой лучший (и, возможно, единственный) вариант, я могу это сделать, но я бы хотел сохранить концепцию настройки согласованности.
Мои мысли о стратегии заключаются в следующем:
1) Запросите Cassandra, чтобы получить список свободных номеров.
2) Случайно выберите один из свободных номеров.
3) Выполните Put для Cassandra, сказав, что этоузел зарезервировал этот номер.
4) Постоянно запрашивать у Кассандры, какой узел успешно зарезервировал номер.(Постоянно запрашивайте, поскольку чтение может не сразу отражать назначение.)
5) Если возвращаемое имя узла - это имя, под которым было сохранено резервирование этого узла, то резервирование было успешным.
6) Если возвращаемое имя узла является другим именем узла, это означает, что другой узел запросил номер примерно в то же время, что и этот, и получил назначение.Этот узел должен вернуться к шагу 1 и повторить попытку.
У меня странное ощущение, что определенные обстоятельства приведут к ошибкам (двойное назначение и т. Д.), Если я использую вышеуказанную стратегию.
МожетКто-нибудь еще прокомментирует мою предложенную стратегию и, возможно, предложит свою?Спасибо.