2017-07-21 2 views
6

J'essaie de créer un service qui mettra à jour une liste externe de points de terminaison de service pour les applications s'exécutant dans mon cluster de matrice de service. (Fondamentalement, j'ai besoin de répliquer l'équilibreur de charge Azure dans mon équilibreur de charge F5 sur site.)Abonnement aux événements de niveau de cluster Service Fabric

Au cours du service du mois dernier Q & A, l'équipe m'a pointé à RegisterServiceNotificationFilterAsync.

J'ai créé un service sans état à l'aide de cette méthode et l'ai déployé dans mon cluster de développement. J'ai ensuite créé un nouveau service en exécutant le modèle de service ASP.NET Core Stateless.

Je m'attendais à ce que lorsque je déployais le second service, le point de rupture atteignait mon premier service, indiquant qu'un service avait été ajouté. Mais aucun point d'arrêt n'a été touché.

J'ai trouvé très peu d'exemples pour ce genre de choses sur Internet, alors je demande ici de sauter que quelqu'un d'autre a fait cela et peut me dire où je me suis trompé.

Voici le code pour mon service qui essaie d'attraper les changements d'application:

protected override async Task RunAsync(CancellationToken cancellationToken) 
{ 

    var fabricClient = new FabricClient(); 

    long? filterId = null; 


    try 
    { 
     var filterDescription = new ServiceNotificationFilterDescription 
     { 
      Name = new Uri("fabric:") 
     }; 
     fabricClient.ServiceManager.ServiceNotificationFilterMatched += ServiceManager_ServiceNotificationFilterMatched; 
     filterId = await fabricClient.ServiceManager.RegisterServiceNotificationFilterAsync(filterDescription); 


     long iterations = 0; 

     while (true) 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 

      ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations); 

      await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); 
     } 
    } 
    finally 
    { 
     if (filterId != null) 
      await fabricClient.ServiceManager.UnregisterServiceNotificationFilterAsync(filterId.Value); 
    } 



} 

private void ServiceManager_ServiceNotificationFilterMatched(object sender, EventArgs e) 
{ 
    Debug.WriteLine("Change Occured"); 
} 

Si vous avez des conseils sur la façon d'obtenir ce que ça va, j'aimerais les voir.

+0

Pas vraiment lié à votre question mais .. 'Fondamentalement, j'ai besoin de répliquer Azure Load Balancer' - Je ne suis pas la fonctionnalité que vous essayez de répliquer ici? D'après ce que je sais ALB est assez "stupide" et inconscient de SF? – Mardoxx

+0

Pouvez-vous essayer 'Name = new Uri (" fabric:/")' – LoekD

+0

@LoekD - Je l'ai fait de cette façon à cause de ce post, où un employé de Microsoft a dit de le faire sans la barre oblique finale. https://github.com/Azure/service-fabric-issues/issues/122 Je l'ai quand même essayé, et j'ai "Invalid Name URI". – Vaccano

Répondre

1

Vous devez définir la MatchNamePrefix true, comme ceci:

var filterDescription = new ServiceNotificationFilterDescription 
    { 
     Name = new Uri("fabric:"), 
     MatchNamePrefix = true 
    }; 

sinon il ne donnera que des services spécifiques. Dans mon application, je peux attraper des événements à l'échelle du cluster lorsque ce paramètre est défini sur true.