2017-02-07 7 views
0

Я использую Azure Service Fabric с услугами без состояния. У меня есть список служб, развернутых в приложении, и есть соглашение об именах, используемое с этими именами служб. Я хотел бы получить список служб, соответствующих выражению фильтра.Как вы используете службуNameFilter при вызове QueryClient.GetServiceListAsync

Вот ссылка на скриншот моей исследовательской ткани. У меня нет точек репутации, чтобы опубликовать изображение.

Service Fabric Explorer screenshot

В этом примере имя моего приложения SFApp1, и имя моей службы HelloWorldStateless. Я хотел бы запросить кластер ткани службы, чтобы найти все службы с именем «HelloWorldSt *» (в соответствии с приложением SFApp1, конечно).

Я знаю, что могу найти все службы с именем приложения «fabric:/SFApp1», и он вернет все службы под этим приложением. Эта перегрузка GetServiceListAsync принимает только URI приложения.

FabricClient client = new FabricClient(); 
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1")).Result; 

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

FabricClient client = new FabricClient(); 
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldStateless")).Result; 

Что я пытаюсь выяснить, есть ли способ сделать что-то вроде поиска подстановочных знаков.

FabricClient client = new FabricClient(); 
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldSt*")).Result; 

Имя параметра, где указано имя службы serviceNameFilter, а метод возвращает список. Мне интересно, почему они вернут список для этой перегрузки, если результат всегда будет списком с одним элементом. Кроме того, имя параметра «serviceNameFilter» предлагает (по крайней мере для меня), что есть возможность предоставить какое-то выражение, чтобы сузить список.

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

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

Было бы неплохо, если бы я мог проверить исходный код, чтобы ответить на него сам.

Есть ли способ сделать то, что я пытаюсь сделать, или я просто неверно истолковываю то, что означает «serviceNameFilter», а это просто означает, что вы должны поместить весь URI службы, который вы ищете?

Спасибо за любую помощь, которую вы можете предоставить!

ответ

1

К сожалению, этот параметр API назван страшно. На самом деле это не фильтр, это просто имя службы (поскольку нет другого запроса, который просто возвращает одну услугу, так вы «фильтруете» все сервисы в приложении вплоть до одного, в частности).

Ближайшая вещь к тому, что вы ищете, это EnumerateSubnames. Это не поиск подстановочных знаков, но вы можете получить все имена, которые существуют под «именем» (например, все имена служб, которые существуют в приложении, или все имена с определенным префиксом).В зависимости от структуры того, как вы создаете свои имена сервисов, это может сработать для вас.

// System.Fabric.FabricClient.PropertyManagementClient 
public Task<NameEnumerationResult> EnumerateSubNamesAsync(Uri name, NameEnumerationResult previousResult, bool recursive) 

Например: предполагают следующие имена существуют в кластере:

  1. ткани:/SomeApplication/Zone1/Service1
  2. ткани:/SomeApplication/Zone1/Service2
  3. ткани:/SomeApplication/Zone2/Service1

Обратите внимание, что в этом случае приложение было бы создано с помощью na me ":/SomeApplication", а затем услуги с подробными именами выше, включающими сегмент «Зона».

Если вы сейчас EnumerateSubnames ("fabric:/SomeApplication/Zone1", null, true), вы получите результат, который дал бы вам полные имена, которые были сопоставлены (1выше).