Каково максимальное количество экземпляров субъекта для данного идентификатора субъекта для данного субъекта в любое время в кластере сервисной фабрики?

Я пытаюсь понять максимальное количество экземпляров идентификатора субъекта, которые будут выполнять данный метод (на заданном интерфейсе субъекта) в любое время в указанном кластере сервисной фабрики. Вот мой пример:

  1. Допустим, я только что определил класс субъекта, называемый CustomerActor, который наследуется от Actor сервисной фабрики и реализует интерфейс ICustomerActor, который имеет единственный метод с именем Process.
  2. Допустим, у меня есть клиент, который отправляет сообщение в метод ICustomerActor.Process, используя actorIds на основе идентификатора клиента. В этом примере мой диапазон идентификаторов клиентов находится в диапазоне от 1 до 99. Поэтому мой диапазон идентификаторов актеров составляет от клиента /1 до клиента /99.
  3. Допустим, что CustomerActor настроен с количеством разделов = 9 и числом узлов = 3, то есть может быть 3 раздела на узел.
  4. Предполагая равное распределение идентификаторов клиентов по всем разделам, давайте предположим, что раздел 1 будет обслуживать идентификаторы клиентов с 1 по 99/9 = 11, раздел 2 будет обслуживать идентификаторы клиентов с 12 по 22 и т. Д.
  5. Предположим, что кластер успешно работал с одинаковым распределением, и в этом обсуждении не происходит сбоев узлов.
  6. Теперь внезапно клиент начинает отправлять несколько запросов (в быстрой последовательности) для определенного идентификатора клиента (по любой причине), например, Customer/8, который находится в разделе 1, и предполагает, что кластер в настоящее время обслуживает только запросы customer/8.,
  7. Допустим, клиент только что отправил 20 запросов на актера с идентификатором Customer/8. За исключением этого идентификатора субъекта клиента, в кластере нет другого трафика.
  8. Допустим, клиент мог отправить все вышеуказанные запросы (без блокировки на стороне клиента), потому что мы используем напоминания в классе CustomerActor, который немедленно возвращает элемент управления клиенту.

Вот мои вопросы:

  1. Поскольку модель актора гарантирует однопоточное программирование, будет ли только один экземпляр CustomerActor (сопоставленный с идентификатором актера: Customer/8), который выполняет метод ICustomerActor.Process во всем кластере? Если так, значит ли это, что в очереди может быть не более 19 запросов (при условии, что 1-й запрос еще не завершен)?

  2. Или будет 3 экземпляра (по одному на узел) CustomerActor (все сопоставлены с идентификатором актера: Customer/8), которые одновременно выполняют метод ICustomerActor.Process во всем кластере? Если это так, значит ли это, что в очереди может быть не более 19/3 запросов (при условии, что 1-й запрос на любом узле еще не завершен)?

  3. Или будет 9 экземпляров (по одному на каждый раздел для всех узлов) CustomerActor (все сопоставлены с идентификатором актера: Customer/8), которые одновременно выполняют метод ICustomerActor.Process во всем кластере? Если это так, означает ли это, что в очереди может быть не более 19/9 запросов (при условии, что 1-й запрос на любом разделе еще не завершен)?

  4. Или есть другое поведение, которое я не учел?

1 ответ

Решение
  1. Там один экземпляр одного Actor, используя один идентификатор. Actor доступ действительно является "однопоточным", поэтому запросы помещаются в очередь. (этот ответ, как это работает)
  2. Актеры размещены внутри ActorService (служба с сохранением состояния), которая имеет первичные и вторичные реплики. Сами актеры не имеют первичной / вторичной концепции. ActorID определяет раздел ActorService это размещено в.
  3. Данные распределены между служебными разделами, поэтому нет.

больше чтения:

Другие вопросы по тегам