Резольвер служб для служб без сохранения состояния в Service Fabric

Кажется, я получаю сообщение «Служба не найдена» всякий раз, когда пытаюсь разрешить конечную точку для службы без отслеживания состояния. Я пробовал использовать распознаватель служебных разделов, а также служебный прокси, но оба они дают одинаковые результаты. Есть ли ограничение на Service Fabric или я неправильно понимаю, как следует использовать службы без отслеживания состояния? В любом случае я не смог найти никакой документации.

Чтобы подробнее рассказать о том, что я пытаюсь сделать. Я создаю шлюз Api. Шлюз Api состоит из RegistryService и RoutingService.

У меня есть несколько приложений Service Fabric, некоторые из которых имеют "внешние" службы без сохранения состояния, которые используют WebApi и Owin. При запуске эти службы регистрируют свои маршруты в RegistryService.

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

Любые мысли были бы очень полезны


person Shahzad Ahmad    schedule 25.10.2016    source источник
comment
Первое, что нужно проверить, это то, что вы используете правильное имя службы (ткань: / yourapp / yourservice). Во-вторых, тип раздела. Службы без сохранения состояния обычно создаются с использованием схемы разделения Singleton, поэтому убедитесь, что ResolveAsync () запрашивает ту же схему разделения. Тот факт, что вы говорите, что это работает, когда вы переключаетесь на службу с отслеживанием состояния, заставляет меня думать, что вы передаете ключ раздела Int64 при вызове ResolveAsync.   -  person Vaclav Turecek    schedule 25.10.2016
comment
Спасибо @VaclavTurecek. У меня есть оператор case в моем синглтоне присваивания для без сохранения состояния и ключ раздела int64 для служб с отслеживанием состояния. и я проверил и перепроверил очень много вещей за последние 2 дня. Перепишите промежуточное ПО на 3/4 разными способами.   -  person Shahzad Ahmad    schedule 25.10.2016
comment
Я использую распознаватель по умолчанию. Это имеет значение?   -  person Shahzad Ahmad    schedule 25.10.2016


Ответы (2)


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

            var resolver = ServicePartitionResolver.GetDefault();
            var fabricClient = new FabricClient();
            var apps = fabricClient.QueryManager.GetApplicationListAsync().Result;
            foreach (var app in apps)
            {
                Console.WriteLine($"Discovered application:'{app.ApplicationName}");

                var services = fabricClient.QueryManager.GetServiceListAsync(app.ApplicationName).Result;
                foreach (var service in services)
                {
                    Console.WriteLine($"Discovered Service:'{service.ServiceName}");

                    var partitions = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result;
                    foreach (var partition in partitions)
                    {
                        Console.WriteLine($"Discovered Service Partition:'{partition.PartitionInformation.Kind} {partition.PartitionInformation.Id}");


                        ServicePartitionKey key;
                        switch (partition.PartitionInformation.Kind)
                        {
                            case ServicePartitionKind.Singleton:
                                key = ServicePartitionKey.Singleton;
                                break;
                            case ServicePartitionKind.Int64Range:
                                var longKey = (Int64RangePartitionInformation)partition.PartitionInformation;
                                key = new ServicePartitionKey(longKey.LowKey);
                                break;
                            case ServicePartitionKind.Named:
                                var namedKey = (NamedPartitionInformation)partition.PartitionInformation;
                                key = new ServicePartitionKey(namedKey.Name);
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("partition.PartitionInformation.Kind");
                        }
                        var resolved = resolver.ResolveAsync(service.ServiceName, key, CancellationToken.None).Result;
                        foreach (var endpoint in resolved.Endpoints)
                        {
                            Console.WriteLine($"Discovered Service Endpoint:'{endpoint.Address}");
                        }
                    }
                }
person LoekD    schedule 26.10.2016

Так что для всех, кто приходит сюда. Похоже, это не проблема. Сброс кластера SF исправил это.

person Shahzad Ahmad    schedule 26.10.2016