2016-06-26 4 views
1

Я создаю службу без состояния внутри Azure Service Fabric. Однако после запуска службы (или при запуске пользовательского прослушивателя сообщений) мне нужно получить адреса всех других экземпляров/разделов этой службы.Получить все активные служебные экземпляры при запуске службы

Я делаю это, создавая новый FabricClient и позвонив по телефону fabricClient.QueryManager.GetPartitionListAsync(serviceUri). Однако я получаю FabricServiceNotFoundException с сообщением Услуга не существует., когда запускается первый экземпляр службы.

Я не мог найти это в документации, поэтому мой вопрос: как я могу получить список прослушивающих адресов конечных точек для всех активных экземпляров конкретной службы, работающих в Azure Service Fabric, когда новый экземпляр этой службы начинает работать?

ответ

3

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

В Reliable Services SDK (в пространстве имен Microsoft.ServiceFabric.Services.Client), мы предлагаем утилиту распознавателя, что делает это немного проще:

ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault(); 

ResolvedServicePartition partition = 
    await resolver.ResolveAsync(new Uri("fabric:/MyApp/MyService"), new ServicePartitionKey(), cancellationToken); 

Свойство Endpoints из ResolvedServicePartition список каждого replica/instance в разделе. Свойство Address будет содержать JSON объект, который представляет собой список пар ключ-значение, содержащее каждый слушатель, который открыт с помощью реплик/например:

{ 
    "Endpoints" : 
     { "mylistener1" : "some-address" }, 
     { "mylistener2" : "some-address" } 
     ... 
} 

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

Смотрите здесь для получения дополнительной информации: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-connect-and-communicate-with-services/

И здесь для получения более подробной информации: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-communication/

+0

Извините, но ваше решение также заканчивается 'System.Fabric.FabricServiceNotFoundException': * Служба не существует * сообщение. Я думаю, что это так, как работает сервисная ткань. – Horusiath

+0

В какой момент жизненного цикла вашего сервиса вы пытаетесь получить адреса каждого экземпляра или реплики? –

+0

Эта информация не может быть найдена где-либо еще в interwebs ... Спасибо – Froyke

0

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

ResolvedServicePartition partition = await fabricClient.ServiceManager.ResolveServicePartitionAsync("fabric:/Application1/Service1"); 

// This "endpoint" looks something like this: {\"Endpoints\":{\"\":\"http:\/\/localhost:8448\/\"}} 
string randomConfigStoreEndpointJson = partition.GetEndpoint().Address; 

// Use Newtonsoft.Json to parse this mess, since JavaScriptSerializer isn't up to the job 
JObject endpointObject = JObject.Parse(randomConfigStoreEndpointJson); 

// This is the only way I could actually extract the baseUrl without regular expressions 
string actualEndpointBaseUrl = endpointObject["Endpoints"].First.First.ToString(); 

@DannyMeister Это позаботится о разборе синтаксиса нечетного конечного конца JSON.

Это также работает, чтобы разрешить обслуживание с состоянием только с одним разделом. Чтобы разрешить службу состояния с несколькими разделами, вы должны определить разделKey на клиенте, а затем вызвать await fabricClient.ServiceManager.ResolveServicePartitionAsync("fabric:/Application1/Service1", statefulPartitionKey);!

 Смежные вопросы

  • Нет связанных вопросов^_^