разрешение конфликтов в распределенном списке - PullRequest
1 голос
/ 26 декабря 2011

Я хотел бы сохранить список объектов, который распределен между N серверами с балансировкой нагрузки: всякий раз, когда клиент меняет список на одном сервере, я хотел бы, чтобы эти изменения переносились на другие серверы.Итак, я думаю, это случай репликации мастер-мастер.Какой самый простой способ справиться с этим?Один упрощающий факт заключается в том, что с каждым изменением объекта в списке связан связанный с ним увеличивающийся номер версии.Таким образом, можно разрешить конфликты, если элемент был изменен на двух разных серверах, и эти две дельты попадают на третий сервер.

Редактировать: уточнение: Я хорошо знаком с распределенными хранилищами значений ключей, такими как Memcached и Redis.Это не проблема здесь;меня интересует механизм разрешения конфликтов в общем списке: если сервер A меняет элемент в списке, а сервер B удаляет элемент, например, как разрешить конфликт программно.

Ответы [ 5 ]

4 голосов
/ 26 декабря 2011

Я предлагаю memcached.Это распределенная система кэширования сервера, которая, кажется, идеально соответствует вашим потребностям.Проверьте эту ссылку:

Какой клиент .NET Memcached вы используете, EnyimMemcached или BeITMemcached?

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

1 голос
/ 03 января 2012

Существуют алгоритмы, которые можно использовать для синхронизации распределенных систем.

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

Я рекомендую вам использовать Часы Lamport .

1 голос
/ 31 декабря 2011

Имеет ли каждый сервер свою собственную версию List локально кэшируемой или вы планируете использовать слой централизованного кэширования?

Как и предполагалось, у вас может быть централизованный процесс "push", который работает от централизованногоочередь.Любые изменения, отправленные любым сервером, ставятся в очередь, и процесс «push» может загружать обновления на все серверы через некоторый механизм удаленного взаимодействия / WebService.

Это дает преимущество любых примененных изменений / обновлений / удалений.сразу (или близко по времени) ко всем серверам, централизованная проверка или ведение журнала при необходимости.Это также решает проблему множественных обновлений - последнее имеет приоритет.

Я видел, что это реализовано в виде службы Windows, которая имеет внутреннюю очередь (может быть сохранена в асинхронной базе данных для устойчивости), которая управляет очередью.и просто получает элементы один за другим, проверяет элемент, регистрирует изменения / содержимое и, наконец, передает его на локальные List s через вызовы WebService для каждого веб-сервера (серверы поддерживают список в памяти, который просто обновляется / добавляется / удаляется по мере необходимости).

1 голос
/ 30 декабря 2011

Поместите ваши изменения в очередь.Пусть каждый сервер смотрит на очередь и действует на нее.

Например, очередь может иметь:

  • добавить элемент # 33
  • удалить элемент # 55
  • элемент обновления # 22 * ​​1010 *
  • и т. Д.

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

Я создал базу данных в памяти таким способом, и она отлично работала на нескольких «серверах».

РЕДАКТИРОВАТЬ:

Когда серверы хотят обновитьдруг с другом, это должно произойти:

Каждый сервер, который обновляет, будет помещать запрос ОБНОВЛЕНИЯ (или ДОБАВИТЬ или УДАЛИТЬ) в очередь для всех других серверов.Каждый сервер должен также хранить список запросов, поставленных в очередь из него, чтобы он не загружал свои собственные обновления из очереди.

0 голосов
/ 30 декабря 2011

Если вы работаете на платформе Windows, я предлагаю вам взглянуть на Windows Server AppFabric , и особенно на Caching . Название забавное, но я думаю, что это именно то, что вы ищете, я цитирую:

Распределенный кэш в памяти, который предоставляет приложениям .NET высокоскоростной доступ, масштабирование и высокая доступность данных приложения.

...