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

Я запускаю приложение Service Fabric в локальном кластере разработки с 5 узлами, «смоделированными» на моем ПК.

В приложении есть общедоступная служба API без отслеживания состояния с числом экземпляров, равным -1.

Я ожидаю увидеть 5 экземпляров службы без отслеживания состояния в Service Fabric Explorer, но я вижу только 1.

В приложении также есть служба акторов с числом разделов, равным 10 (автоматически сгенерированная Visual Studio конфигурация).

Когда приложение развертывается в кластере разработки на моем ПК, в Service Fabric Explorer можно увидеть только один раздел. После того, как я имитирую «большую» нагрузку и использование ЦП и памяти моего ПК составляет около 90% и превышает его, остается только один раздел службы акторов. Я создал службу с отслеживанием состояния с количеством разделов, установленным на 5, чтобы проверить, что-то не так с моей средой, но она работает должным образом.

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

Насчет актерской службы. Согласно docs Возможно динамическое масштабирование разделов, но количество разделов для службы актора не увеличивается даже при высокой нагрузке. Кроме того, в документации Actor ничего не упоминается о динамическом масштабировании раздела.

Похожие

Заранее спасибо!

РЕДАКТИРОВАТЬ: после нескольких тестов с разными конфигурациями я заработал.

Исходная конфигурация в ApplicaitonManifest.xml:

<Parameters>
   ...
    <Parameter Name="HttpAPI_InstanceCount" DefaultValue="-1" />

    <Parameter Name="SystemStatusConsumerActorService_PartitionCount" 
               DefaultValue="10" />
   ...
</Parameters>

<DefaultServices>
    <Service Name="HttpAPI">
      <StatelessService ServiceTypeName="HttpAPIType" 
                        InstanceCount="[HttpAPI_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>

    <Service Name="SystemStatusConsumerActorService" 
             GeneratedIdRef="faad4d24-04db-4e06-8a1d-22bc6255c7fe|Persisted">

      <StatefulService ServiceTypeName="SystemStatusConsumerActorServiceType" TargetReplicaSetSize="SystemStatusConsumerActorService_TargetReplicaSetSize]" MinReplicaSetSize="[SystemStatusConsumerActorService_MinReplicaSetSize]">

        <UniformInt64Partition 
          PartitionCount="[SystemStatusConsumerActorService_PartitionCount]" 
          LowKey="-9223372036854775808" 
          HighKey="9223372036854775807" />
      </StatefulService>
    </Service>
</DefaultServices>

Конфигурация, которая работает:

<Parameters>
   ...
    <Parameter Name="HttpAPIInstanceCount" DefaultValue="-1" />

    <Parameter Name="SystemStatusConsumerActorServicePartitionCount" 
               DefaultValue="10" />
   ...
</Parameters>

<DefaultServices>
    <Service Name="HttpAPI">
      <StatelessService ServiceTypeName="HttpAPIType" 
                        InstanceCount="[HttpAPIInstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>

    <Service Name="SystemStatusConsumerActorService" 
             GeneratedIdRef="faad4d24-04db-4e06-8a1d-22bc6255c7fe|Persisted">

      <StatefulService ServiceTypeName="SystemStatusConsumerActorServiceType" TargetReplicaSetSize="SystemStatusConsumerActorService_TargetReplicaSetSize]" MinReplicaSetSize="[SystemStatusConsumerActorService_MinReplicaSetSize]">

        <UniformInt64Partition 
          PartitionCount="[SystemStatusConsumerActorServicePartitionCount]" 
          LowKey="-9223372036854775808" 
          HighKey="9223372036854775807" />
      </StatefulService>
    </Service>
</DefaultServices>

Обратите внимание, что единственными отличиями являются имена параметров:

HttpAPI_InstanceCount

изменился на

HttpAPIInstanceCount

SystemStatusConsumerActorService_PartitionCount

изменился на

SystemStatusConsumerActorServicePartitionCount


comment
Это нормально. Экземпляры служб без сохранения состояния и субъектов в локальных кластерах разработки всегда будут одним экземпляром. Для лиц без гражданства это происходит из-за конфликтов портов. Вы определяете только 1 порт для без сохранения состояния, и фабрика не может открыть 5 экземпляров с одним номером порта. Для акторов внутренняя структура имеет только 1 домен приложения [exe] для нескольких разделов. Это необходимо для быстрой активации актеров. Однако вы можете разрешить отдельные разделы акторов с помощью new ActorId ().   -  person teeboy    schedule 27.11.2018
comment
@teeboy Для службы без отслеживания состояния не существует строгих требований к определению порта конечной точки. Вы можете удалить значение порта, и Service Fabric автоматически назначит порты, чтобы у вас было несколько экземпляров службы без отслеживания состояния.   -  person Oleg Karasik    schedule 27.11.2018


Ответы (1)


После попытки множества различных конфигураций проблема все еще оставалась. Я нашел его после проверки git diff моего проекта.

Моя проблема заключалась в том, что параметры ApplicationManifest переопределяются в файле ApplicatonParameters \ Local.5Node.xml (поскольку я использую локальный кластер с 5 узлами) в папке приложения служебной фабрики.

Сложность заключалась в том, что даже если я удалю или прокомментирую переопределение SystemStatusConsumerActorService_PartitionCount, студия добавляет его каждый раз, когда я создаю приложение. Единственным решением этой проблемы было изменение имени параметра в ApplicationManifest.xml.

После изменения конфигурации в соответствии с новыми фактами служба без сохранения состояния и служба актора запускаются с желаемым количеством экземпляров и разделов соответственно.

Конечно, 4 из пяти экземпляров без сохранения состояния ломаются, но это вполне логично, учитывая, что кластер «работает» на одной машине.

person Zapo    schedule 27.11.2018
comment
Вы можете удалить спецификацию порта из объявления службы в ApplicationManifest.xml, чтобы разрешить фабрике служб выделять порт для вас (чтобы вы могли иметь несколько запущенных экземпляров). - person Oleg Karasik; 27.11.2018
comment
Еще один вопрос - пробовали ли вы изменять значения параметров в Local.5Node.xml? - person Oleg Karasik; 27.11.2018
comment
Да, я изменил значения в файле Local.5Node.xml, и он тоже работает. Также я удалил порты из файла конфигурации службы. Теперь я обращаюсь к службе через обратный прокси-сервер, который также действует как балансировщик нагрузки или, по крайней мере, перенаправляет запросы на случайный экземпляр службы без отслеживания состояния. - person Zapo; 27.11.2018
comment
Да, это правильно. Для службы без отслеживания состояния обратный прокси будет перенаправлять запросы на случайный экземпляр, в случае службы с отслеживанием состояния по умолчанию обратный прокси перенаправляет все запросы на первичную реплику. - person Oleg Karasik; 27.11.2018