Appearance
Kafka Topics β
Zusammenfassung β
Ein Kafka Topic ist ein benannter, geordneter Stream von Events/Nachrichten. Es ist die zentrale Abstraktion in Apache Kafka β vergleichbar mit einer Warteschlange, aber mit Persistierung und mehreren Consumern.
Kernkonzept β
Topics sind logische KanΓ€le, ΓΌber die Produzenten Nachrichten schreiben und Konsumenten diese lesen. Ein Topic besteht intern aus mehreren Partitionen, die auf verschiedene Broker verteilt sind.
Jede Nachricht erhΓ€lt einen Offset (Position in der Partition) und einen optionalen Key. Der Key bestimmt, in welche Partition eine Nachricht geht β Nachrichten mit gleichem Key landen immer in der gleichen Partition (Ordering-Garantie).
Replikation und Persistierung: Partitionen werden ΓΌber mehrere Broker repliziert. Messages bleiben im Topic (konfigurierbare Retention), nicht wie in klassischen Queues nach dem Lesen weg. Das ermΓΆglicht Replay und mehrere unabhΓ€ngige Consumer.
Code-Beispiel β
java
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
// Producer-Konfiguration
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
// Nachricht in Topic "user-events" schreiben
// Key="user123" sorgt dafΓΌr, dass alle Events dieses Users in gleicher Partition landen
ProducerRecord<String, String> record =
new ProducerRecord<>("user-events", "user123", "{\"action\":\"login\"}");
producer.send(record, (metadata, exception) -> {
if (exception == null) {
System.out.println("Partition: " + metadata.partition() +
", Offset: " + metadata.offset());
}
});
producer.close();Wichtige Punkte β
- Partition-SchlΓΌssel: Der
keybestimmt die Partition β gleiche Keys bleiben in Ordnung (nur innerhalb einer Partition, nicht Topic-weit!) - Immutability: Messages im Topic sind unverΓ€nderlich und persistent β kein klassisches LΓΆschen nach Verarbeitung
- Retention Policy: Topics kΓΆnnen nach Zeit (z.B. 7 Tage) oder GrΓΆΓe aufrΓ€umen, aber das ist konfigurierbar
- Consumer Groups: Mehrere Consumer kΓΆnnen eine Consumer Group bilden β jede Partition wird von max. einem Consumer pro Gruppe verarbeitet
- Skalierbarkeit durch Partitionen: Mehr Partitionen = hΓΆherer Durchsatz, aber auch KomplexitΓ€t bei Ordering
Klassische Fragen β
Kann ich eine Nachricht aus einem Topic lΓΆschen? β
Nein, das ist nicht vorgesehen. Eine Nachricht bleibt bis zur konfigurierten Retention-Zeit im Topic. Willst du einen Datensatz "lΓΆschen", schreib eine Tombstone-Message (null-Value mit gleich key).
Was ist der Unterschied zwischen Topic und Partition? β
Ein Topic ist die logische, benannte Entity. Eine Partition ist die physische Speichereinheit innerhalb eines Topics. Ein Topic mit 3 Partitionen bedeutet: Die Daten sind auf 3 physische Logs verteilt (mΓΆglicherweise auf verschiedenen Brokern).
Kann ich die Partition-Anzahl eines Topics nachtrΓ€glich Γ€ndern? β
Ja, du kannst Partitionen hinzufΓΌgen (Scale-Out), aber nicht entfernen. Achtung: Bestehende Keys kΓΆnnen nach Erweiterung in andere Partitionen wandern, was deine Consumer-Logik durcheinanderbringen kann.
Wusstest du schon? β
Kafka Topics sind nicht "verzehrend"! Das ist der Revolutionary-Part gegenΓΌber klassischen Message Queues wie RabbitMQ. In Kafka liest ein Consumer eine Message, aber sie bleibt fΓΌr andere Consumer da. Das fΓΌhrt zu Szenarien wie "Replay alle Events der letzten Woche" oder "neuer Microservice konsumiert komplette historische Daten" β ohne Producer-NΓΆrgeleien. LinkedIn hat das so gebaut, um ihre riesigen Log-Datenmengen zu bewΓ€ltigen. π