Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Microsoft Azure Discussion :

Fonction AZURE et queue message FIFO


Sujet :

Microsoft Azure

  1. #1
    Membre régulier
    Fonction AZURE et queue message FIFO
    Bonjour,

    J'ai plusieurs fonction azure qui tournent dans un plan, chacune ayant un trigger sur une queue storage.

    Mon problème est que ce type de queue n'est pas de type FIFO. Globalement j'aimerai que les messages reçu soient traité dans l'ordre d'arrivé (indépendamment de la queue dans laquelle ils arrivent).

    Ce n'est pas possible actuellement et de ce que je comprends, le service bus permet d'ordonner les messages mais uniquement dans une session (un paquet) or je n'ai pas ce type de problématique.

    Je cherche un trigger de message qui les prenne par ordre d'arrivé.

    Une idée ?

  2. #2
    Modérateur

    Le Service Bus repond a cette problematique et garanti le FIFO : Storage queues and Service Bus queues - compared and contrasted.

    Si tu as absolument besoin du FIFO, il faut donc laisser tomber Azure Storage Queue et passer au Service Bus.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre régulier
    De ce que je comprends, il faut utiliser les sessions pour garantir l'ordre, mais dans un lot !

    J'ai des messages qui arrivent au fil de l'eau et je les traitent 1 par 1 car certains peuvent prendre du temps (traitement d'image). Il arrive que ma file d'attente contiennent parfois une cinquantaine de message et qu'un message stagne en file d'attente car d'autres lui passent devant (j'utilise la queue de mon storage).


    Concrètement je cherche un trigger pour ma fonction azure qui prenne les messages par ordre d'arrivé (les plus vieux en premier), sachant que je n'ai pas de notion de lot, mais je ne trouve pas !

  4. #4
    Modérateur

    Effectivement avec le Service Bus il faut utiliser les sessions. Je ne vois pas ce qui t'en empeche, tu peux creer une session par message... Le Service Bus contient des mecanismes internes qui garantissent le FIFO (par ex. Message sequencing and timestamps).

    Si tu n'es reellement pas en mesure d'utiliser les sessions du Service Bus, alors il faut que tu installes une VM et mantiennes ton propre systeme de queue comme par exemple Rabbit MQ.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre régulier
    Je viens de faire quelques tests avec les sessions et le problème reste le même, l'ordre n'est pas respecter car 1 message = 1 session.

    Je vais essayer de présenter le problème sous un autre angle car je cherche peut-être dans la mauvaise direction.

    J'ai un lot de fonction Azure qui fait de la conversion de PDF en image et inversement. Ces fonctions sont optimisées pour exploiter au max la capacité CPU d'un nœud azure c'est pourquoi je ne traite que les messages un part un.

    Les demandes/messages arrivent au fil de l'eau, je peux donc avoir 1 message en fil à l'instant T et 20 messages à l'instant T+1 et certains messages peuvent prendre 10s à être traités alors que d'autres 5min.

    Mon problème actuel est que je n'arrive pas à scaler assez vite pour absorber un pic de charge et de ce fait certain message dans ma queue storage tardent parfois à être traités. Concrètement, si en moyenne tous les temps de traitement sont raisonnables, j'en ai toujours un où deux qui passent aux oubliettes pendant quelques temps, d'où ma demande pour le FIFO afin de réduire au mieux le temps d'attente des plus mal servit.

    Avez-vous une idée d'optimisation ?

  6. #6
    Modérateur

    Merci pour les precisions !

    Citation Envoyé par rori Voir le message
    J'ai un lot de fonction Azure qui fait de la conversion de PDF en image et inversement. Ces fonctions sont optimisées pour exploiter au max la capacité CPU d'un nœud azure c'est pourquoi je ne traite que les messages un part un.
    Est-ce que tu peux preciser le scenario ici ? Par exemple, est-ce que ta perception que le FIFO n'est pas respecte ne viendrait pas que les fonctions Azure tournent en parallele, du coup les messages sont pris dans le bon ordre, mais comme certains sont traites plus vite que d'autres, ca te donne l'impression que le FIFO ne fonctionne pas ?

    Avec le Service Bus, c'est literalement garanti, meme entre plusieurs sessions.

    Si mon hypothese se confirme, alors une solution serait d'avoir une function Azure qui agirait en tant qu'orchestrateur qui depilerait et qui dispacherai les messages sur les differentes fonctions Azure. Ca revient au meme, sauf que tu as un moyen de t'assurer du FIFO toi-meme (le service bus gere ca tout seul donc attention a ne pas reinventer la roue).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre régulier
    Je viens de refaire des tests dans un environnement "propre" car ma solution est sur .NET Framework et les sessions sont disponible uniquement sur CORE. Mes messages semblent donc effectivement parsé en FIFO mais j'ai un autre soucis que je ne m'explique pas ! J'ai un délais de 1 minute entre chaque parsing de message et je ne comprends pas d'où cela vient !

  8. #8
    Modérateur

    Difficile a dire sans voir le code et sans pouvoir reproduire le scenario. Si tu debug pas a pas, est-ce que tu peux voir quelle est la ligne qui prend du temps ? Est-ce que tu rouvres ta connexion a chaque fois ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    Membre régulier
    La fonction Azure
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static class Function1
        {
            [FunctionName("MessageHub")]
            public static void Run([ServiceBusTrigger("messagehub2", Connection = "AzureBus", IsSessionsEnabled = true)]string myQueueItem, ILogger log)
            {
                log.LogInformation($"Test: {myQueueItem}");
            }
        }


    Le host.json
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {
      "version": "2.0",
      "extensions": {
        "serviceBus": {
     
          "SessionHandlerOptions": {
            "AutoComplete": true,
            "MaxConcurrentSessions": 1,
            "MaxAutoRenewDuration": "00:05:00"
          }
        }
      }
    }


    Je pense qu'on peut difficilement faire plus simple

    Le Bus contient déjà mes 100 messages quand je démarre la fonction. Le trigger prend un message par minute