Erkundung der Vorteile der Verwendung eines API Gateways für Kafka

Yuan Bao

March 31, 2023

Technology

Kurze Einführung zu Kafka

Kafka wurde ursprünglich von LinkedIn als verteiltes Messaging-System entwickelt, das auf Zookeeper-Koordination basierte und mehrere Partitionen und Replikate umfasste. Später wurde es der Apache Software Foundation gespendet. Dank seiner außergewöhnlichen Durchsatzleistung, Persistenz und horizontalen Skalierbarkeit hat sich Kafka zu einer weit verbreiteten Plattform für verteilte Stream-Verarbeitung in der Branche entwickelt.

Kafka hat drei primäre Anwendungsfälle:

  • Messaging-System: Dies ist der häufigste Anwendungsfall, bei dem es für die Nachrichtenkommunikation zwischen Backend-Microservices verwendet wird. Kafka ermöglicht die Entkopplung von Systemen, Traffic-Shaping und asynchrone Kommunikation.
  • Speichersystem: Kafka speichert Nachrichten auf der Festplatte und verfügt über eine Multi-Replikat-Funktion, was es zu einer geeigneten Option für die Verwendung als Datenpersistenzsystem macht. Dies verringert das Risiko von Datenverlust erheblich.
  • Stream-Verarbeitungsplattform: Kafka bietet eine umfassende Bibliothek für die Stream-Verarbeitung, einschließlich Operationen wie Windowing, Joining und Transformationen.

Technische Architektur von Kafka

Ein Standard-Kafka-Cluster besteht aus mehreren Produzenten, Konsumenten, Brokern und einem Zookeeper-Cluster. Zookeeper ist die zentrale Steuerungskomponente des Kafka-Clusters und verwaltet Cluster-Metadaten und Controller-Wahlen. Produzenten senden Nachrichten an Broker, die die Nachrichten auf der Festplatte speichern, während Konsumenten Nachrichten von den Brokern abonnieren und konsumieren.

Kernkonzepte

Kafka Topic und Partition

In Kafka werden Nachrichten nach Topics kategorisiert. Produzenten geben normalerweise ein Topic an, wenn sie Nachrichten senden, während Konsumenten normalerweise ein Topic abonnieren, um Nachrichten zu konsumieren.

Ein Topic besteht normalerweise aus mehreren Partitionen, wobei jede Partition unterschiedliche Nachrichten enthält. Wenn eine Nachricht an Kafka gesendet wird, wird sie basierend auf den Partitionierungsregeln in der entsprechenden Partition gespeichert. Durch die Festlegung geeigneter Partitionierungsregeln können Nachrichten gleichmäßig auf verschiedene Partitionen verteilt werden.

Produzent und Konsument

Produzent bezieht sich auf die Partei, die Nachrichten sendet, und ist für die Erstellung von Nachrichten und deren Versand an Kafka-Broker verantwortlich.

Konsument bezieht sich auf die Partei, die Nachrichten empfängt, und ist für die Verbindung zum Kafka-Cluster-Broker, das Abonnieren eines bestimmten Topics und das Konsumieren von Nachrichten verantwortlich.

Kafka Broker

Ein Broker kann als unabhängiger Knoten oder Instanz von Kafka betrachtet werden. Ein Kafka-Cluster besteht aus einem oder mehreren Brokern.

kafka cluster

Warum Kafka ein API-Gateway benötigt

In den meisten Fällen, wenn Kafka als Nachrichtensystem zwischen Backend-Microservices verwendet wird, müssen Entwickler je nach der im Projekt verwendeten Sprache unterschiedliche Kafka-SDKs auswählen, um Produzenten- oder Konsumenten-Clients zu entwickeln.

Dieser Ansatz hat jedoch in bestimmten Szenarien Einschränkungen, z. B. wenn der Client direkt mit Kafka verbunden werden muss. In solchen Fällen kann die Hinzufügung eines API-Gateways zwischen dem Aufrufer und Kafka helfen, Dienste zu entkoppeln. Auf diese Weise muss sich der Aufrufer nicht um Kafka oder spezifische Kommunikationsprotokolle kümmern, was die Aufrufkosten reduziert. Darüber hinaus kann ein API-Gateway Sicherheitsunterstützung und Traffic-Control-Funktionen für die von Kafka bereitgestellten APIs bieten und so die Stabilität der Kafka-Dienste gewährleisten.

Direkte Verbindung zu Kafka

Die direkte Verbindung zu Kafka kann bei der Verwendung als Message-Queue-Middleware zu einer Reihe von Einschränkungen und Risiken führen:

  1. Unterschiedliche Konsumenten müssen sich an das Kommunikationsprotokoll von Kafka anpassen.
  2. Kafka bietet keine Lösungen für die Sicherung von exponierten APIs, Traffic-Control und anderen Problemen. Ohne Ratenbegrenzungspolitiken können einige Produzenten oder Konsumenten übermäßige Rechenleistung und Bandbreite verbrauchen.
  3. Sowohl Konsumenten als auch Produzenten müssen die Topologie des Kafka-Clusters kennen, die durch Änderungen am Kafka-Cluster beeinträchtigt werden kann.

API-Gateway verbessert die Nutzbarkeit von Kafka

Kommunikationsprotokollumwandlung

Wenn ein API-Gateway verwendet wird, um Kafka zu proxen, kommuniziert der Client mit dem API-Gateway über das HTTP-Protokoll, während das API-Gateway mit Kafka über das Kafka-Protokoll kommuniziert. Das API-Gateway wandelt die Nachrichten des Clients in das Kafka-Protokoll um, sodass der Client sich nicht an verschiedene Kafka-Nachrichtenprotokolle anpassen muss. Dies reduziert die Entwicklungskosten erheblich und macht die Nutzung bequemer.

Ratenbegrenzung

Wenn die Ressourcen begrenzt sind, ist auch die Dienstkapazität der Kafka-Knoten eingeschränkt. Das Überschreiten dieser Grenze könnte dazu führen, dass der Dienst abstürzt und eine Kettenreaktion auslöst. Ratenbegrenzung kann dies verhindern. In der traditionellen Kafka-Architektur kommunizieren Clients über SDKs mit Kafka. Wenn jedoch die Anzahl der Clients oder Anfragen hoch ist, kann dies die Maschinenlast der Kafka-Knoten beeinträchtigen und die Stabilität der Kafka-Funktionalität gefährden. Die Hinzufügung eines API-Gateways zur Architektur macht es einfach, verschiedene Dimensionen der Ratenbegrenzungsfunktionalität für den Kafka-Cluster bereitzustellen, da API-Gateways in diesem Bereich hervorragend sind. Diese Fähigkeiten umfassen:

  • Verwendung des festen Zeitfenster-Algorithmus, um die Gesamtzahl der Anfragen zu begrenzen, die ein einzelner Client innerhalb eines bestimmten Zeitraums an den Dienst stellen kann.
  • Begrenzung der Anzahl der gleichzeitigen Anfragen, die ein Client an einen einzelnen Dienst stellen kann.
  • Verwendung des Leaky-Bucket-Algorithmus, um die Anfragegeschwindigkeit eines einzelnen Clients an den Dienst zu begrenzen.

Durch die Implementierung dieser Ratenbegrenzungsfunktionen können Kafka-Knoten effektiv geschützt werden, um ihre Stabilität zu gewährleisten.

Authentifizierungsunterstützung

Authentifizierung ist ebenfalls eine starke Funktion eines API-Gateways. In der traditionellen Kafka-Architektur werden die meisten Kafka-Ports innerhalb eines internen Netzwerks zugänglich gemacht. Wenn der Zugriff von einem öffentlichen Netzwerk aus erforderlich ist, sind komplexe Konfigurationen erforderlich, um die Sicherheit zu gewährleisten. Die Verwendung der Authentifizierungsfunktionalität des API-Gateways beim Proxen von Kafka kann die exponierten Kafka-Ports schützen, während gleichzeitig der Zugriff von Clients selektiv erlaubt oder verweigert werden kann.

Überwachungsfähigkeit

Es gibt derzeit viele Überwachungsprodukte für Kafka, wie z. B. Kafka Eagle, Kafka Monitor, Kafka Manager usw. Jedes hat seine Vor- und Nachteile. Es ist schwierig, eine universelle Überwachungsfähigkeit zu erreichen, und die Anpassungskosten sind relativ hoch. Darüber hinaus ist die Integration in interne Überwachungssysteme schwierig. Der Aufbau eines Kafka-Überwachungssystems von Grund auf ist ebenfalls kostspielig, da die Überwachungsinformationen für Kafka viele Aspekte abdecken und die von Kafka selbst bereitgestellten Überwachungsmetriken eine komplexe Verarbeitung über Java Management Extension (JMX) erfordern.

Durch die Hinzufügung eines API-Gateways zur Architektur basiert die Kommunikation zwischen Client und API-Gateway auf dem HTTP-Protokoll. Dadurch ist das Ökosystem der Überwachungssoftware, die auf dem HTTP-Protokoll basiert, sehr reichhaltig. Dies ermöglicht die Bereitstellung umfassender Beobachtbarkeit für Kafka-Dienste zu sehr geringen Kosten.

Kafka Rolling Upgrades

Kafka-Dienste werden über Broker-Adressen bereitgestellt, die Produzenten und Konsumenten in ihren Konfigurationsinformationen angeben müssen, um eine Verbindung zu einem Kafka-Cluster herzustellen. Die Adressliste wird normalerweise im Format host1:port1, host2:port2 formatiert und kann eine oder mehrere durch Kommas getrennte Adressen enthalten.

Diese Konfigurationsmethode hat jedoch Einschränkungen: Sie erfordert, dass die Kafka-Broker-Adressen fest bleiben und die Dienste stabil bleiben. Kafka-Clients gehen davon aus, dass alle Broker-Adressen verfügbar sind und wählen zufällig eine aus. Dies kann während Rolling Upgrades Probleme verursachen, da Clients nicht wissen, welcher Broker verwendet werden soll, und Änderungen an den Broker-Adressen erfordern, dass alle Produzenten- und Konsumenten-Clients Änderungen vornehmen.

Mit einem API-Gateway für Kafka können die Broker-Adressen auf der Gateway-Ebene konfiguriert werden, und Clients müssen sich nicht mehr auf die spezifischen Details der Kafka-Broker konzentrieren. Selbst wenn sich die Broker-Adresse ändert, bleiben Clients unberührt. Dies macht es einfach, Rolling Upgrades für Kafka durchzuführen, ohne sich Sorgen machen zu müssen, dass Clients beeinträchtigt werden.

Zusammenfassung

Durch die Hinzufügung eines API-Gateways zu Kafka wird es einfacher, Ratenbegrenzung, Authentifizierung, Überwachung und Rolling-Upgrade-Fähigkeiten für Kafka-Dienste über die umfangreichen Funktionen des API-Gateways bereitzustellen.

Verwendung von Apache APISIX zur Erweiterung von Kafka

Apache APISIX ist ein hochleistungsfähiges, Echtzeit-API-Gateway unter der Apache Software Foundation. Es bietet eine Reihe von ausgeklügelten Traffic-Management-Funktionen, einschließlich Lastausgleich, dynamische Upstreams, Canary Release, Circuit Breaking, Authentifizierung und Beobachtbarkeit. Als API-Gateway hilft APISIX Unternehmen, API- und Microservice-Traffic schnell und sicher zu verarbeiten, und wird häufig in Kubernetes Ingress und Service Mesh verwendet. Durch die Hinzufügung einer APISIX-Schicht vor einem Kafka-Dienst können Unternehmen das umfangreiche Plugin-System der Plattform nutzen, um Nachrichtenproxying, Log-Lieferung, Ratenbegrenzung, Überwachung und andere Funktionen zu ermöglichen. Mit APISIX können sowohl Nord-Süd-Traffic von Clients zu Servern als auch Ost-West-Traffic zwischen Unternehmens-Microservices effektiv verarbeitet werden.

APISIX und Kafka

Proxying von Kafka-Nachrichten

APISIX bietet die Möglichkeit, Kafka-Nachrichten zu proxen. Clients können direkt mit APISIX kommunizieren, das die Nachrichtenprotokollumwandlung zwischen den Clients und Kafka übernimmt.

Um die Kafka-Proxy-Funktion in APISIX zu aktivieren, müssen wir lediglich eine Route wie folgt hinzufügen:

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/Kafka' \
    -H 'X-API-KEY: <api-key>' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/Kafka",
    "plugins": {
        "Kafka-proxy": {
            "sasl": {
                "username": "user",
                "password": "pwd"
            }
        },
        "limit-count": {
            "count": 2,
            "time_window": 60,
            "rejected_code": 503,
            "key_type": "var",
            "key": "remote_addr"
        }
    },
    "upstream": {
        "nodes": {
            "Kafka-server1:9092": 1,
            "Kafka-server2:9092": 1,
            "Kafka-server3:9092": 1
        },
        "type": "none",
        "scheme": "Kafka"
    }
}'

Diese Anfrage erstellt eine Route mit dem URI /Kafka in APISIX, die mit drei Kafka-Broker-Knoten als Upstream-Dienste verknüpft ist. Das kafka-proxy-Plugin wird verwendet, um SASL/PLAIN-Authentifizierung zu Kafka-Anfragen hinzuzufügen. Die Konfiguration in APISIX unterstützt Hot-Updates, sodass Kafka-Broker ohne Neustart des API-Gateways oder Unterbrechung des Clients geändert werden können.

Darüber hinaus ist das limit-count-Plugin für diese Route aktiviert, um Unterstützung für Ratenbegrenzung zu bieten. Die Konfiguration des Plugins gibt an, dass nur zwei Anfragen innerhalb eines Intervalls von 60 Sekunden durchgelassen werden, und alle zusätzlichen Anfragen werden von APISIX mit dem Statuscode 503 abgelehnt.

Log-Pushing

Das kafka-logger-Plugin von APISIX ermöglicht es, Logs als JSON-Objekte an einen Apache Kafka-Cluster zu senden.

Hier ist ein Konfigurationsbeispiel:

curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
       "kafka-logger": {
            "brokers" : [
              {
                "host" :"127.0.0.1",
                "port" : 9092
              },
              {
                "host" :"127.0.0.1",
                "port" : 9093
              }
            ],
           "kafka_topic" : "test2",
           "key" : "key1"
       }
    },
    "upstream": {
       "nodes": {
           "127.0.0.1:1980": 1
       },
       "type": "roundrobin"
    },
    "uri": "/hello"
}'

APISIX bietet mehr als nur die Möglichkeit, Kafka-Nachrichten zu proxen. Es bietet auch Tracing, Metriken und Logging über verschiedene Plugins, die alle Aspekte der Beobachtbarkeit abdecken. Mit einfachen Plugin-Konfigurationen auf APISIX ist die Integration mit anderen Beobachtbarkeitsdiensten wie Prometheus, Skywalking und anderen möglich, was die Überwachungsfähigkeiten von Kafka-Clustern verbessert.

Zusammenfassung

Dieser Artikel hebt die Vorteile der Implementierung eines API-Gateways für Kafka hervor und verwendet Apache APISIX als Fallstudie, um zu demonstrieren, wie es Kafka-Funktionen wie Ratenbegrenzung, Authentifizierung, Überwachung und Rolling-Upgrades bietet.

Tags: