- Durch KIP-1150 (Kafka ohne Festplatte) und das Kafka-Fork-Projekt von AutoMQ wird intensiv über ein für die Cloud optimiertes Kafka diskutiert
- Würde man Kafka neu bauen, könnte man die bestehende Partitionsstruktur abschaffen und einen schlüsselzentrierten Ansatz vorschlagen
- Es besteht Bedarf an Funktionen für Nebenläufigkeitskontrolle und brokerseitige Schema-Unterstützung
- Zudem wird betont, dass moderne Systemeigenschaften wie Skalierbarkeit, Snapshots und Multi-Tenancy integriert werden sollten
- Ausgehend von Kafka entsteht die Vorstellung eines wirklich Cloud-native Event-Log-Systems, das über die Grenzen des bisherigen Kafka hinausgeht
Wenn man Kafka neu bauen würde
- Kürzlich wurden KIP-1150 (Kafka ohne Festplatte) und der Kafka-Fork von AutoMQ vorgestellt. Ziel ist es, Kafka mit Objektspeichern wie S3 zu integrieren, um in Cloud-Umgebungen die Elastizität zu verbessern und Kosten zu senken
- Der Text entwirft ein Cloud-native Event-Log-System, das über die Grenzen des bestehenden Kafka hinausgeht, und schlägt verschiedene Verbesserungen vor
Vorschlag für eine partitionlose Struktur
- Da Cloud-Objektspeicher wie praktisch unbegrenzter Speicher wirken, sinkt die Notwendigkeit von Topic-Partitionen
- Häufig ist entweder die globale Nachrichtenreihenfolge oder nur die Reihenfolge von Nachrichten mit demselben Schlüssel wichtig
- Das Partitionskonzept könnte vor Nutzer:innen verborgen werden, was die Nutzung vereinfacht
Schlüsselzentrierter Ansatz
- Statt Partitionen zu scannen, wird ein Design vorgeschlagen, das schnellen Zugriff auf alle Nachrichten eines bestimmten Schlüssels und deren Replay ermöglicht
- Es könnte Streams auf Ebene von Millionen von Entitäten unterstützen und so die Zahl der Consumer je nach Bedarf flexibel anpassen
- Da Fehler auf Schlüssel-Ebene isoliert werden, steigt die Verarbeitungseffizienz des Gesamtsystems
- Die Struktur ist ideal für Event Sourcing oder Actor-Model-Systeme
Unterstützung für Topic-Hierarchien
- Ähnlich wie in Systemen wie Solace sollte ein Teil der Message-Payload zu einer strukturierten, pfadartigen Topic-Kennung erhoben werden, um patternbasierte Subscriptions zu ermöglichen
- Der Broker könnte dadurch Subscription-Filter effizient unterstützen, ohne die komplette Nachricht parsen zu müssen
Funktionen zur Nebenläufigkeitskontrolle
- Das heutige Kafka bietet keine Möglichkeit, Konflikte bei gleichzeitigen Schreibvorgängen zu verhindern
- Wenn optimistisches Locking pro Schlüssel unterstützt würde, ließe sich prüfen, ob eine Nachricht nach Sicht auf den neuesten Zustand geschrieben wurde
- So ließe sich das Problem verlorener Updates verhindern
Brokerseitige Schema-Unterstützung
- Kafka behandelt Nachrichten derzeit nur als einfache Byte-Arrays und ist daher auf externe Schema-Registries angewiesen
- Um Schema-Konsistenz sicherzustellen, wird vorgeschlagen, Schema-Informationen wie AsyncAPI-Metadaten standardmäßig auf Broker-Ebene zu unterstützen
- Dadurch ließe sich auch leichter an Open-Table-Formate wie Apache Iceberg anbinden
Skalierbarkeit und Plugin-Struktur
- Vorgeschlagen wird eine Struktur mit Erweiterbarkeit und Plugin-Fähigkeit wie bei Postgres oder Kubernetes
- Brokerseitige Filter oder Transformationen sollten sich leicht umsetzen lassen, ohne protocol-aware Proxys (wie Kroxylicious) zu benötigen
- Funktionen wie Rate Limiting, Topic-Verschlüsselung oder Backend-Unterstützung auf Basis von Iceberg-Tabellen sollten als Plugins implementierbar sein
Synchrone Commit-Callbacks
- Das aktuelle Kafka garantiert nur eventuelle Konsistenz
- Vorgeschlagen wird eine Struktur, in der Producer nach dem Senden einer Nachricht sofort prüfen können, ob die daraus abgeleiteten Daten aktualisiert wurden
- Mit Unterstützung für Read-your-own-writes-Garantien könnte Kafka als echtes Datenbank-Log genutzt werden
Snapshot-Funktion
- Die aktuelle Kompaktierung (compaction) in Kafka behält nur die letzte Nachricht, was nur dann sinnvoll ist, wenn diese den vollständigen Zustand enthält
- Werden nur Änderungen protokolliert, müssen sonst alle Events pro Schlüssel erneut abgespielt werden, was mehr Zeit kostet
- Daher wird eine logische Kompaktierung benötigt, die Events pro Schlüssel in Snapshots zusammenfasst
Native Unterstützung für Multi-Tenancy
- Jedes moderne Datensystem sollte Multi-Tenancy von Grund auf mitdenken
- Neue Tenant-Umgebungen sollten günstig und sofort erzeugbar sein, während Ressourcen, Sicherheit und Zugriffskontrolle strikt getrennt bleiben müssen
Weitere Hinweise
- Einige Funktionen werden bereits von Systemen wie S2 (Streams mit hoher Kardinalität), Waltz (optimistisches Locking) und Apache Pulsar (Multi-Tenancy) unterstützt
- Ein Open-Source-System, das alle vorgeschlagenen Funktionen gleichzeitig unterstützt, gibt es jedoch nicht
- Der Text gibt die persönliche Ansicht eines bei Confluent beschäftigten Autors wieder und ist keine offizielle Position
- Theoretisch wird erwähnt, dass eine LSM-Tree-basierte Architektur eine naheliegende Wahl wäre
2 Kommentare
Wir nennen das bereits Redis.
Hacker-News-Kommentare
Stimme zu. Für bestimmte Anwendungsfälle lohnt es sich, das Head-of-Line-Problem zu lösen
NATS.io ist einfacher zu nutzen als Kafka und hat mehrere Punkte bereits gelöst, etwa die Abschaffung von Partitionen, die Unterstützung keybasierter Streams und eine flexible Themenhierarchie
Meine Reise mit Kafka war größtenteils ähnlich
Für bestimmte Anwendungsfälle wäre es nützlich, garantieren zu können, dass abgeleitete Datenansichten aktualisiert wurden, wenn ein Create-Request bestätigt wird
Ich habe diese Frage vor 6 Jahren gestellt
Kafka auf Object Storage? Das würde Latenz und Kosten um das Zehnfache erhöhen
Zu "Abschaffung von Partitionen" und "Streams auf Schlüssel-Ebene"
Man sollte Northguard im Auge behalten
Ich frage mich, wie viele der Probleme von Apache Kafka sich durch einen Wechsel zu Apache Pulsar lösen lassen
Ein nützliches Gedankenexperiment