Динамическое создание сервисов в приложении сервисной фабрики - PullRequest
0 голосов
/ 25 июня 2018

Это немного описательно, поэтому, пожалуйста, потерпите меня.:)

В приложении, которое я пытаюсь создать, есть различные функциональные возможности продукта.Пользователи могут выбрать использование функций A, B, D, но не C. Способ, которым я создаю это, заключается в том, что каждая отдельная функциональность является службой (без сохранения состояния, я думаю о сохранении данных в Azure SQL).БД и предоставление REST API от каждого сервиса).Все сервисы в комплекте - это ApplicationType.Для каждого созданного клиента-клиента (рассматривайте это как общую учетную запись группы пользователей), я имею в виду создание нового конкретного экземпляра зарегистрированного ApplicationType с использованием TenantManagementService и вызов client.ApplicationManager.CreateApplicationAsync() для экземпляра FabricClient, чтобыУ меня может быть выделенный экземпляр приложения, запущенный на моих узлах для этого арендатора.Однако, как я уже упоминал, арендатор может выбрать подписку только на определенные функции, которые привязаны к подмножеству услуг.Если арендатор выбирает только службу A моего Приложения, остальные экземпляры службы, соответствующие функциям B, C, D, не должны бездействовать на узлах.

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

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

Вот что я пробовал: Iпопытался установить InstanceCount 0 для служб при упаковке моего приложения.В моих ApplicationParameters XML-файлах:

<Parameters>
    <Parameter Name="FeatureAService_InstanceCount" Value="0" />
    <Parameter Name="FeatureBService_InstanceCount" Value="0" />
</Parameters>

Тем не менее, Service Fabric Explorer выводит сообщения при создании экземпляра приложения из такого типа приложения.Ошибка такова: zero service instance count error

Но, с другой стороны, когда служба развернута в матрице, она дает мне возможность удалить ее специально, поэтому этот сценарий должен бытьдействительный.enter image description here

Любые предложения приветствуются!

РЕДАКТИРОВАТЬ: Мое требование аналогично подходу, упомянутому здесь Андерсо - https://stackoverflow.com/a/35248349/1842699, Однако,Проблема, которую я специально пытаюсь решить, - загрузить экземпляр приложения с одной или несколькими упакованными службами с нулевым числом экземпляров!

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

@ uplnCloud

Надеюсь, я все правильно понимаю.

Ваша ситуация следующая:

  • У каждого клиента должно быть отдельное приложение (созданное из одного и того жеApplicationType).
  • Каждый клиент должен иметь только подмножество услуг (определено в ApplicationType).

Если я правильно понял, то это поддерживается сразу после установки.

Прежде всего вы должны удалить раздел <DefaultServices /> из ApplicationManifest.xml.Это будет указывать Service Fabric не создавать сервисы автоматически с приложением.

Теперь алгоритм следующий:

  1. Создание приложения с использованием FabricClient.ApplicationManager.CreateApplicationAsync()
  2. Для каждой требуемой функции создайте новую соответствующую Службу, используя FabricClient.ServiceManager.CreateServiceAsync() (вам необходимо указать Имя приложения для вновь созданного Приложения)

Также обратите внимание, что CreateServiceAsync() принимает ServiceDescriptor , которыйВы можете настроить все параметры, связанные с сервисом - начиная от схемы секционирования и заканчивая количеством экземпляров.

0 голосов
/ 26 июня 2018

Я просто добавлю это как новый ответ вместо того, чтобы комментировать другой ответ.

Как уже упоминалось, удалите DefaultServices из ApplicationManifest.Таким образом, каждый новый экземпляр ApplicationType, который вы создаете, будет подключен к сети без служб, и вам придется создавать их вручную в зависимости от того, какую функциональность выбрал ваш клиент.

Кроме того, переходя к «услугам на клиента»подход, убедитесь, что у вас достаточно узлов, чтобы справиться с нагрузкой, когда вы подключаете клиентов онлайн.В итоге у вас будет много процессов (так как экземпляры приложений) запускают свои собственные процессы служб, и если у вас мало узлов с большим количеством таких процессов, перезагрузка узлов кластера может занять некоторое время для стабилизации, поскольку это может потенциальноЕсть много услуг, которые необходимо переместить.Несмотря на то, что служба Stateless Services облегчит эту часть.

0 голосов
/ 25 июня 2018

К сожалению, у вас не может быть 0 служб экземпляра, Service Fabric считает, что именованная служба всегда существует (работает). В этом случае, когда вы определяете сервис (присваиваете имя экземпляру serviceType), на нем будет запущен хотя бы 1 экземпляр, в противном случае вам даже не нужно будет определять этот сервис в вашем приложении, если в этом нет необходимости. бегать.

Но то, что вы можете иметь, это определение ServiceType, это означает, что у вас есть двоичные файлы, но вы создадите их при необходимости.

Я предполагаю, что вы ограничены службами по умолчанию, где вы объявляете структуру приложения и служб заранее (до развертывания любого экземпляра приложения), вместо этого вам следует использовать динамическое создание службы через FabricClient , как вы или через Powershell, используя New-ServiceFabricApplication и New-ServiceFabricService .

По этой ссылке вы узнаете, как это сделать с помощью FabricClient

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...