Подключиться к конкретному экземпляру службы с помощью ServiceProxy.Create - PullRequest
0 голосов
/ 23 октября 2018

У меня есть общедоступная служба ASP.NET Core с 5 экземплярами, по одному на каждом узле кластера сервисной фабрики.У меня также есть рабочий сервис с одним экземпляром, основным, потому что это сервис с состоянием.Я хочу позвонить из рабочей службы конкретному экземпляру внешнего интерфейса.

Я использую следующий стандартный код для создания соединения ...

IFrontend c = ServiceProxy.Create<IFrontend>(new Uri("fabric:/MyApp/FrontendService"));

Это работает, но будет подключаться к одной из 5 служб ASP.NET Core и может быть любым изих.Я хочу подключиться к конкретному.Существует ли какой-либо конкретный формат, в котором вы можете указать идентификатор экземпляра службы?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Как упомянул PeterBons, не существует прямого решения для такого рода проблем, есть много уловов, которые необходимо знать, прежде чем вы решите какой-либо подход, связанный с вашим первоначальным планом, я могу указать несколько, возможно, поможет вам сделать лучшерешение:

  • Нет гарантии, что пользователь будет подключен к FE1, когда ответ будет получен, даже если вы оставите соединение открытым, соединение может прерваться, и пользователь может подключиться к FE2, когда онпроизойдет, ваш ответ будет перенаправлен на неправильный сервер.
  • Возможно, пользователь по-прежнему подключен к тому же узлу при переподключении, но исходная служба может перемещаться, что характерно для SF, когда службы перемещаются вокруг узлов вв случае сбоев или балансировки нагрузки, в этом случае соединение может разорваться и повторно подключиться на том же узле; если вы отслеживаете раздел, возможно, раздел уже находится на другом узле, получая бесполезное сообщение.
  • Ответ работника может не сработать при отправке сообщения в FE1и вам нужно будет обрабатывать повторы в Worker, то же самое может случиться, если FE для пользователя потерпит неудачу, вы также должны добавить туда логику повторения, увеличивая сложность.

Некоторые подходы, которые могутwork:

  • Сделайте связь асинхронной, используя шину сообщений в середине, чтобы обе службы не заботились о состоянии друг друга, каждый ответ, отправленный от Worker к FE, будет асинхронным, любойсбой может быть обработан в свое время независимо.Возможно, вы захотите использовать:

    • Одна очередь сообщений на раздел или
    • Одна тема публикации / подпункта для всех разделов и каждый обрабатывает то, что затем пересылается.
  • Или можете использовать службу PaaS, которая управляет этим для вас, например, Служба Azure SignalR , в этом случае вам требуется только уникальная идентификация для клиента иработник держит его, чтобы отправить ответ обратно.

0 голосов
/ 23 октября 2018

Нет прямого решения для этого.Одна вещь, о которой я могу подумать, - это чтобы служба ASP.NET Core отправляла сообщение бэкэнду для регистрации присутствия WebSocket, и чтобы это сообщение включало в себя имя узла, на котором работает служба внешнего интерфейса (через ServiceContext.NodeContext.NodeName).

Затем создайте механизм pub / sub для отправки, отправьте сообщение (включая имя узла назначенного экземпляра службы ASP.NET Core, к которому вы хотите обратиться) из серверной части во все экземпляры службы ASP.NET Core и разрешите толькоэкземпляр службы ASP.NET Core обрабатывает сообщение, если имена узлов совпадают.

Вы можете использовать этот проект для этого

Ссылки:
Вызовконкретный экземпляр службы в Azure Service Fabric

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b7cc7df3-9872-4000-8cc6-c48cb47b0b3f/calling-all-stateless-service-instances-via-serviceproxy?forum=AzureServiceFabric

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