Der primäre Teil der "Metadaten", den Sie erhalten, ist der Name der Service-/Anwendungsinstanz. Darüber habe ich in meinem anderen post gesprochen. Die Methode, die funktioniert, besteht darin, jede Dienst-/Anwendungsinstanz mit einem Namen zu erstellen, der einige Informationen enthält, die Clients bei der Lösung verwenden können. Clients können Service Fabric dann nach benannten Anwendungs-/Serviceinstanzen abfragen und eine Verbindung zu einem bestimmten herstellen. Der Name einer Dienst-/Anwendungsinstanz ist URI. Sie können daher eine Pfadhierarchie verwenden, um Informationen zu kategorisieren.
Fortfahren mit dem Audio/Video-Beispiel: Lassen Sie uns dieses Beispiel erweitern, so dass wir eine Anwendung haben, die bestimmte Aufgaben für bestimmte Medienformate für Audio oder Video ausführen kann. Jede Kombination von Aufgaben + Medienformat ist eine einzigartige namens Service-Instanz, was zu einem Einsatz, die etwa wie folgt aussieht:
Application:
fabric:/avapp
Services:
fabric:/avapp/video/encoding/mp4
fabric:/avapp/video/encoding/h264
fabric:/avapp/video/captioning/english
fabric:/avapp/video/captioning/czech
fabric:/avapp/audio/encoding/aac
fabric:/avapp/audio/encoding/mp3
etc.
Jetzt Clients können Service-Fabric abfragen, um zu entdecken, welche Dienste zur Verfügung:
FabricClient fabricClient = new FabricClient();
System.Fabric.Query.ServiceList services = await fabricClient.QueryManager.GetServiceListAsync(new Uri("fabric:/avapp"));
Dann können Sie einfach die Liste der Dienste mit LINQ abfragen. Zum Beispiel, wenn ich alle Dienste sehen möchten, die Video-Codierung tun:
ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();
ResolvedServicePartition servicePartition = await resolver.ResolveAsync(new Uri("fabric:/avapp/video/encoding/h264"), new ServicePartitionKey(1), cancellationToken);
ResolvedServiceEndpoint endpoint = servicePartition.GetEndpoint();
Es ist ein bisschen mehr zu:
services.Where(x => x.ServiceName.AbsolutePath.Contains("video/encoding"));
Und dann können Sie eine Adresse für einen bestimmten Dienst zu beheben, um es zu verbinden die Adresse Auflösung Teil (see here), aber das ist die allgemeine Idee.
Anwendungsinstanzen können auch benutzerdefinierte Anwendungsparameter (Schlüssel/Wert-Paare) festlegen, die zum Zeitpunkt der Erstellung pro Instanz festgelegt werden können. Sie werden nicht im Anwendungsnamen angezeigt, Sie erhalten diese Informationen jedoch zurück, wenn Sie Service Fabric nach einer Liste der ausgeführten Anwendungsinstanzen fragen. Dies kann möglicherweise auch als Metadaten von Clients verwendet werden, wenn sie entscheiden müssen, mit welcher Anwendung eine Verbindung hergestellt werden soll.
Update: Weitere Informationen über Anwendungsinstanz Parameter:
Wenn Sie create a new application instance können Sie eine Reihe von Schlüssel-Wert-Paare in der application description liefern. Dann, wenn Sie query Service Fabric for application instances Sie erhalten eine Liste von Application Ergebnisobjekte, die die genannten Parameter haben. Dies wird auch in Visual Studio in Ihrem Anwendungsprojekt angezeigt, wo Sie umgebungsspezifische Anwendungsparameterdateien haben. Visual Studio extrahiert diese Schlüssel/Wert-Paare aus den XML-Dateien und verwendet sie in der Anwendungsbeschreibung, wenn eine Instanz Ihrer Anwendung erstellt wird.
Wenn Sie Abfrage Anwendungen sagen/services die Metadaten verwenden, dürfen Sie so dass Sie bedeuten, dass ein Kunde für einen bestimmten Dienst basierend auf den verfügbaren Metadaten suchen? Haben Sie ein konkretes Beispiel dafür, was Sie gerne tun würden? –
Korrigieren.In dem Post, auf den ich verwiesen habe, haben Sie sich auf fabric: // app/service/property uri bezogen, und ich war mir nicht sicher, wie ich das erreichen soll und was ein "property" -Wert ist. Beispiel: könnte mehrere Anwendungen haben, die zu einer logischen "Umgebung" gehören. Wenn ich alle diese Dienste abfragen müsste, wie würde ich darüber gehen, ist nicht klar. Deshalb habe ich über benutzerdefinierte Metadaten nachgedacht. –
@VaclavTurecek ist das, was Sie klären wollten? –