Verbesserung
Top-Thema
Wichtig
Kleinigkeit
Wichtig
Die aktuelle Implementierung in TLKafkaProducer stellt nur einen Bruchteil der möglichen Producer-Konfiguration als typisierte Konfiguration zur Verfügung. Insbesondere fehlen z.B. Einstellungen für die Verschlüsselung etc. Da aber der TLKafkaProducer so gestaltet wurde, dass er nicht erweiterbar ist (die Methode, die den KafkaProducer tatsächlich instanziert, berücksichtigt hard coded nur ganz bestimmte Parameter aus der Konfiguration und kann nicht überschrieben werden), kann man dies nicht einfach nachreichen.
Anforderung
Die Implementierung soll so geändert werden, dass - analog zum KafkaConsumerService - die Konfiguration erweitert werden kann. Entweder man müsste private-API (getProperties() und newKafkaProducer()) öffnen oder die Konfiguration erweiterbar gestalten (analog zur ConsumerDispatcherConfiguration mit Annotationen).
Umsetzung
- Die fehlenden Kafka-Properties wurden nachgetragen.
- Mittels CommonClientConfig.getUntypedProperties() können beliebige Properties konfiguriert werden. Diese werden von Top-Logic als Map<String, String> behandelt und Überschreiben bei Konflikten die explizit definierten Properties. Dadurch können diese bei Änderungen des Property-Typs von Kafka benutzt werden um die dann veraltete Typisierung zu umgehen. Diese Properties werden nicht geparst und es findet keine Prüfung statt, ob es eine solche Property in Kafka gibt und der Wert gültig ist. Beispiel:
{{{#!xml <producer class="com.top_logic.kafka.services.producer.TLKafkaProducer"
name="KBChange-Producer"
topic="%DATA_CHANGE_TOPIC_PRODUCER%"
>
<untyped-properties>
<property name="bootstrap.servers" value="%KAFKA_PRODUCER_SERVER%"/>
<property name="my.special.property" value="3.14.15"/>
</untyped-properties>
</producer> }}}
- Mehrere relevante Methoden wurden protected gemacht und dokumentiert, damit Subklassen diese überschreiben können.
Code Migration
Die Namen folgender Kafka-Consumer-/Producer-Properties wurden vereinheitlicht. Maßgeblich ist jetzt immer der Name in Kafka selber, damit man nicht mehr nachschlagen muss, wie eine Kafka-Property in Top-Logic heißt.
- acknowledgeLevel => acks
- compressionType => compression.type
- maxRequestSize => max.request.size
- request-timeout -> request.timeout.ms
- key.deserializer => key.deserializer.typed.config
- key-deserializer-class => key.deserializer
- key-serializer-class => key.serializer
- keySerializer => key.serializer.typed.config
- value-deserializer-class => value.deserializer
- value.deserializer => value.deserializer.typed.config
- value-serializer-class => value.serializer
- valueSerializer => value.serializer.typed.config
Bei einigen Methoden von CommonClientConfig und dessen Ableitungen hat sich der Name geändert. Die sollten aber nicht in Projekten verwendet worden sein. Daher ist das nur theoretisch relevant.
ConsumerDispatcher.getProperties(...) wurde durch getAllProperties() ersetzt.
Test
Kein spezieller Test für die bessere Konfigurierbarkeit. Für Kafka generell gibt es die Tests in test.com.top_logic.kafka sowie test.com.top_logic.kafka.demo.