Memperpanjang waktu konfirmasi dengan pengelolaan lease

Saat pesan dikirim ke pelanggan pull, pelanggan harus memproses dan mengonfirmasi (ack) pesan dalam batas waktu konfirmasi. Jika tidak, pelanggan harus memperpanjang batas waktu dengan panggilan untuk mengubah batas waktu konfirmasi.

Library klien tingkat tinggi Pub/Sub menyediakan pengelolaan lease sebagai fitur yang otomatis memperpanjang batas waktu pesan yang belum dikonfirmasi. Secara default, library klien dapat memperpanjang batas waktu hingga satu jam dengan mengeluarkan permintaan modifyAckDeadline berkala. Library klien tingkat tinggi untuk Python, Go, dan Java menggunakan persentil ke-99 penundaan konfirmasi untuk menentukan durasi setiap perpanjangan.

Pengelolaan lease memungkinkan Anda memiliki kontrol yang lebih terperinci atas batas waktu konfirmasi untuk pesan dibandingkan dengan mengonfigurasi properti tingkat langganan. Jika hanya menggunakan batas waktu konfirmasi tingkat langganan, Anda harus menyeimbangkan kompromi antara nilai rendah dan nilai tinggi. Nilai rendah meningkatkan kemungkinan duplikat dan nilai tinggi menunda pengiriman ulang pesan yang gagal. Menentukan nilai yang tepat bisa jadi sulit, terutama jika waktu pemrosesan yang diharapkan untuk pesan yang berbeda sangat bervariasi.

Untuk mengetahui informasi selengkapnya tentang properti langganan, termasuk batas waktu konfirmasi, lihat Properti langganan.

Konfigurasi pengelolaan lease

Anda dapat mengonfigurasi properti berikut di library klien tingkat tinggi untuk mengontrol pengelolaan lease.

  • Periode perpanjangan konfirmasi maksimum. Jumlah waktu maksimum untuk library klien dapat memperpanjang batas waktu konfirmasi pesan menggunakan permintaan modify acknowledgment deadline. Properti ini memungkinkan Anda menentukan berapa lama Anda ingin klien pelanggan memproses pesan.

  • Durasi maksimum untuk setiap perpanjangan konfirmasi. Jumlah waktu maksimum untuk memperpanjang batas waktu konfirmasi untuk setiap permintaan modify acknowledgment deadline. Properti ini memungkinkan Anda menentukan jumlah waktu yang diperlukan Pub/Sub untuk mengirim ulang pesan. Pengiriman ulang terjadi saat pelanggan pertama yang memproses pesan mengalami error atau menjadi tidak sehat dan tidak dapat lagi mengirim permintaan modify acknowledgment deadline.

  • Durasi minimum untuk setiap perpanjangan konfirmasi. Jumlah waktu minimum untuk memperpanjang batas waktu konfirmasi untuk setiap permintaan modify acknowledgment deadline. Properti ini memungkinkan Anda menentukan jumlah waktu minimum yang harus berlalu sebelum pengiriman ulang pesan terjadi.

Batas waktu konfirmasi tidak dijamin akan dipatuhi kecuali jika Anda mengaktifkan pengiriman yang tepat satu kali.

Mengelola batas waktu konfirmasi secara manual

Sebaiknya gunakan library klien tingkat tinggi. Jika tidak berfungsi, atau Anda perlu menggunakan pull unary, gunakan permintaan modify acknowledgment deadline untuk memperpanjang batas waktu konfirmasi.

Library klien tingkat tinggi C++ adalah pengecualian yang menyediakan pengelolaan lease saat menggunakan pull unary. Lihat contoh berikut untuk pull unary dengan pengelolaan lease:

C#

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API C# Pub/Sub.


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;
    }
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Java Pub/Sub.


import com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub;
import com.google.cloud.pubsub.v1.stub.SubscriberStub;
import com.google.cloud.pubsub.v1.stub.SubscriberStubSettings;
import com.google.pubsub.v1.AcknowledgeRequest;
import com.google.pubsub.v1.ModifyAckDeadlineRequest;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PullRequest;
import com.google.pubsub.v1.PullResponse;
import com.google.pubsub.v1.ReceivedMessage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SubscribeSyncWithLeaseExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String subscriptionId = "your-subscription-id";
    Integer numOfMessages = 10;

    subscribeSyncWithLeaseExample(projectId, subscriptionId, numOfMessages);
  }

  public static void subscribeSyncWithLeaseExample(
      String projectId, String subscriptionId, Integer numOfMessages)
      throws IOException, InterruptedException {
    SubscriberStubSettings subscriberStubSettings =
        SubscriberStubSettings.newBuilder()
            .setTransportChannelProvider(
                SubscriberStubSettings.defaultGrpcTransportProviderBuilder()
                    .setMaxInboundMessageSize(20 << 20) // 20 MB
                    .build())
            .build();

    try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) {

      String subscriptionName =