Genau einmalige Zustellung

Auf dieser Seite wird erläutert, wie Sie Nachrichten mit der Funktion „Genau einmalige Zustellung“ von Pub/Sub empfangen und bestätigen. Mit dieser Funktion können Sie die doppelte Verarbeitung von Nachrichten nachverfolgen und verhindern. Wenn die Funktion aktiviert ist, bietet Pub/Sub die folgenden Semantiken:

  • Abonnenten können feststellen, ob Nachrichtenbestätigungen erfolgreich waren.

  • Nachdem die Nachricht erfolgreich bestätigt wurde, erfolgt keine erneute Zustellung.

  • Solange eine Nachricht aussteht, erfolgt keine erneute Zustellung. Eine Nachricht gilt als ausstehend, bis die Bestätigungsfrist abläuft oder die Nachricht bestätigt wird.

  • Bei mehreren gültigen Zustellungen aufgrund des Ablaufs der Bestätigungsfrist oder einer vom Client initiierten negativen Bestätigung kann nur die neueste Bestätigungs-ID verwendet werden, um die Nachricht zu bestätigen. Alle Anfragen mit einer vorherigen Bestätigungs-ID schlagen fehl.

Wenn „Genau einmalige Zustellung“ aktiviert ist, können Abonnenten dafür sorgen, dass Nachrichten einmal verarbeitet werden. Dazu müssen sie die folgenden Richtlinien beachten:

  • Nachrichten innerhalb der Bestätigungsfrist bestätigen.

  • Informationen zum Fortschritt der Verarbeitung einer Nachricht bis zur erfolgreichen Bestätigung aufbewahren.

  • Informationen zum Fortschritt der Verarbeitung einer Nachricht verwenden, um doppelte Arbeit zu vermeiden, wenn eine Bestätigung fehlschlägt.

Nur der Pull-Abo-Typ unterstützt die genau einmalige Zustellung, einschließlich Abonnenten, die die StreamingPull APIverwenden. Push- und Export-Abos unterstützen die genau einmalige Zustellung nicht.

Pub/Sub unterstützt die genau einmalige Zustellung innerhalb einer Cloud-Region, basierend auf einer von Pub/Sub definierten eindeutigen Nachrichten-ID.

Erneute Zustellung im Vergleich zu Duplikat

Es ist wichtig, den Unterschied zwischen erwarteten und unerwarteten erneuten Zustellungen zu verstehen.

  • Eine erneute Zustellung kann entweder aufgrund einer vom Client initiierten negativen Bestätigung einer Nachricht oder erfolgen, wenn der Client die Bestätigungsfrist der Nachricht nicht verlängert, bevor sie abläuft. Erneute Zustellungen gelten als gültig und das System funktioniert wie vorgesehen.

    Informationen zur Fehlerbehebung bei erneuten Zustellungen finden Sie unter Mit Duplikaten umgehen.

  • Ein Duplikat entsteht, wenn eine Nachricht nach einer erfolgreichen Bestätigung oder vor Ablauf der Bestätigungsfrist noch einmal gesendet wird.

  • Eine erneut zugestellte Nachricht behält zwischen den Zustellungsversuchen dieselbe Nachrichten-ID bei.

Abos, bei denen die genau einmalige Zustellung aktiviert ist, erhalten keine doppelten Zustellungen.

Unterstützung für die genau einmalige Zustellung in Clientbibliotheken

  • Unterstützte Clientbibliotheken haben eine Schnittstelle für die Bestätigung mit Antwort (Beispiel: Go). Mit dieser Schnittstelle können Sie prüfen, ob die Bestätigungsanfrage erfolgreich war. Wenn die Bestätigungsanfrage erfolgreich ist, erhalten die Clients garantiert keine erneute Zustellung. Wenn die Bestätigungsanfrage fehlschlägt, können die Clients mit einer erneuten Zustellung rechnen.

  • Clients können die unterstützten Clientbibliotheken auch ohne die Bestätigungsschnittstelle verwenden. In solchen Fällen können Bestätigungsfehler jedoch zu stillen erneuten Zustellungen von Nachrichten führen.

  • Unterstützte Clientbibliotheken haben Schnittstellen zum Festlegen der Mindest verlängerungszeit für die Lease (Beispiel: Go). Sie müssen den Wert für die Mindestverlängerung der Lease auf eine hohe Zahl festlegen, um netzwerkbedingte Bestätigungsabläufe zu vermeiden. Der Höchstwert beträgt 600 Sekunden.

  • Wenn Sie die Java-Clientbibliothek verwenden und Ihren Abonnenten mit einem benutzerdefinierten gRPC-Kanal initialisieren, indem Sie die setChannelProvider() Methode verwenden, sollten Sie auch maxInboundMetadataSize auf mindestens 1 MB festlegen, wenn Sie TransportChannelProvider erstellen. Für diese Konfiguration können Sie die Methode InstantiatingGrpcChannelProvider.Builder.setMaxInboundMetadataSize() oder die ManagedChannelBuilder.maxInboundMetadataSize() verwenden.

Die Standardwerte und der Bereich für die Variablen im Zusammenhang mit der genau einmaligen Zustellung sowie die Namen der Variablen können sich zwischen den Clientbibliotheken unterscheiden. In der Java-Clientbibliothek steuern beispielsweise die folgenden Variablen die genau einmalige Zustellung.

Variable Beschreibung Wert
setEnableExactlyOnceDelivery Aktiviert oder deaktiviert die genau einmalige Zustellung. „true“ oder „false“ Standardwert: „false“
minDurationPerAckExtension Die Mindestzeit in Sekunden, die für die Verlängerung der Bestätigungsfrist verwendet werden soll. Bereich: 0 bis 600 Standardwert: „none“
maxDurationPerAckExtension Die maximale Zeit in Sekunden, die für die Verlängerung der Bestätigungsfrist verwendet werden soll. Bereich: 0 bis 600 Standardwert: „none“

Bei der genau einmaligen Zustellung schlägt die modifyAckDeadline oder acknowledgment Anfrage an Pub/Sub fehl, wenn die Bestätigungs-ID bereits abgelaufen ist. In solchen Fällen betrachtet der Dienst die abgelaufene Bestätigungs-ID als ungültig, da möglicherweise bereits eine neuere Zustellung unterwegs ist. Das ist so für die genau einmalige Zustellung vorgesehen. Anfragen vom Typ acknowledgment und ModifyAckDeadline geben dann die Antwort INVALID_ARGUMENT zurück. Wenn die genau einmalige Zustellung deaktiviert ist, geben diese Anfragen bei abgelaufenen Bestätigungs-IDs OK zurück.

Damit acknowledgment- und ModifyAckDeadline-Anfragen gültige Bestätigungs-IDs haben, sollten Sie den Wert für minDurationPerAckExtension auf eine hohe Zahl festlegen.

Regionale Einschränkungen

Die Garantie für die genau einmalige Zustellung gilt nur, wenn Abonnenten in derselben Region eine Verbindung zum Dienst herstellen. Wenn Ihre Abonnentenanwendung auf mehrere Regionen verteilt ist, kann dies zu einer doppelten Nachrichtenzustellung führen, auch wenn die genau einmalige Zustellung aktiviert ist. Publisher können Nachrichten an jede Region senden und die Garantie für die genau einmalige Zustellung bleibt bestehen.

Wenn Sie Ihre Anwendung in Google Cloudausführen, wird standardmäßig eine Verbindung zum Pub/Sub-Endpunkt in derselben Region hergestellt. Wenn Sie Ihre Anwendung also in einer einzelnen Region in Google Cloud ausführen, interagieren Sie in der Regel mit einer einzelnen Region.

Wenn Sie Ihre Abonnentenanwendung außerhalb von Google Cloud oder in mehreren Regionen ausführen, können Sie sicherstellen, dass Sie eine Verbindung zu einer einzelnen Region herstellen , indem Sie beim Konfigurieren Ihres Pub/Sub Clients einen standortbezogenen Endpunkt verwenden. Alle Standortendpunkte für Pub/Sub verweisen auf einzelne Regionen. Weitere Informationen zu Standortendpunkten finden Sie unter Pub/Sub-Endpunkte. Eine Liste aller Standortendpunkte für Pub/Sub, finden Sie unter Liste der Standortendpunkte.

Abos mit genau einmaliger Zustellung erstellen

Sie können ein Abo mit genau einmaliger Zustellung über die Google Cloud Console, die Google Cloud CLI, die Clientbibliothek oder die Pub/Sub API erstellen.

Pull-Abo

Console

So erstellen Sie ein Pull-Abo mit genau einmaliger Zustellung:

  1. Rufen Sie in der Google Cloud Console die Abos Seite auf.

    Zu den Abos

  2. Klicken Sie auf Abo erstellen.

  3. Geben Sie die Abo-ID ein.

  4. Wählen Sie im Drop-down-Menü ein Thema aus oder erstellen Sie ein Thema.

    Das Abo erhält Nachrichten aus dem Thema.

  5. Wählen Sie im Bereich Genau einmalige Zustellung die Option Genau einmalige Zustellung aktivieren aus.

  6. Klicken Sie auf Erstellen.

gcloud

Verwenden Sie zum Erstellen eines Pull-Abos mit genau einmaliger Zustellung den gcloud pubsub subscriptions create Befehl mit dem --enable-exactly-once-delivery Flag:

gcloud pubsub subscriptions create SUBSCRIPTION_ID \
  --topic=TOPIC_ID \
  --enable-exactly-once-delivery

Ersetzen Sie Folgendes:

  • SUBSCRIPTION_ID: Die ID des zu erstellenden Abos
  • TOPIC_ID: Die ID des Themas, das an das Abo angehängt werden soll

REST

Verwenden Sie zum Erstellen eines Abos mit genau einmaliger Zustellung die projects.subscriptions.create Methode.

PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
Authorization: Bearer $(gcloud auth print-access-token)

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID des Projekts, in dem das Abo erstellt werden soll
  • SUBSCRIPTION_ID: Die ID des zu erstellenden Abos

Wenn Sie ein Pull-Abo mit genau einmaliger Zustellung erstellen möchten, geben Sie dies im Anfragetext an:

{
  "topic": "projects/PROJECT_ID/topics/TOPIC_ID",
  "enableExactlyOnceDelivery": true,
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: Die Projekt-ID des Projekts mit dem Thema
  • TOPIC_ID: Die ID des Themas, das an das Abo angehängt werden soll

C++

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für C++ in der Kurzanleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Pub/Sub C++ API-Referenzdokumentation.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::SubscriptionAdminClient client,
   std::string const& project_id, std::string const& topic_id,
   std::string const& subscription_id) {
  google::pubsub::v1::Subscription request;
  request.set_name(
      pubsub::Subscription(project_id, subscription_id).FullName());
  request.set_topic(pubsub::Topic(project_id, topic_id).FullName());
  request.set_enable_exactly_once_delivery(true);
  auto sub = client.CreateSubscription(request);
  if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The subscription already exists\n";
    return;
  }
  if (!sub) throw std::move(sub).status();

  std::cout << "The subscription was successfully created: "
            << sub->DebugString() << "\n";
}

C#

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für C# in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub C# API.


using Google.Cloud.PubSub.V1;
using Grpc.Core;

public class CreateSubscriptionWithExactlyOnceDeliverySample
{
    public Subscription CreateSubscriptionWithExactlyOnceDelivery(string projectId, string topicId, string subscriptionId)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);

        var subscriptionRequest = new Subscription
        {
            SubscriptionName = subscriptionName,
            TopicAsTopicName = topicName,
            EnableExactlyOnceDelivery = true
        };

        Subscription subscription = null;

        try
        {
            subscription = subscriber.CreateSubscription(subscriptionRequest);
        }
        catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
        {
            // Already exists.  That's fine.
        }
        return subscription;
    }
}

Go

Im folgenden Beispiel wird die Hauptversion der Go Pub/Sub-Clientbibliothek (Version 2) verwendet. Wenn Sie noch die Version 1 verwenden, lesen Sie den Migrationsleitfaden zu Version 2. Eine Liste der Codebeispiele für Version 1 finden Sie unter Veraltete Codebeispiele.

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Go in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Go API.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub/v2"
	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
)

func createSubscriptionWithExactlyOnceDelivery(w io.Writer, projectID, topic, subscription string) error {
	// projectID := "my-project-id"
	// topic := "projects/my-project-id/topics/my-topic"
	// subscription := "projects/my-project/subscriptions/my-sub"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	pbSub := &pubsubpb.Subscription{
		Name:                      subscription,
		Topic:                     topic,
		EnableExactlyOnceDelivery: true,
	}
	sub, err := client.SubscriptionAdminClient.CreateSubscription(ctx, pbSub)
	if err != nil {
		return fmt.Errorf("failed to create exactly once sub: %w", err)
	}
	fmt.Fprintf(w, "Created a subscription with exactly once delivery enabled: %v\n", sub)
	return nil
}

Java

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Java in der Kurzanleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Java API.

import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.Subscription;
import java.io.IOException;

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

    createSubscriptionWithExactlyOnceDeliveryExample(projectId, topicId, subscriptionId);
  }

  public static void createSubscriptionWithExactlyOnceDeliveryExample(
      String projectId, String topicId, String subscriptionId) throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {

      ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);

      Subscription subscription =
          subscriptionAdminClient.createSubscription(
              Subscription.newBuilder()
                  .setName(subscriptionName.toString())
                  .setTopic(topicName.toString())
                  // Enable exactly once delivery in the subscription.
                  .setEnableExactlyOnceDelivery(true)
                  .build());

      System.out.println(
          "Created a subscription with exactly once delivery enabled: "
              + subscription.getAllFields());
    }
  }
}

Python

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Python in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Python API.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing topic.
# project_id = "your-project-id"
# topic_id = "your-topic-id"
# subscription_id = "your-subscription-id"

publisher = pubsub_v1.PublisherClient()
subscriber = pubsub_v1.SubscriberClient()
topic_path = publisher.topic_path(project_id, topic_id)
subscription_path = subscriber.subscription_path(project_id, subscription_id)

with subscriber:
    subscription = subscriber.create_subscription(
        request={
            "name": subscription_path,
            "topic": topic_path,
            "enable_exactly_once_delivery": True,
        }
    )
    print(
        f"Created subscription with exactly once delivery enabled: {subscription}"
    )

Node.js

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Node.js in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createSubscriptionWithExactlyOnceDelivery(
  topicNameOrId,
  subscriptionNameOrId,
) {
  // Creates a new subscription
  await pubSubClient
    .topic(topicNameOrId)
    .createSubscription(subscriptionNameOrId, {
      enableExactlyOnceDelivery: true,
    });
  console.log(
    `Created subscription ${subscriptionNameOrId} with exactly-once delivery.`,
  );
  console.log(
    'To process messages, remember to check the return value of ackWithResponse().',
  );
}

Node.js

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Node.js in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

// Imports the Google Cloud client library
import {PubSub} from '@google-cloud/pubsub';

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createSubscriptionWithExactlyOnceDelivery(
  topicNameOrId: string,
  subscriptionNameOrId: string,
) {
  // Creates a new subscription
  await pubSubClient
    .topic(topicNameOrId)
    .createSubscription(subscriptionNameOrId, {
      enableExactlyOnceDelivery: true,
    });
  console.log(
    `Created subscription ${subscriptionNameOrId} with exactly-once delivery.`,
  );
  console.log(
    'To process messages, remember to check the return value of ackWithResponse().',
  );
}

Ruby

Im folgenden Beispiel wird die Ruby Pub/Sub-Clientbibliothek Version 3 verwendet. Wenn Sie noch die Version 2 verwenden, lesen Sie den Migrationsleitfaden zu Version 3. Eine Liste der Codebeispiele für Ruby Version 2 finden Sie unter Veraltete Codebeispiele.

Bevor Sie dieses Beispiel testen, folgen Sie der Einrichtungsanleitung für Ruby in der Schnellstart-Anleitung: Clientbibliotheken verwenden. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub Ruby API.

# project_id = "your-project-id"
# topic_id = "your-topic-id"
# subscription_id = "your-subscription-id"

pubsub = Google::Cloud::PubSub.new project_id: project_id
subscription_admin = pubsub.subscription_admin

subscription = subscription_admin.create_subscription \
  name: pubsub.subscription_path(subscription_id),
  topic: pubsub.topic_path(topic_id),
  enable_exactly_once_delivery: true

puts "Created subscription with exactly once delivery enabled: " \
     "#{subscription_id}"

PHP

Folgen Sie der Einrichtungsanleitung für PHP unter Schnellstart: Clientbibliotheken verwenden, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Creates a Pub/Sub subscription with `Exactly Once Delivery` enabled.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function create_subscription_with_exactly_once_delivery(
    string $projectId,
    string $topicName,
    string $subscriptionName
): void {
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $subscription = $topic->subscription($subscriptionName);
    $subscription->create([
        'enableExactlyOnceDelivery' => true
    ]);

    // Exactly Once Delivery status for the subscription
    $status = $subscription->info()['enableExactlyOnceDelivery'];

    printf('Subscription created with exactly once delivery status: %s' . PHP_EOL, $status ? 'true' : 'false');
}

Abos mit genau einmaliger Zustellung überwachen

Der subscription/exactly_once_warning_count Messwert erfasst die Anzahl der Ereignisse, die zu möglichen erneuten Zustellungen führen können (gültig oder Duplikat). Dieser Messwert zählt, wie oft Pub/Sub Anfragen im Zusammenhang mit Bestätigungs-IDs (ModifyAckDeadline- oder acknowledgment-Anfrage) nicht verarbeiten kann. Die Gründe für den Fehler können auf dem Server oder Client beruhen. Wenn beispielsweise die Persistenzebene, die zum Verwalten der Informationen zur genau einmaligen Zustellung verwendet wird, nicht verfügbar ist, handelt es sich um ein serverbasiertes Ereignis. Wenn der Client versucht, eine Nachricht mit einer ungültigen Bestätigungs-ID zu bestätigen, handelt es sich um ein clientbasiertes Ereignis.

Messwert verstehen

subscription/exactly_once_warning_count erfasst Ereignisse, die zu tatsächlichen erneuten Zustellungen führen können oder nicht, und kann je nach Clientverhalten verrauscht sein. Beispiel: Wiederholte acknowledgment- oder ModifyAckDeadline-Anfragen mit ungültigen Bestätigungs-IDs erhöhen den Messwert wiederholt.

Die folgenden Messwerte sind ebenfalls hilfreich, um das Clientverhalten zu verstehen:

  • subscription/expired_ack_deadlines_count Der Messwert zeigt die Anzahl der abgelaufenen Bestätigungs-IDs. Ablaufende Bestätigungs-IDs können zu Fehlern bei ModifyAckDeadline- und acknowledgment-Anfragen führen.

  • service.serviceruntime.googleapis.com/api/request_count Mit dem Messwert können Sie Fehler bei ModifyAckDeadline oder acknowledgment Anfragen erfassen, wenn die Anfragen erreichen Google Cloud aber nicht Pub/Sub. Es gibt Fehler, die mit diesem Messwert nicht erfasst werden, z. B. wenn Clients die Verbindung zu verlieren Google Cloud.

In den meisten Fällen von Fehlerereignissen, die wiederholt werden können, wiederholen unterstützte Clientbibliotheken die Anfrage automatisch.

Kontingente

Für Abos mit genau einmaliger Zustellung gelten zusätzliche Kontingentanforderungen. Diese Kontingente werden für Folgendes erzwungen:

  • Anzahl der Nachrichten, die aus Abos mit aktivierter genau einmaliger Zustellung pro Region genutzt werden.
  • Anzahl der Nachrichten, die bestätigt werden oder deren Frist verlängert wird, wenn Abos mit aktivierter genau einmaliger Zustellung pro Region verwendet werden.

Weitere Informationen zu diesen Kontingenten finden Sie in der Tabelle im Thema Kontingente.

Genau einmalige Zustellung und Abos mit Reihenfolge

Pub/Sub unterstützt die genau einmalige Zustellung mit geordneter Zustellung.

Wenn Sie die Reihenfolge mit der genau einmaligen Zustellung verwenden, erwartet Pub/Sub, dass die Bestätigungen in der richtigen Reihenfolge erfolgen. Wenn die Bestätigungen nicht in der richtigen Reihenfolge erfolgen, schlagen die Anfragen mit temporären Fehlern fehl. Wenn die Bestätigungsfrist abläuft, bevor eine Bestätigung in der richtigen Reihenfolge für die Zustellung erfolgt, erhält der Client eine erneute Zustellung der Nachricht. Wenn Sie die Reihenfolge mit der genau einmaligen Zustellung verwenden, ist der Clientdurchsatz daher auf einige Tausend Nachrichten pro Sekunde begrenzt.

Genau einmalige Zustellung und Push-Abos

Pub/Sub unterstützt die genau einmalige Zustellung nur bei Pull-Abos.

Clients, die Nachrichten aus den Push-Abos nutzen, bestätigen die Nachrichten, indem sie auf die Push-Anfragen mit einer erfolgreichen Antwort reagieren. Clients wissen jedoch nicht, ob das Pub/Sub-Abo die Antwort erhalten und verarbeitet hat. Das unterscheidet sich von Pull-Abos, bei denen Bestätigungsanfragen von den Clients initiiert werden und das Pub/Sub-Abo antwortet, wenn die Anfrage erfolgreich verarbeitet wurde. Aus diesem Grund passen die Semantiken der genau einmaligen Zustellung nicht gut zu Push-Abos.

Wichtige Punkte

  • Wenn die Bestätigungsfrist bei der Erstellung des Abos nicht angegeben wird, haben Abos mit aktivierter genau einmaliger Zustellung eine Standardbestätigungsfrist von 60 Sekunden.

  • Längere Standardbestätigungsfristen sind von Vorteil, um erneute Zustellungen aufgrund von Netzwerkereignissen zu vermeiden. Unterstützte Clientbibliotheken verwenden nicht die Standardbestätigungsfrist für Abos.

  • Abos mit genau einmaliger Zustellung haben eine deutlich höhere Latenz zwischen Veröffentlichung und Abo als reguläre Abos.

  • Wenn Sie einen hohen Durchsatz benötigen, müssen Ihre Clients mit genau einmaliger Zustellung auch Streaming-Pull verwenden.

  • Ein Abo kann aufgrund von Duplikaten auf der Veröffentlichungsseite mehrere Kopien derselben Nachricht erhalten, auch wenn die genau einmalige Zustellung aktiviert ist. Duplikate auf der Veröffentlichungsseite können auf mehrere eindeutige Veröffentlichungsversuche durch den Publisher-Client oder den Pub/Sub-Dienst zurückzuführen sein. Mehrere eindeutige Veröffentlichungen durch den Publisher-Client über mehrere Versuche hinweg führen zu erneuten Zustellungen mit unterschiedlichen Nachrichten-IDs. Mehrere eindeutige Veröffentlichungen durch den Pub/Sub-Dienst als Reaktion auf eine Veröffentlichungsanfrage des Clients führen zu erneuten Zustellungen mit den denselben Nachrichten-IDs.

  • Sie können Fehler in subscription/exactly_once_warning_count wiederholen und die unterstützten Clientbibliotheken wiederholen diese automatisch. Fehler im Zusammenhang mit ungültigen Bestätigungs-IDs können jedoch nicht wiederholt werden.