Pub/Sub-Senken-Connector erstellen

Pub/Sub-Senken-Connectors streamen Nachrichten aus Kafka-Themen in Pub/Sub-Themen. So können Sie Ihre Kafka-basierten Anwendungen in Pub/Sub einbinden.

Anwendungsfälle für Pub/Sub-Senken-Connectors:

  • Ereignisgesteuerte Architekturen Pub/Sub-Verarbeitung von Nachrichten auslösen, die in Kafka veröffentlicht wurden.

  • Dienstintegration. Daten von Kafka an andere Google Cloud -Dienste oder -Anwendungen senden, die Daten aus Pub/Sub nutzen.

  • Benachrichtigungen oder Aktionen in Echtzeit basierend auf verarbeiteten Daten auslösen

Hinweis

Bevor Sie einen Pub/Sub-Senken-Connector erstellen, benötigen Sie Folgendes:

Erforderliche Rollen und Berechtigungen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Managed Kafka Connector Editor (roles/managedkafka.connectorEditor) für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Connectors benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Erstellen eines Connectors erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen, um die notwendigen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind zum Erstellen eines Connectors erforderlich:

  • Connector erstellen: managedkafka.connectors.create

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Berechtigungen zum Veröffentlichen im Pub/Sub-Thema gewähren

Der Managed Kafka-Dienst-Agent muss die Berechtigung haben, Nachrichten im Pub/Sub-Thema zu veröffentlichen. Weisen Sie dem Dienst-Agent die Rolle „Pub/Sub-Publisher“ (roles/pubsub.publisher) für das Projekt zu, das das Pub/Sub-Thema enthält.

Wenn sich Ihr Connect-Cluster in einem anderen Projekt als Ihr Managed Service for Apache Kafka-Cluster befindet, lesen Sie den Abschnitt Connect-Cluster in einem anderen Projekt erstellen.

Funktionsweise eines Pub/Sub-Senken-Connectors

Ein Pub/Sub-Senken-Connector ruft Nachrichten aus einem oder mehreren Kafka-Themen ab und veröffentlicht sie in einem Pub/Sub-Thema.

Hier finden Sie eine detaillierte Aufschlüsselung, wie der Pub/Sub-Senken-Connector Daten kopiert:

  • Der Connector nutzt Nachrichten aus einem oder mehreren Kafka-Themen im Quellcluster.

  • Der Connector schreibt Nachrichten in die Ziel-Pub/Sub-Themen-ID, die mit dem Konfigurationsattribut cps.topic angegeben wird. Dies ist ein Pflichtfeld.

  • Für den Connector muss außerdem das Google Cloud -Projekt mit dem Pub/Sub-Thema angegeben werden. Verwenden Sie dazu das Konfigurationsattribut cps.project. Dies ist ein erforderliches Attribut.

  • Der Connector kann optional auch einen benutzerdefinierten Pub/Sub-Endpunkt verwenden, der mit dem Attribut cps.endpoint angegeben wird. Der Standardendpunkt ist "pubsub.googleapis.com:443".

  • Zur Leistungsoptimierung puffert der Connector Nachrichten, bevor sie in Pub/Sub veröffentlicht werden. Sie können maxBufferSize, maxBufferBytes, maxDelayThresholdMs, maxOutstandingRequestBytes und maxOutstandingMessages konfigurieren, um die Zwischenspeicherung zu steuern.

  • Ein Kafka-Datensatz besteht aus drei Komponenten: Headern, Schlüsseln und Werten. Der Connector verwendet Schlüssel- und Wertkonverter, um die Kafka-Nachrichtendaten in das von Pub/Sub erwartete Format zu transformieren. Wenn Sie Struct- oder Map-Wertschemas verwenden, gibt das Attribut messageBodyName das Feld oder den Schlüssel an, das bzw. der als Pub/Sub-Nachrichtentext verwendet werden soll.

  • Der Connector kann das Kafka-Thema, die Partition, den Offset und den Zeitstempel als Nachrichtenattribute enthalten, wenn das Attribut metadata.publish auf true gesetzt ist.

  • Der Connector kann Kafka-Nachrichtenheader als Pub/Sub-Nachrichtenattribute enthalten, wenn das Attribut headers.publish auf true gesetzt ist.

  • Der Connector kann mithilfe des Attributs orderingKeySource einen Sortierschlüssel für Pub/Sub-Nachrichten enthalten. Mögliche Werte sind "none" (Standard), "key" und "partition".

  • Mit dem Attribut tasks.max wird der Grad der Parallelität für den Connector gesteuert. Durch Erhöhen von tasks.max kann der Durchsatz verbessert werden. Die tatsächliche Parallelität ist jedoch durch die Anzahl der Partitionen in den Kafka-Themen begrenzt.

Attribute eines Pub/Sub-Senken-Connectors

Beim Erstellen eines Pub/Sub-Senken-Connectors müssen Sie die folgenden Attribute angeben.

Connector-Name

Ein eindeutiger Name für den Connector innerhalb des Connect-Clusters. Richtlinien zum Benennen von Ressourcen finden Sie unter Richtlinien zum Benennen einer Managed Service for Apache Kafka-Ressource.

Connector-Plug‑in-Typ

Wählen Sie Pub/Sub-Senke als Connector-Plug-in-Typ aus. Dadurch wird die Richtung des Datenflusses von Kafka zu Pub/Sub und die verwendete Connector-Implementierung bestimmt. Wenn Sie die Benutzeroberfläche nicht zum Konfigurieren des Connectors verwenden, müssen Sie auch die Connector-Klasse angeben.

Kafka-Themen

Die Kafka-Themen, aus denen der Connector Nachrichten abruft. Sie können ein oder mehrere Themen angeben oder einen regulären Ausdruck verwenden, um mehrere Themen abzugleichen. Beispiel: topic.*, um alle Themen abzugleichen, die mit „topic“ beginnen. Diese Themen müssen im Managed Service for Apache Kafka-Cluster vorhanden sein, der mit Ihrem Connect-Cluster verknüpft ist.

Pub/Sub-Thema

Das vorhandene Pub/Sub-Thema, in dem der Connector Nachrichten veröffentlicht. Achten Sie darauf, dass das Connect-Clusterdienstkonto die Rolle roles/pubsub.publisher für das Projekt des Themas hat, wie unter Vorbereitung beschrieben.

Konfiguration

In diesem Abschnitt können Sie zusätzliche, Connector-spezifische Konfigurationseigenschaften angeben.

Da Daten in Kafka-Themen in verschiedenen Formaten wie Avro, JSON oder Rohbytes vorliegen können, ist die Angabe von Konvertern ein wichtiger Teil der Konfiguration. Konverter übersetzen Daten aus dem in Ihren Kafka-Themen verwendeten Format in das standardisierte, interne Format von Kafka Connect. Der Pub/Sub-Senken-Connector nimmt dann diese internen Daten und wandelt sie in das von Pub/Sub erforderliche Format um, bevor er sie schreibt.

Allgemeine Informationen zur Rolle von Konvertern in Kafka Connect, zu unterstützten Konvertertypen und zu gängigen Konfigurationsoptionen finden Sie unter Konverter.

Hier sind einige Konfigurationen, die für den Pub/Sub-Senken-Connector spezifisch sind:

  • cps.project: Gibt die Google Cloud Projekt-ID an, die das Pub/Sub-Thema enthält.

  • cps.topic: Gibt das Pub/Sub-Thema an, in dem Daten veröffentlicht werden.

  • cps.endpoint: Gibt den zu verwendenden Pub/Sub-Endpunkt an.

Eine Liste der verfügbaren Konfigurationsattribute für diesen Connector finden Sie unter Pub/Sub-Senken-Connector-Konfigurationen.

Pub/Sub-Senken-Connector erstellen

Lesen Sie vor dem Erstellen eines Connectors die Dokumentation zu den Eigenschaften eines Pub/Sub-Senken-Connectors.

Console

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

    Zu „Connect-Cluster“

  2. Klicken Sie auf den Connect-Cluster, für den Sie den Connector erstellen möchten.

    Die Seite Connect-Clusterdetails wird angezeigt.

  3. Klicken Sie auf Connector erstellen.

    Die Seite Kafka-Connector erstellen wird angezeigt.

  4. Geben Sie für den Connector-Namen einen String ein.

    Tipps zum Benennen von Connectors finden Sie in den Richtlinien zum Benennen einer Ressource von Managed Service for Apache Kafka.

  5. Wählen Sie für Connector-Plug-in die Option Pub/Sub-Senke aus.

  6. Wählen Sie unter Themen entweder Liste mit Kafka-Themen auswählen oder Thema-Regex verwenden aus. Wählen Sie dann die Kafka-Themen aus, aus denen dieser Connector Nachrichten abruft, oder geben Sie sie ein. Diese Themen befinden sich in Ihrem verknüpften Kafka-Cluster.

  7. Wählen Sie unter Cloud Pub/Sub-Thema auswählen das Pub/Sub-Thema aus, in dem dieser Connector Nachrichten veröffentlicht. Das Thema wird im vollständigen Ressourcennamenformat angezeigt: projects/{project}/topics/{topic}.

  8. Optional: Konfigurieren Sie weitere Einstellungen im Abschnitt Konfigurationen. Hier geben Sie Attribute wie tasks.max, key.converter und value.converter an, wie im vorherigen Abschnitt beschrieben.

  9. Wählen Sie die Richtlinie für Task-Neustart aus. Weitere Informationen finden Sie unter Richtlinie für den Neustart von Aufgaben.

  10. Klicken Sie auf Erstellen.

gcloud

Führen Sie den Befehl gcloud managed-kafka connectors create aus:

gcloud managed-kafka connectors create CONNECTOR_ID \
    --connect-cluster=CONNECT_CLUSTER_ID \
    --location=LOCATION \
    --config-file=CONFIG_FILE

Ersetzen Sie Folgendes:

  • CONNECTOR_ID: Die ID oder der Name des Connectors.
  • CONNECT_CLUSTER_ID: Die ID des Connect-Clusters, in dem der Connector erstellt wird.
  • LOCATION: Der Standort des Connect-Clusters.
  • CONFIG_FILE: Der Pfad zu einer lokalen YAML- oder JSON-Konfigurationsdatei.

Hier sehen Sie ein Beispiel für eine Konfigurationsdatei für den Pub/Sub-Senken-Connector:

connector.class: "com.google.pubsub.kafka.sink.CloudPubSubSinkConnector"
name: "CPS_SINK_CONNECTOR_ID"
tasks.max: "1"
topics: "GMK_TOPIC_ID"
value.converter: "org.apache.kafka.connect.storage.StringConverter"
key.converter: "org.apache.kafka.connect.storage.StringConverter"
cps.topic: "CPS_TOPIC_ID"
cps.project: "GCP_PROJECT_ID"

Ersetzen Sie Folgendes:

  • CPS_SINK_CONNECTOR_ID: Die ID oder der Name des Pub/Sub-Senken-Connectors. Tipps zum Benennen von Connectors finden Sie in den Richtlinien zum Benennen von Managed Service for Apache Kafka-Ressourcen. Der Name eines Connectors kann nicht geändert werden.

  • GMK_TOPIC_ID: Die ID des Managed Service for Apache Kafka-Themas, aus dem Daten vom Pub/Sub-Senken-Connector gelesen werden.

  • CPS_TOPIC_ID: Die ID des Pub/Sub-Themas, in dem Daten veröffentlicht werden.

  • GCP_PROJECT_ID: Die ID des Google Cloud-Projekts, in dem sich Ihr Pub/Sub-Thema befindet.

Terraform

Sie können eine Terraform-Ressource verwenden, um einen Connector zu erstellen.

resource "google_managed_kafka_connector" "example-pubsub-sink-connector" {
  project         = data.google_project.default.project_id
  connector_id    = "my-pubsub-sink-connector"
  connect_cluster = google_managed_kafka_connect_cluster.default.connect_cluster_id
  location        = "us-central1"

  configs = {
    "connector.class" = "com.google.pubsub.kafka.sink.CloudPubSubSinkConnector"
    "name"            = "my-pubsub-sink-connector"
    "tasks.max"       = "3"
    "topics"          = "TOPIC_NAME"
    "cps.topic"       = "CPS_TOPIC_NAME"
    "cps.project"     = "CPS_PROJECT_NAME"
    "value.converter" = "org.apache.kafka.connect.storage.StringConverter"
    "key.converter"   = "org.apache.kafka.connect.storage.StringConverter"
  }

  provider = google-beta
}

Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.

Go

Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Go unter Clientbibliotheken installieren. Weitere Informationen finden Sie in der API-Referenzdokumentation für Managed Service for Apache Kafka Go.

Richten Sie zur Authentifizierung bei Managed Service for Apache Kafka Standardanmeldedaten für Anwendungen(Application Default Credentials, ADC) ein. Weitere Informationen finden Sie unter Standardanmeldedaten für Anwendungen für eine lokale Entwicklungsumgebung einrichten.

import (
	"context"
	"fmt"
	"io"

	managedkafka "cloud.google.com/go/managedkafka/apiv1"
	"cloud.google.com/go/managedkafka/apiv1/managedkafkapb"
	"google.golang.org/api/option"
)

// createPubSubSinkConnector creates a Pub/Sub Sink connector.
func createPubSubSinkConnector(w io.Writer, projectID, region, connectClusterID, connectorID, topics, valueConverter, keyConverter, cpsTopic, cpsProject, tasksMax string, opts ...option.ClientOption) error {
	// TODO(developer): Update with your config values. Here is a sample configuration:
	// projectID := "my-project-id"
	// region := "us-central1"
	// connectClusterID := "my-connect-cluster"
	// connectorID := "CPS_SINK_CONNECTOR_ID"
	// topics := "GMK_TOPIC_ID"
	// valueConverter := "org.apache.kafka.connect.storage.StringConverter"
	// keyConverter := "org.apache.kafka.connect.storage.StringConverter"
	// cpsTopic := "CPS_TOPIC_ID"
	// cpsProject := "GCP_PROJECT_ID"
	// tasksMax := "3"
	ctx := context.Background()
	client, err := managedkafka.NewManagedKafkaConnectClient(ctx, opts...)
	if err != nil {
		return fmt.Errorf("managedkafka.NewManagedKafkaConnectClient got err: %w", err)
	}
	defer client.Close()

	parent := fmt.Sprintf("projects/%s/locations/%s/connectClusters/%s", projectID, region, connectClusterID)

	// Pub/Sub Sink sample connector configuration
	config := map[string]string{
		"connector.class": "com.google.pubsub.kafka.sink.CloudPubSubSinkConnector",
		"name":            connectorID,
		"tasks.max":       tasksMax,
		"topics":          topics,
		"value.converter": valueConverter,
		"key.converter":   keyConverter,
		"cps.topic":       cpsTopic,
		"cps.project":     cpsProject,
	}

	connector := &managedkafkapb.Connector{
		Name:    fmt.Sprintf("%s/connectors/%s", parent, connectorID),
		Configs: config,
	}

	req := &managedkafkapb.CreateConnectorRequest{
		Parent:      parent,
		ConnectorId: connectorID,
		Connector:   connector,
	}

	resp, err := client.CreateConnector(ctx, req)
	if err != nil {
		return fmt.Errorf("client.CreateConnector got err: %w", err)
	}
	fmt.Fprintf(w, "Created Pub/Sub sink connector: %s\n", resp.Name)
	return nil
}

Java

Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Anleitung zur Einrichtung von Java unter Clientbibliotheken installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Managed Service for Apache Kafka Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Managed Service for Apache Kafka zu authentifizieren. Weitere Informationen finden Sie unter Standardanmeldedaten für Anwendungen für eine lokale Entwicklungsumgebung einrichten.


import com.google.api.gax.rpc.ApiException;
import com.google.cloud.managedkafka.v1.ConnectClusterName;
import com.google.cloud.managedkafka.v1.Connector;
import com.google.cloud.managedkafka.v1.ConnectorName;
import com.google.cloud.managedkafka.v1.CreateConnectorRequest;
import com.google.cloud.managedkafka.v1.ManagedKafkaConnectClient;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreatePubSubSinkConnector {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the example.
    String projectId = "my-project-id";
    String region = "my-region"; // e.g. us-east1
    String connectClusterId = "my-connect-cluster";
    String connectorId = "my-pubsub-sink-connector";
    String pubsubProjectId = "my-pubsub-project-id";
    String pubsubTopicName = "my-pubsub-topic";
    String kafkaTopicName = "kafka-topic";
    String connectorClass = "com.google.pubsub.kafka.sink.CloudPubSubSinkConnector";
    String maxTasks = "3";
    String valueConverter = "org.apache.kafka.connect.storage.StringConverter";
    String keyConverter = "org.apache.kafka.connect.storage.StringConverter";
    createPubSubSinkConnector(
        projectId,
        region,
        connectClusterId,
        connectorId,
        pubsubProjectId,
        pubsubTopicName,
        kafkaTopicName,
        connectorClass,
        maxTasks,
        valueConverter,
        keyConverter);
  }

  public static void createPubSubSinkConnector(
      String projectId,
      String region,
      String connectClusterId,
      String connectorId,
      String pubsubProjectId,
      String pubsubTopicName,
      String kafkaTopicName,
      String connectorClass,
      String maxTasks,
      String valueConverter,
      String keyConverter)
      throws Exception {

    // Build the connector configuration
    Map<String, String> configMap = new HashMap<>();
    configMap.put("connector.class", connectorClass);
    configMap.put("name", connectorId);
    configMap.put("tasks.max", maxTasks);
    configMap.put("topics", kafkaTopicName);
    configMap.put("value.converter", valueConverter);
    configMap.put("key.converter", keyConverter);
    configMap.put("cps.topic", pubsubTopicName);
    configMap.put("cps.project", pubsubProjectId);

    Connector connector = Connector.newBuilder()
        .setName(
            ConnectorName.of(projectId, region, connectClusterId, connectorId).toString())
        .putAllConfigs(configMap)
        .build();

    try (ManagedKafkaConnectClient managedKafkaConnectClient = ManagedKafkaConnectClient.create()) {
      CreateConnectorRequest request = CreateConnectorRequest.newBuilder()
          .setParent(ConnectClusterName.of(projectId, region, connectClusterId).toString())
          .setConnectorId(connectorId)
          .setConnector(connector)
          .build();

      // This operation is being handled synchronously.
      Connector response = managedKafkaConnectClient.createConnector(request);
      System.out.printf("Created Pub/Sub Sink connector: %s\n", response.getName());
    } catch (IOException | ApiException e) {
      System.err.printf("managedKafkaConnectClient.createConnector got err: %s\n", e.getMessage());
    }
  }
}

Python

Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Einrichtungsanleitung für Python unter Clientbibliotheken installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Managed Service for Apache Kafka Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Managed Service for Apache Kafka zu authentifizieren. Weitere Informationen finden Sie unter Standardanmeldedaten für Anwendungen für eine lokale Entwicklungsumgebung einrichten.

from google.api_core.exceptions import GoogleAPICallError
from google.cloud.managedkafka_v1.services.managed_kafka_connect import (
    ManagedKafkaConnectClient,
)
from google.cloud.managedkafka_v1.types import Connector, CreateConnectorRequest

connect_client = ManagedKafkaConnectClient()
parent = connect_client.connect_cluster_path(project_id, region, connect_cluster_id)

configs = {
    "connector.class": "com.google.pubsub.kafka.sink.CloudPubSubSinkConnector",
    "name": connector_id,
    "tasks.max": tasks_max,
    "topics": topics,
    "value.converter": value_converter,
    "key.converter": key_converter,
    "cps.topic": cps_topic,
    "cps.project": cps_project,
}

connector = Connector()
connector.name = connector_id
connector.configs = configs

request = CreateConnectorRequest(
    parent=parent,
    connector_id=connector_id,
    connector=connector,
)

try:
    operation = connect_client.create_connector(request=request)
    print(f"Waiting for operation {operation.operation.name} to complete...")
    response = operation.result()
    print("Created Connector:", response)
except GoogleAPICallError as e:
    print(f"The operation failed with error: {e}")

Nachdem Sie einen Connector erstellt haben, können Sie ihn bearbeiten, löschen, pausieren, beenden oder neu starten.

Nächste Schritte

Apache Kafka® ist eine eingetragene Marke der Apache Software Foundation oder deren Tochtergesellschaften in den USA und/oder anderen Ländern.