0

J'essaie d'utiliser le bus de service Azure pour transmettre des messages entre plusieurs fonctions azure. Je crée un sujet et un abonnement dans le code. Mais ne savez pas comment ajouter une requête de filtre à partir du code. Je veux filtrer les messages par ID. par exemple SqlFilter($"'id' ='{id}'"). Je ne veux pas créer un abonnement pour chaque message à cause de ce filtre.Abonnement Azure Service Bus Topic avec requête de filtre SQL dynamique

Est-il possible d'avoir un filtre différent pour un abonnement?

Ce problème peut être résolu en créant un abonnement pour chaque requête et en le supprimant par la suite. Mais je ne veux pas créer autant d'abonnements. Mon but est de simplement changer le filtre chaque fois que la fonction est appelée.

Exemple de code:

var connectionString = ConfigurationManager.AppSettings["ServiceBus_CONNECTION_STRING"]; 
       var namespaceManager = 
        NamespaceManager.CreateFromConnectionString(connectionString); 
       if (!await namespaceManager.TopicExistsAsync(topicName)) 
       { 
        // Configure Topic Settings. 
        var topic = new TopicDescription(topicName) 
        { 
         MaxSizeInMegabytes = 1024, 
         DefaultMessageTimeToLive = TimeSpan.FromMinutes(5) 
        }; 

        await namespaceManager.CreateTopicAsync(topic); 
       } 

       if (!await namespaceManager.SubscriptionExistsAsync(topicName, subscription)) 
       { 
        await namespaceManager.CreateSubscriptionAsync(topicName, subscription); 
       } 

       var cts = new TaskCompletionSource<T>(); 
       var subClient = 
        SubscriptionClient.CreateFromConnectionString(connectionString, topicName, 
         subscription); 

       var ruleDescription = new RuleDescription($"RequestIdRule{id}", new SqlFilter($"'id' ='{id}'")); 

       await subClient.AddRuleAsync(ruleDescription); 
       var options = new OnMessageOptions(); 

       subClient.OnMessage(m => 
        { 
         try 
         { 

          var body = m.GetBody<T>(); 
          cts.SetResult(body); 
         } 
         catch (Exception ex) 
         { 

          m.Abandon(); 
         } 
        }, 
        options); 

       return await cts.Task; 

      } 
      catch (Exception ex) 
      { 
       throw; 
      } 

Répondre

1

Est-il possible d'avoir différents filtres pour un abonnement?

Oui. Un seul sujet avec tous ses abonnements peut avoir jusqu'à 2 000 filtres SQL (100 000 pour les filtres de corrélation). Voir la documentation here.

Vous ne pouvez pas mettre à jour un filtre. Vous devez supprimer l'ancienne règle et la remplacer par une nouvelle en en créant une. Mais je doute de l'efficacité de cette approche si vous le faites fréquemment au moment de l'exécution. J'essaye d'employer le bus de service d'azur pour passer des messages entre plusieurs fonctions d'azur. Vous pouvez également avoir chaque file d'attente d'entrée de chaque fonction, où le chaînage de ces fonctions enverrait un message à la file d'attente d'entrée du bus de service Azure appropriée.

Et enfin,

Mon but est de simplement changer le filtre à chaque fois que la fonction est appelée.

Si vous avez un pic de messages, votre fonction sera réduite. Cela signifie que vous pouvez exécuter la même fonction pour différents messages. Chaque message nécessiterait la création d'une règle différente sous le même abonnement. Non seulement il se sent off, mais il va créer une contention sur l'abonnement pour mettre à jour la règle qui conduira à un échec ou un comportement incorrect.