Настройки для нескольких разделов, нескольких узлов для службы без учета состояния службы

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

Таким образом, дизайн будет таким: одиночная первичная и 4 реплики в каждом разделе, всего 5 разделов, работающих на 5 узлах.

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

Итак, что я обнаружил, так это:

Установка DefaultValue="-1" для счетчика экземпляров Сервиса позволяет сервису работать на каждом узле, но вам все равно нужно, чтобы он был в сочетании с одним из следующих:

SingletonPartition или UniformInt64Partition или NamedPartition

SingletonPartition используется по умолчанию в службе без сохранения состояния, и сочетание DefaultValue "-1" с SingletonPartition заставляет службу работать только на одном узле, что превосходит цель использования нескольких узлов.

Поэтому я попробовал что-то вроде: StatelessService InstanceCount="5" (Должно ли это быть 25, включая реплики?) UniformInt64Partition PartitionCount="5" lowKey="0" highkey="5" (Должен ли высокий ключ быть 24, чтобы включить все реплики?)

В одной ссылке написано, что lowkey и highkey должны соответствовать количеству разделов, а другая ссылка, похоже, включает все экземпляры, включая реплики.

Мне все еще не удается достичь 5 разделов, 5 узлов и каждого раздела, на котором выполняется первичная служба.

3 ответа

Решение
  • Для сервисов без сохранения состояния с одноэлементными разделами установка числа экземпляров в -1 означает "запускать один на каждом узле".
  • Для служб без сохранения состояния вы используете не реплики, а экземпляры. Реплики для репликации состояния.

Итак, используйте одноэлементный раздел и установите количество экземпляров равным -1.

В обоих случаях следует использовать набор реплик. Что касается службы без отслеживания состояния в Service Fabric, реплика - это просто копия службы. Кроме того, разделение службы без отслеживания состояния - очень редкий сценарий.

Я верю в ваши параметры ApplicationManifest, которые вы хотите:

<Parameter Name="YourService_PartitionCount" DefaultValue="5" />
<Parameter Name="YourService_MinReplicaSetSize" DefaultValue="4" />
<Parameter Name="YourService_TargetReplicaSetSize" DefaultValue="4" />

а затем в разделе DefaultServices вы хотите

<Service Name="YourService" ServicePackageActivationMode="ExclusiveProcess">
    <StatefulService ServiceTypeName="YourService" TargetReplicaSetSize="[YourService_TargetReplicaSetSize]" MinReplicaSetSize="[YourService_MinReplicaSetSize]">
        <UniformInt64Partition PartitionCount="[YourService_PartitionCount]" LowKey="0" HighKey="4" />
    </StatefulService>
</Service>

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

Обоснование LowKey="0" HighKey="4" это сделать их легко ориентированными, если вы используете службу удаленного взаимодействия.

Если я правильно понял проблему, необходимо убедиться, что на каждом узле установлена ​​отдельная первичная реплика.

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

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