Allongement du délai d'acquittement avec la gestion des baux

Lorsqu'un message est distribué à un abonné pull, celui-ci doit le traiter et en accuser réception dans le délai de confirmation. Sinon, l'abonné doit prolonger le délai en appelant la méthode permettant de modifier le délai de confirmation.

Les bibliothèques clientes de haut niveau Pub/Sub proposent une fonctionnalité de gestion des baux qui prolonge automatiquement le délai d'un message qui n'a pas encore été confirmé. Par défaut, les bibliothèques clientes peuvent prolonger le délai jusqu'à une heure en envoyant des requêtes modifyAckDeadline périodiques. Les bibliothèques clientes de haut niveau pour Python, Go et Java utilisent le 99e centile du délai de confirmation pour déterminer la durée de chaque prolongation.

La gestion des baux vous permet de contrôler plus précisément le délai de confirmation des messages que si vous configurez la propriété au niveau de l'abonnement. Si vous n'utilisez que le délai de confirmation au niveau de l'abonnement, vous devez trouver un compromis entre une valeur faible et une valeur élevée. Une valeur faible augmente le risque de doublons, tandis qu'une valeur élevée retarde la nouvelle distribution des messages ayant échoué. Il peut être difficile de déterminer la bonne valeur, en particulier lorsque le temps de traitement prévu pour différents messages varie considérablement.

Pour en savoir plus sur les propriétés d'un abonnement, y compris le délai de confirmation, consultez Propriétés de l'abonnement.

Configuration de la gestion des baux

Vous pouvez configurer les propriétés suivantes dans les bibliothèques clientes de haut niveau pour contrôler la gestion des baux.

  • Période maximale de prolongation de la confirmation Durée maximale pendant laquelle la bibliothèque cliente peut prolonger le délai de confirmation d'un message à l'aide de la requête modify acknowledgment deadline. Cette propriété vous permet de déterminer la durée pendant laquelle vous souhaitez que les clients abonnés traitent les messages.

  • Durée maximale de chaque prolongation de la confirmation Durée maximale de prolongation du délai de confirmation pour chacune des requêtes modify acknowledgment deadline. Cette propriété vous permet de définir le temps nécessaire à Pub/Sub pour distribuer à nouveau un message. La nouvelle distribution a lieu lorsque le premier abonné qui traite le message plante ou devient défectueux et n'est plus en mesure d'envoyer la requête modify acknowledgment deadline.

  • Durée minimale de chaque prolongation de la confirmation Durée minimale de prolongation du délai de confirmation pour chacune des requêtes modify acknowledgment deadline. Cette propriété vous permet de spécifier le délai minimal qui doit s'écouler avant qu'un message ne soit distribué à nouveau.

Les délais de confirmation ne sont pas garantis, sauf si vous activez la distribution de type "exactement une fois".

Gérer manuellement les délais de confirmation

Nous vous recommandons vivement d'utiliser les bibliothèques clientes de haut niveau. Si elles ne fonctionnent pas ou si vous devez utiliser l'extraction unaire, utilisez la requête modify acknowledgment deadline pour prolonger leurs délais de confirmation.

La bibliothèque cliente de haut niveau C++ est une exception qui fournit la gestion des baux lors de l'utilisation de l'extraction unaire. Consultez les exemples suivants pour l'extraction unaire avec gestion des baux :

C#

Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C# qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Pub/Sub C# .


using Google.Cloud.PubSub.V1;
using Grpc.Core;
using System;
using System.Collections.Generic;

public class PullMessageWithLeaseManagementSample
{
    public int PullMessageWithLeaseManagement(string projectId, string subscriptionId, bool acknowledge)
    {
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);
        SubscriberServiceApiClient subscriberClient = SubscriberServiceApiClient.Create();

        var ackIds = new List<string>();
        try
        {
            PullResponse response = subscriberClient.Pull(subscriptionName, maxMessages: 20);

            // Print out each received message.
            foreach (ReceivedMessage msg in response.ReceivedMessages)
            {
                ackIds.Add(msg.AckId);
                string text = msg.Message.Data.ToStringUtf8();
                Console.WriteLine($"Message {msg.Message.MessageId}: {text}");

                // Modify the ack deadline of each received message from the default 10 seconds to 30.
                // This prevents the server from redelivering the message after the default 10 seconds
                // have passed.
                subscriberClient.ModifyAckDeadline(subscriptionName, new List<string> { msg.AckId }, 30);
            }
            // If acknowledgement required, send to server.
            if (acknowledge && ackIds.Count > 0)
            {
                subscriberClient.Acknowledge(subscriptionName, ackIds);
            }
        }
        catch (RpcException ex) when (ex.Status.StatusCode == StatusCode.Unavailable)
        {
            // UNAVAILABLE due to too many concurrent pull requests pending for the given subscription.
        }
        return ackIds.Count;
    }