Поделиться через


ZooKeeperBasedMembershipTable Класс

Определение

Реализация таблицы членства с помощью Apache Zookeeper 3.4.6 https://zookeeper.apache.org/doc/r3.4.6/

public class ZooKeeperBasedMembershipTable : Orleans.IMembershipTable
type ZooKeeperBasedMembershipTable = class
    interface IMembershipTable
Public Class ZooKeeperBasedMembershipTable
Implements IMembershipTable
Наследование
ZooKeeperBasedMembershipTable
Реализации

Комментарии

Краткий обзор используемых функций ZK: данные представлены деревом узлов (аналогично файловой системе). Каждый узел обращается по пути и может содержать данные в виде массива байтов и имеет версию. При создании узла его версия составляет 0. После обновлений версия увеличивается атомарным образом. Обновление также может быть условным для ожидаемой текущей версии. Транзакция может содержать несколько операций, которые завершаются успешно или завершаются атомарным сбоем. При создании клиента zookeeper можно задать базовый путь, в котором все операции относительны.

В этой реализации: каждое развертывание Орлеана имеет состояние узла /UniqueDeploymentId каждого Silo сохраняется в /UniqueDeploymentId/IP:Port@Gen каждый IAmAlive Silo сохраняется в /UniqueDeploymentId/IP:Port@Gen/IAmAlive IAmAlive, так как его обновления являются безусловными.

Версия ZK узла — это ETag: версия таблицы — это версия /UniqueDeploymentId, версия записи silo — это версия /UniqueDeploymentId/IP:Port@Gen

Конструкторы

ZooKeeperBasedMembershipTable(ILogger<ZooKeeperBasedMembershipTable>, IOptions<ZooKeeperClusteringSiloOptions>, IOptions<ClusterOptions>)

Реализация таблицы членства с помощью Apache Zookeeper 3.4.6 https://zookeeper.apache.org/doc/r3.4.6/

Методы

CleanupDefunctSiloEntries(DateTimeOffset)

Реализация таблицы членства с помощью Apache Zookeeper 3.4.6 https://zookeeper.apache.org/doc/r3.4.6/

DeleteMembershipTableEntries(String)

Удаляет все записи таблицы заданного идентификатора clusterId.

InitializeMembershipTable(Boolean)

Инициализирует таблицу членства на основе ZooKeeper.

InsertRow(MembershipEntry, TableVersion)

Atomically пытается вставить (добавить) новый MembershipEntry для одного сило, а также обновить TableVersion. Если операция завершится успешно, в таблицу будут внесены следующие изменения:

  1. В таблицу будет добавлен новый membershipEntry.
  2. Добавленный membershipEntry также будет добавлен с новым уникальным автоматически созданным eTag.
  3. TableVersion.Version в таблице будет обновлена до новой версии TableVersion.Version.
  4. Тег etag TableVersion в таблице будет обновлен до нового уникального автоматически созданного eTag. Все эти изменения в таблице, вставка новой строки и обновление версии таблицы и связанных etags должны происходить атомарным образом или завершаться атомарным сбоем без побочных эффектов. Операция должна завершиться ошибкой в каждом из следующих условий:
  5. MembershipEntry для заданного сило уже существует в таблице
  6. Обновление объекта TableVersion завершилось сбоем, так как заданный etag TableVersion (как указано в свойстве TableVersion.VersionEtag) не совпадал с тегом TableVersion etag в таблице.
ReadAll()

Атомарным образом считывает полное содержимое таблицы членства. Возвращенная запись MembershipTableData включает все записи MembershipEntry для всех силосов в таблице и TableVersion для этой таблицы. Членства и TableVersion должны быть считываться атомарным образом.

ReadRow(SiloAddress)

Атомарны считывает сведения о таблице членства по заданному сило. Возвращенная запись MembershipTableData включает одну запись MembershipEntry для заданного сило и TableVersion для этой таблицы. MembershipEntry и TableVersion должны быть считываться атомарным образом.

UpdateIAmAlive(MembershipEntry)

Обновления часть IAmAlive (столбец) объекта MembershipEntry для этого сило. Эта операция должна обновлять только столбец IAmAlive и не изменять другие столбцы. Эта операция является "грязной записью" или "обновлением на месте" и выполняется без проверки etag. Что касается обновления eTags: эта операция может автоматически обновлять eTag, связанный с заданной строкой с расширением silo, но это не обязательно. Он также может оставить etag не измененным ("грязная запись"). Что касается TableVersion: эта операция не должна изменять TableVersion таблицы. Он должен оставить его нетронутым. Нет сценария, в котором эта операция может завершиться сбоем из-за семантических причин таблицы. Это может завершиться ошибкой только из-за проблем с сетью или недоступности таблицы.

UpdateRow(MembershipEntry, String, TableVersion)

Atomically пытается обновить MembershipEntry для одного сило, а также обновить TableVersion. Если операция завершится успешно, в таблицу будут внесены следующие изменения:

  1. MembershipEntry для этого silo будет обновлен до нового MembershipEntry (старая запись будет полностью заменена новой записью).
  2. ETag для обновленного MembershipEntry также будет eTag с новым уникальным автоматически созданным eTag.
  3. TableVersion.Version в таблице будет обновлена до новой версии TableVersion.Version.
  4. Тег etag TableVersion в таблице будет обновлен до нового уникального автоматически созданного eTag. Все эти изменения в таблице, обновление новой строки и обновление версии таблицы и связанных etags должны происходить атомарным образом или завершаться атомарным сбоем без побочных эффектов. Операция должна завершиться ошибкой в каждом из следующих условий:
  5. MembershipEntry для заданного сило не существует в таблице
  6. MembershipEntry для заданного силона существует в таблице, но его etag в таблице не соответствует предоставленному etag.
  7. Обновление объекта TableVersion завершилось сбоем, так как заданный etag TableVersion (как указано в свойстве TableVersion.VersionEtag) не совпадал с тегом TableVersion etag в таблице.

Применяется к