Использование платформы Service Fabric надежными субъектами

В этой статье объясняется, как работают субъекты Reliable Actors на платформе Azure Service Fabric. Субъекты Reliable Actors выполняются в среде, размещенной в реализации службы Reliable Services с отслеживанием состояния под названием служба субъектов. Служба субъектов содержит все компоненты, необходимые для управления жизненным циклом и диспетчеризации относящихся к субъектам сообщений:

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

Вместе эти компоненты образуют платформу Reliable Actors.

Структура служб

Так как служба субъектов сама по себе является надежной службой, понятия модели приложений, жизненного цикла, упаковки, развертывания, обновления и масштабирования, связанные с Reliable Services, также относятся и к службам субъектов.

Структура службы субъектов

На предыдущей схеме показана связь между платформами приложений Service Fabric и кодом пользователя. Синие элементы обозначают платформу приложений служб Reliable Services, оранжевые — платформу Reliable Actor, а зеленые — код пользователя.

В службах Reliable Services ваша служба наследует класс StatefulService, производный от StatefulServiceBase (или StatelessService для служб без отслеживания состояния). В службе Reliable Actors используется служба субъектов с другой реализацией класса StatefulServiceBase — она реализует шаблон субъекта, согласно которому выполняются ваши субъекты. Так как служба субъектов — всего лишь реализация класса StatefulServiceBase, вы можете написать свою собственную службу, производную от класса ActorService, и реализовать в ней функции уровня службы таким же образом, как при наследовании класса StatefulService, например:

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

Дополнительные сведения см. в статье Реализация функций уровня службы в службе субъектов.

Модель приложения

Службы субъектов — это службы Reliable Services, поэтому используют точно такую же модель приложений. В то же время инструменты сборки платформы субъектов создают для вас некоторые файлы модели приложений.

Манифест службы

Содержимое файла ServiceManifest.xml для службы субъектов создается инструментами сборки платформы субъектов автоматически. Этот файл содержит:

  • Тип службы субъектов. Имя типа создается с учетом имени проекта субъекта. В зависимости от атрибута сохраняемости у субъекта устанавливается флаг HasPersistedState.
  • Пакет кода.
  • Пакет конфигурации.
  • Ресурсы и конечные точки.

Манифест приложения

Средства сборки платформы субъектов автоматически создают для вашей службы субъектов определение по умолчанию. Свойства службы по умолчанию заполняются инструментами сборки:

  • Счетчик наборов реплик определяется атрибутом сохраняемости у субъекта. Каждый раз, когда атрибут сохраняемости у субъекта изменяется, счетчик наборов реплик в определении службы по умолчанию сбрасывается.
  • Устанавливается схема секционирования и диапазон Uniform Int64 с полным диапазоном ключей Int64.

Основные понятия о секции Service Fabric для субъектов

Службы субъектов — это секционированные службы с отслеживанием состояния. Каждая секция службы субъектов содержит набор субъектов. Секции службы автоматически распределяются между несколькими узлами Service Fabric. В результате распространяются экземпляры субъектов.

Секционирование и распределение субъектов

Службы Reliable Services создаются с использованием различных схем и диапазонов ключей секционирования. Служба субъектов использует схему секционирования Int64 с полным диапазоном ключей Int64 для сопоставления субъектов и секций.

Идентификатор субъекта

Каждый созданный в службе субъект имеет уникальный идентификатор, представляемый классом ActorId . ActorId — это непрозрачное значение идентификатора, которое можно использовать для равномерного распределения субъектов между секциями служб за счет генерации идентификаторов случайным образом:

ActorProxy.Create<IMyActor>(ActorId.CreateRandom());
ActorProxyBase.create<MyActor>(MyActor.class, ActorId.newId());

Каждый ActorId хэшируется в значение типа Int64, поэтому в службе субъектов необходимо использовать схему секционирования Int64 с полным диапазоном ключей Int64. Тем не менее для ActorID можно использовать пользовательские значения идентификаторов, включая строковые значения, а также GUID или UUID и значения типа Int64.

ActorProxy.Create<IMyActor>(new ActorId(Guid.NewGuid()));
ActorProxy.Create<IMyActor>(new ActorId("myActorId"));
ActorProxy.Create<IMyActor>(new ActorId(1234));
ActorProxyBase.create(MyActor.class, new ActorId(UUID.randomUUID()));
ActorProxyBase.create(MyActor.class, new ActorId("myActorId"));
ActorProxyBase.create(MyActor.class, new ActorId(1234));

При использовании строк и GUID или UUID значения хэшируются в значения типа Int64. Однако, если значение типа Int64 предоставляется в ActorId напрямую, Int64 сопоставляется с секцией напрямую без дополнительного хэширования. Этот метод можно использовать для управления тем, в каких секциях будут размещаться субъекты.

Дальнейшие действия