Tous les produits
Search
Centre de documentation

ApsaraMQ for RocketMQ:Nouvelle tentative de consommation

Dernière mise à jour :Aug 09, 2026

Si un consommateur rencontre une exception, ApsaraMQ for RocketMQ rediffuse le message en fonction de la politique de nouvelle tentative de consommation afin d'effectuer une récupération après incident. Cette rubrique décrit les cas d'utilisation, le mécanisme de fonctionnement, la compatibilité des versions et les recommandations d'utilisation de la fonctionnalité de nouvelle tentative de consommation.

Scénarios

La nouvelle tentative de consommation ApsaraMQ for RocketMQ répond principalement aux problèmes d'exhaustivité de la consommation des messages causés par des échecs dans la logique de traitement métier. Il s'agit d'une stratégie de secours pour votre activité et ne doit pas être utilisée pour le contrôle du flux métier.

  • Utilisez la nouvelle tentative de message dans les scénarios suivants :

    • Le traitement métier échoue et l'échec est lié au contenu actuel du message ; par exemple, la résolution de la transaction pour ce message n'a pas encore été obtenue, mais un succès est attendu après un court délai.

    • La cause de l'échec de consommation n'est pas systémique, ce qui signifie que le message actuel échoue en raison d'un événement rare plutôt que d'un échec constant, et les messages suivants sont susceptibles de réussir. Dans ce cas, la nouvelle tentative du message actuel évite de bloquer le processus.

  • Évitez la nouvelle tentative de message dans les scénarios suivants :

    • L'utilisation de l'échec de consommation comme branche conditionnelle dans la logique de traitement est déraisonnable, car la logique anticipe déjà des occurrences fréquentes de cette branche.

    • L'utilisation de l'échec de consommation pour implémenter une limitation de débit est inappropriée. La limitation de débit vise à mettre temporairement en file d'attente le trafic excédentaire pour lisser les pics, et non à acheminer les messages vers le chemin de nouvelle tentative.

Objectif

Lorsque le middleware orienté message est utilisé pour le découplage asynchrone, un défi à surmonter consiste à garantir l'intégrité de la chaîne d'appel si le service en aval ne parvient pas à traiter les messages. ApsaraMQ for RocketMQ, en tant que middleware orienté message fiable de niveau financier, est conçu intrinsèquement pour prendre en charge une stratégie de transmission fiable dans son mécanisme de traitement de la livraison des messages, garantissant que chaque message est traité comme prévu par l'activité grâce à des mécanismes complets d'accusé de réception et de nouvelle tentative.

Comprendre le mécanisme d'accusé de réception des messages et les politiques de nouvelle tentative de consommation de ApsaraMQ for RocketMQ peut vous aider à analyser les problèmes suivants :

  • Comment garantir un traitement complet des messages : connaître la politique de nouvelle tentative vous aide à concevoir une logique de consommateur qui garantit que chaque message est entièrement traité, empêchant ainsi l'ignorance des messages et l'incohérence des états métier.

  • Comment récupérer l'état des messages lors de pannes système : cela clarifie comment les états des messages en cours sont restaurés lors d'anomalies système (telles que des pannes) et si une incohérence d'état peut se produire.

Politique de nouvelle tentative de consommation

La politique de nouvelle tentative de consommation définit l'intervalle de nouvelle tentative et le nombre maximal de nouvelles tentatives après qu'un consommateur a échoué à traiter un message.

Déclencheurs de nouvelle tentative

  • Échec de consommation, y compris le retour d'un statut d'échec ou le lancement d'une exception inattendue.

  • Délai d'expiration du traitement des messages, y compris le délai d'expiration de la file d'attente dans PushConsumer.

Principaux comportements de nouvelle tentative

  • Machine d'état de nouvelle tentative : contrôle les états des messages et les transitions lors de la nouvelle tentative.

  • Intervalle de nouvelle tentative : le temps entre un échec de consommation (ou un délai d'expiration) et le moment où le message devient disponible pour une reconsommation.

  • Nombre maximal de nouvelles tentatives : le nombre maximal de fois où un message peut faire l'objet d'une nouvelle tentative.

Différences de politique de nouvelle tentative de message

Les mécanismes de nouvelle tentative et les méthodes de configuration diffèrent selon le type de consommateur comme suit :

Type de consommateur

Machine d'état de nouvelle tentative

Intervalle de nouvelle tentative

Nombre maximal de nouvelles tentatives

PushConsumer

  • Ready

  • Processing

  • WaitingRetry

  • Commit

  • Dead Letter

  • Discard

Contrôlé par les métadonnées lors de la création du groupe de consommateurs.

  • Messages non ordonnés : Intervalle par paliers

  • Messages ordonnés : Intervalle fixe

Défini via la console ou l'OpenAPI

Modifier le nombre maximal de nouvelles tentatives

SimpleConsumer

  • Ready

  • Processing

  • Commit

  • Dead Letter

  • Discard

Définissez la durée d'invisibilité lors de la récupération des messages via l'API.

Défini via la console ou l'OpenAPI

Modifier le nombre maximal de nouvelles tentatives

Pour les politiques de nouvelle tentative détaillées, consultez Politique de nouvelle tentative de consommation PushConsumer et Politique de nouvelle tentative de consommation SimpleConsumer.

Politique de nouvelle tentative de consommation PushConsumer

Machine d'état de nouvelle tentative

Lorsque PushConsumer traite les messages, ceux-ci transitent par les états suivants :Push消费状态机

  • Ready : état prêt.

    Le message est prêt sur le serveur ApsaraMQ for RocketMQ et peut être consommé par les consommateurs.

  • Inflight : état de traitement.

    Inflight : le message a été récupéré par le client consommateur et est en cours de traitement, mais n'a pas encore renvoyé de résultat de consommation.

  • WaitingRetry : état d'attente de nouvelle tentative, un état propre aux consommateurs push.

    WaitingRetry : un état spécifique à PushConsumer déclenché lorsque le traitement du message échoue ou expire. Si le nombre actuel de nouvelles tentatives n'a pas atteint le maximum, le message passe à WaitingRetry. Après l'intervalle de nouvelle tentative, il revient à Ready pour une reconsommation. Les intervalles de nouvelle tentative augmentent au fil des tentatives pour éviter les nouvelles tentatives à haute fréquence en cas d'échecs persistants.

  • Commit : état de validation.

    Commit : indique une consommation réussie. La machine d'état du message se termine lorsque le consommateur renvoie une réponse de succès.

  • DLQ : file d'attente des messages morts.

    DLQ : état de message mort — le dernier recours. Si les nouvelles tentatives dépassent le nombre maximal et que la conservation des messages morts est activée, le message ayant échoué est envoyé à un topic de messages morts. Vous pouvez consommer les messages de ce topic pour restaurer les opérations métier. Pour plus de détails, consultez Messages morts.

  • Discard : rejet.

    Discard : si les nouvelles tentatives dépassent le nombre maximal et que la conservation des messages morts est désactivée, le message est rejeté.

消息间隔时间

Exemple : dans le schéma ci-dessus, supposons qu'un message reste en état Ready pendant 5 secondes et prend 6 secondes à traiter.

Chaque cycle de nouvelle tentative suit la séquence Ready → Inflight → WaitingRetry. L'intervalle de nouvelle tentative correspond au temps entre un échec (ou un délai d'expiration) et le moment où le message redevient Ready. Le temps réel entre deux tentatives de consommation inclut également le temps de traitement et la durée en état Ready. Par exemple :

  • À 0 s, le message passe en état Ready.

  • En raison de la vitesse de traitement du consommateur, la consommation commence à 5 s. Après 6 secondes (à 11 s), une exception se produit et le client renvoie un échec.

  • La nouvelle tentative ne peut pas commencer immédiatement ; elle doit attendre l'intervalle de nouvelle tentative.

  • À 21 s, le message redevient Ready.

  • Le client commence à reconsommer 5 secondes plus tard.

Ainsi, l'intervalle réel entre deux tentatives de consommation est : temps de traitement + intervalle de nouvelle tentative + durée en état Ready = 21 s.

Intervalles de nouvelle tentative

  • Messages non ordonnés (messages non séquencés) : l'intervalle de nouvelle tentative utilise une approche temporelle par paliers, comme suit :

    |
    **Tentative de nouvelle tentative**
    |
    **Intervalle de nouvelle tentative**
    |
    **Tentative de nouvelle tentative**
    |
    **Intervalle de nouvelle tentative**
    | | --- | --- | --- | --- | |
    1
    |
    10 secondes
    |
    9
    |
    7 minutes
    | |
    2
    |
    30 secondes
    |
    10
    |
    8 minutes
    | |
    3
    |
    1 minute
    |
    11
    |
    9 minutes
    | |
    4
    |
    2 minutes
    |
    12
    |
    10 minutes
    | |
    5
    |
    3 minutes
    |
    13
    |
    20 minutes
    | |
    6
    |
    4 minutes
    |
    14
    |
    30 minutes
    | |
    7
    |
    5 minutes
    |
    15
    |
    1 heure
    | |
    8
    |
    6 minutes
    |
    16
    |
    2 heures
    |
    Remarque

    Si les tentatives de nouvelle tentative dépassent 16, toutes les nouvelles tentatives suivantes utilisent un intervalle de 2 heures.









































































  • Messages ordonnés : utilisez un intervalle de nouvelle tentative fixe. Pour les valeurs spécifiques, consultez Limites des paramètres.

Nombre maximal de nouvelles tentatives

  • Valeur par défaut : 16.

  • Maximum : 1 000.

Pour PushConsumer, le nombre maximal de nouvelles tentatives est contrôlé par les métadonnées du groupe de consommateurs. Pour le modifier, consultez Modifier le nombre maximal de nouvelles tentatives.

Par exemple, si le nombre maximal de nouvelles tentatives est de 3, le message est livré jusqu'à 4 fois : une fois initialement et trois fois via nouvelle tentative.

Exemple d'utilisation

Pour déclencher une nouvelle tentative dans PushConsumer, il suffit de renvoyer un code d'état d'échec de consommation. Les exceptions inattendues sont automatiquement interceptées par le SDK.

SimpleConsumer simpleConsumer = null;
        // Consumption example: Use PushConsumer to consume normal messages. Return an error on failure to trigger retry.
        MessageListener messageListener = new MessageListener() {
            @Override
            public ConsumeResult consume(MessageView messageView) {
                System.out.println(messageView);
                // Return FAILURE to trigger automatic retry until the maximum retry count is reached.
                return ConsumeResult.FAILURE;
            }
        };
            

Consulter les journaux de nouvelle tentative de consommation

Pour les messages ordonnés, PushConsumer effectue les nouvelles tentatives côté client. Le serveur ne peut pas accéder aux journaux de nouvelle tentative détaillés. Si la trace des messages indique un échec de livraison pour un message ordonné, vérifiez les journaux du client consommateur pour obtenir le nombre maximal de nouvelles tentatives et les informations sur le client.

Pour le chemin d'accès aux journaux du client, consultez Configuration des journaux.

Recherchez ces mots-clés dans les journaux du client pour localiser rapidement les détails des échecs de consommation :

Message listener raised an exception while consuming messages
Failed to consume fifo message finally, run out of attempt times

Politique de nouvelle tentative de consommation SimpleConsumer

Machine d'état de nouvelle tentative

Lorsque SimpleConsumer traite les messages, ceux-ci transitent par les états suivants :PushConsumer状态机

  • Ready : état prêt.

    Le message est prêt sur le serveur ApsaraMQ for RocketMQ et peut être consommé par les consommateurs.

  • Inflight : état de traitement.

    Inflight : le message a été récupéré par le client consommateur et est en cours de traitement, mais n'a pas encore renvoyé de résultat de consommation.

  • Commit : état de validation.

    Commit : indique une consommation réussie. La machine d'état du message se termine lorsque le consommateur renvoie une réponse de succès.

  • DLQ : file d'attente des messages morts.

    DLQ : état de message mort — le dernier recours. Si les nouvelles tentatives dépassent le nombre maximal et que la conservation des messages morts est activée, le message ayant échoué est envoyé à un topic de messages morts. Vous pouvez consommer les messages de ce topic pour restaurer les opérations métier. Pour plus de détails, consultez Messages morts.

  • Discard : rejet.

    Discard : si les nouvelles tentatives dépassent le nombre maximal et que la conservation des messages morts est désactivée, le message est rejeté.

Contrairement à PushConsumer, SimpleConsumer utilise un intervalle de nouvelle tentative préalloué. Lors de la récupération d'un message, le consommateur définit un paramètre InvisibleDuration — le temps de traitement maximal autorisé. En cas d'échec, le prochain intervalle de nouvelle tentative réutilise cette valeur sans configuration supplémentaire.

simpleconsumer重试

Étant donné que InvisibleDuration est préallouée, elle peut différer considérablement du temps de traitement réel. Vous pouvez la modifier via l'API.

Par exemple, si vous définissez initialement le temps de traitement à 20 ms, mais que le traitement réel dépasse cette durée, augmentez InvisibleDuration pour éviter des nouvelles tentatives prématurées.

Pour modifier InvisibleDuration, les conditions suivantes doivent être remplies :

  • Le traitement du message n'a pas expiré.

  • L'état de consommation n'a pas été validé.

Comme illustré ci-dessous, la nouvelle InvisibleDuration prend effet immédiatement — redémarrant le minuteur d'invisibilité à partir du moment de l'appel API.

修改不可见时间

Intervalle de nouvelle tentative

Intervalle de nouvelle tentative = InvisibleDuration − Temps de traitement réel

SimpleConsumer contrôle les intervalles de nouvelle tentative via InvisibleDuration. Par exemple, si InvisibleDuration est de 30 ms et que le traitement échoue après 10 ms, la prochaine nouvelle tentative aura lieu après 20 ms. Si le traitement ne se termine pas dans les 30 ms et qu'aucun résultat n'est renvoyé, le message expire et fait l'objet d'une nouvelle tentative immédiatement (intervalle de 0 ms).

Nombre maximal de nouvelles tentatives

  • Valeur par défaut : 16.

  • Maximum : 1 000.

Pour SimpleConsumer, le nombre maximal de nouvelles tentatives est contrôlé par les métadonnées du groupe de consommateurs lors de la création. Pour le modifier, consultez Modifier le nombre maximal de nouvelles tentatives.

Par exemple, si le nombre maximal de nouvelles tentatives est de 3, le message est livré jusqu'à 4 fois : une fois initialement et trois fois via nouvelle tentative.

Exemple d'utilisation

Pour déclencher une nouvelle tentative dans SimpleConsumer, il suffit d'attendre.

 // Consumption example: Use SimpleConsumer to consume normal messages. To trigger retry, remain silent and let the message time out. The server will automatically retry.
        List<MessageView> messageViewList = null;
        try {
            messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
            messageViewList.forEach(messageView -> {
                System.out.println(messageView);
                // On failure, ignore the message. It will become visible again and be retried.
            });
        } catch (ClientException e) {
            // If pull fails due to throttling or other system issues, retry the receive request.
            e.printStackTrace();
        }

Modifier le nombre maximal de nouvelles tentatives

Utilisez les méthodes suivantes pour modifier le nombre maximal de nouvelles tentatives pour PushConsumer et SimpleConsumer.

Important

1. Si votre client utilise le protocole Remoting, le nombre maximal réel de nouvelles tentatives suit le paramétrage côté client, et cette configuration n'a aucun effet. Si votre client utilise gRPC, le paramètre défini ici s'applique.

2. Les stratégies de nouvelle tentative (backoff exponentiel ou intervalle fixe) s'appliquent uniquement aux clients gRPC et n'ont aucun effet sur les clients Remoting.

SDK gRPC

  • Modifier via OpenAPI : Mettre à jour le groupe de consommateurs

  • Modifier via console :

    Pour accéder au paramètre :

    1. Sur la page Instances, cliquez sur le nom de l'instance cible.

    2. Dans le volet de navigation de gauche, cliquez sur Groups. Sur la page Groups, cliquez sur Create Group.

    Dans la boîte de dialogue Create Group, définissez Group ID (1 à 60 caractères), Delivery Order (Concurrent Delivery ou Ordered Delivery) et Description. Développez Advanced Settings pour configurer la politique de nouvelle tentative en tant que Exponential Backoff, définissez Maximum Retry Count (par défaut : 16) et activez/désactivez Retain Dead-letter Messages (par défaut : désactivé ; si désactivé, les messages dépassant le nombre de nouvelles tentatives sont rejetés).

SDK Remoting

  • Modifier via le paramètre du SDK Remoting : définissez la propriété maxReconsumeTimes du consommateur.

Bonnes pratiques

Effectuez des nouvelles tentatives de manière raisonnable — évitez d'utiliser la nouvelle tentative pour la limitation de débit

Comme indiqué dans Scénarios, la nouvelle tentative de message convient aux échecs métier rares, et non aux échecs systémiques ou continus tels que la limitation de débit.

  • Exemple incorrect :

    Si le taux de consommation déclenche une limitation, renvoyez un échec et attendez la nouvelle tentative.

  • Exemple correct :

    Si le taux de consommation déclenche une limitation, retardez la récupération des messages et consommez-les plus tard.

Questions fréquemment posées sur la nouvelle tentative de message

Comment définir le délai d'expiration de la consommation des messages ?

Protocole gRPC

  • SimpleConsumer : la plage de délai d'expiration est de 10 secondes à 12 heures.

    Exemple de code :

    private long minInvisiableTimeMillsForRecv = Duration.ofSeconds(10).toMillis();
    private long maxInvisiableTimeMills = Duration.ofHours(12).toMillis();
  • PushConsumer : la valeur par défaut est de 230 minutes et ne peut pas être modifiée.

Protocole Remoting

consumer.setConsumeTimeout(15); // Unit: minutes. Range: 1–180 minutes