Кто должен владеть логикой разрешения служб в Service Fabric Stateful Services?

Я использую службы Service Fabric с отслеживанием состояния для хранения сведений о пользователях в системе. Моя стратегия разделения состоит в том, чтобы использовать нормализованный номер телефона в международном строковом формате для обращения к именованному экземпляру службы и хэш номера телефона для разрешения раздела этой службы. ПРИМЕР: Fabric:/myapp/users/1/718 (где международный номер телефона +1718xxxxxxx). Это позволяет мне определять геолокацию сервисов в зависимости от их страны (и далее на рынках США/Канады по коду города).

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

  1. Мой первоначальный подход заключался в том, чтобы сделать идентификатор байтом [], который включал имя службы, идентификатор раздела и локальный идентификатор пользователя. Я отказался от этой идеи, так как размер идентификатора был очень большим и со временем увеличивался. (это проблематично, потому что все ключи в надежном словаре должны помещаться в память, и я бы не хотел убивать тонну памяти для идентификаторов). Кроме того, он по-прежнему несет с собой багаж всех, кто использует идентификатор, зная, как интерпретировать идентификатор и использовать его соответственно.
  2. Моей следующей идеей было предоставить клиентскую библиотеку всем, кто пользуется услугами. Это также имеет недостаток бинарной зависимости потребляющей службы. Если я хочу изменить стратегию в будущем, мне придется пройти через кучу обручей, чтобы обработать сбои, чтобы правильно разрешить сущность.
  3. Последняя альтернатива, о которой я могу думать, - это иметь прокси-сервер без сохранения состояния перед службой с отслеживанием состояния, которая обрабатывает разрешение для всех служб. Это наиболее привлекательно с точки зрения дизайна, но также требует управления, создания еще одного сервиса только для решения проблемы. Не против, а как дополнительное соображение. Если я пойду по этому пути, следует ли мне использовать эту службу как отдельное приложение Service Fabric или целесообразно хранить все как одно приложение.

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




Ответы (1)


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

Это приводит к варианту 3 в сочетании со встроенной службой обратного прокси. В этой дополнительной службе вы можете найти аутентифицированного пользователя и использовать его местоположение для определения служебного раздела.

Если вы сделаете его новым приложением, оно может стать точкой входа (/proxy) для нескольких ограниченных контекстов.

person LoekD    schedule 08.08.2017
comment
Можете ли вы расширить идею комбинирования со встроенной службой обратного прокси-сервера? В настоящее время я использую GRPC в качестве протокола связи для служб внутри внешней границы кластера. - person Justin Blakley; 08.08.2017
comment
Если подумать, забудьте о бите RP, это просто добавит накладных расходов. простите - person LoekD; 11.08.2017