Arbeit mit Kafka in Kotlin: Überblick über Bibliotheken und praktische Beispiele
\n\nApache Kafka ist eine verteilte Plattform für die ereignisgesteuerte Datenstromübertragung, die in modernen Microservice-Architekturen weit verbreitet ist. Im Kotlin-Ökosystem werden für die Arbeit mit Kafka zwei Hauptbibliotheken verwendet: Kafka Clients (der offizielle Java-Client von Apache) und Kafka Streams (eine Bibliothek für die Stream-Verarbeitung). Dank der vollständigen Kompatibilität von Kotlin mit Java können Sie diese Bibliotheken direkt nutzen sowie Kotlin-spezifische Wrapper für prägnanteren Code anwenden.
\n\n1. Kafka Clients – grundlegende Arbeit mit Producer und Consumer
\n\nApache Kafka Clients ist die offizielle Java-Bibliothek, die eine Low-Level-API zum Senden und Empfangen von Nachrichten bereitstellt. In Kotlin wird sie über Maven oder Gradle eingebunden:
\n\n// build.gradle.kts\ndependencies {\n implementation("org.apache.kafka:kafka-clients:3.6.0")\n}\n\nBetrachten wir ein Beispiel zur Erstellung eines Producers in Kotlin:
\n\nimport org.apache.kafka.clients.producer.KafkaProducer\nimport org.apache.kafka.clients.producer.ProducerRecord\nimport java.util.Properties\n\nfun main() {\n val props = Properties().apply {\n put("bootstrap.servers", "localhost:9092")\n put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")\n put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")\n }\n\n val producer = KafkaProducer<String, String>(props)\n val record = ProducerRecord("my-topic", "key1", "Hello from Kotlin!")\n\n producer.send(record) { metadata, exception ->\n if (exception != null) {\n println("Fehler beim Senden: ${exception.message}")\n } else {\n println("Gesendet an Partition ${metadata.partition()} mit Offset ${metadata.offset()}")\n }\n }\n\n producer.close()\n}\n\nAnalog dazu wird ein Consumer zum Lesen von Nachrichten erstellt:
\n\nimport org.apache.kafka.clients.consumer.ConsumerRecords\nimport org.apache.kafka.clients.consumer.KafkaConsumer\nimport java.time.Duration\nimport java.util.Properties\n\nfun main() {\n val props = Properties().apply {\n put("bootstrap.servers", "localhost:9092")\n put("group.id", "my-group")\n put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")\n put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")\n put("auto.offset.reset", "earliest")\n }\n\n val consumer = KafkaConsumer<String, String>(props)\n consumer.subscribe(listOf("my-topic"))\n\n while (true) {\n val records: ConsumerRecords<String, String> = consumer.poll(Duration.ofMillis(100))\n records.forEach { record ->\n println("Empfangen: Schlüssel = ${record.key()}, Wert = ${record.value()}, Offset = ${record.offset()}")\n }\n }\n}\n\n2. Kafka Streams – Stream-Verarbeitung von Daten
\n\nKafka Streams ist eine Bibliothek zur Erstellung von Stream-Verarbeitungsanwendungen auf Basis von Kafka. Sie ermöglicht Transformationen, Aggregationen und Verknüpfungen von Datenströmen direkt auf der Client-Seite. Einbindung:
\n\ndependencies {\n implementation("org.apache.kafka:kafka-streams:3.6.0")\n}\n\nBeispiel einer einfachen Anwendung, die Nachrichten aus einem Topic liest, in Großbuchstaben umwandelt und in ein anderes Topic schreibt:
\n\nimport org.apache.kafka.streams.KafkaStreams\nimport org.apache.kafka.streams.StreamsBuilder\nimport org.apache.kafka.streams.StreamsConfig\nimport org.apache.kafka.streams.kstream.KStream\nimport java.util.Properties\n\nfun main() {\n val props = Properties().apply {\n put(StreamsConfig.APPLICATION_ID_CONFIG, "uppercase-app")\n put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "local Auch in der Bibliothek
Caching in Kotlin: Redis und andere Lösungen
E-Mail-Versand mit Go (Golang): Bibliotheken und Codebeispiele
Rate Limiting in C# (.NET): Leitfaden zur Bibliothek System.Threading.RateLimiting
gRPC für JavaScript (Node.js): Bibliotheken und Codebeispiele