Назначение уникальных номеров узлам веб-службы с помощью базы данных Cassandra - PullRequest
2 голосов
/ 27 августа 2011

Чтобы лучше объяснить мою цель, я упросту задачу до основ моих требований.Пожалуйста, дайте мне знать, если для ясности требуются дополнительные сведения.

Предположим, у меня есть 10 уникальных номеров (0-9), которые доступны для назначения.Какие номера зарезервированы или свободны, содержится в базе данных.Цель запуска веб-службы интерфейса - успешно запросить номер для назначения.Как только номер назначен определенному узлу, он зарезервирован, и никакой другой узел не может назначить его.

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

Предостережение, которое доставляет мне неприятности, - это понятие Кассандры о возможной последовательности.Обратите внимание, что я мог настроить Кассандру на полную согласованность за счет более высокой задержки.Если это мой лучший (и, возможно, единственный) вариант, я могу это сделать, но я бы хотел сохранить концепцию настройки согласованности.

Мои мысли о стратегии заключаются в следующем:

1) Запросите Cassandra, чтобы получить список свободных номеров.

2) Случайно выберите один из свободных номеров.

3) Выполните Put для Cassandra, сказав, что этоузел зарезервировал этот номер.

4) Постоянно запрашивать у Кассандры, какой узел успешно зарезервировал номер.(Постоянно запрашивайте, поскольку чтение может не сразу отражать назначение.)

5) Если возвращаемое имя узла - это имя, под которым было сохранено резервирование этого узла, то резервирование было успешным.

6) Если возвращаемое имя узла является другим именем узла, это означает, что другой узел запросил номер примерно в то же время, что и этот, и получил назначение.Этот узел должен вернуться к шагу 1 и повторить попытку.

У меня странное ощущение, что определенные обстоятельства приведут к ошибкам (двойное назначение и т. Д.), Если я использую вышеуказанную стратегию.

МожетКто-нибудь еще прокомментирует мою предложенную стратегию и, возможно, предложит свою?Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Вы можете проверить Apache ZooKeeper .Кажется, это именно то, что вам нужно.Вы можете использовать ZooKeeper, чтобы получать новые назначения и сохранять существующие назначения в Cassandra.

0 голосов
/ 31 августа 2011

В зависимости от вашего приложения, вам действительно нужно выбрать один из фиксированного набора номеров?Если все, что вам нужно, это выбрать уникальный номер, который не выбрал ни один другой узел, вы можете сделать это, сгенерировав UUID (универсальный уникальный идентификатор) для каждого узла, например, с http://docs.python.org/library/uuid.html.

...