我可以使用Kafka流读取和写入不同类型的消息吗?

时间:2018-07-27 09:26:06

标签: apache-kafka apache-kafka-streams

我正在编写一个使用Kafka流的应用程序。它从主题A读取,进行一些转换,然后写入主题B。在转换期间,值按键分组,因此输出键的值类型与输入值类型不同。 Kafka流使用特定类型的Serdes(例如String serdes对字符串进行序列化和反序列化)进行序列化和反序列化,因此在转换数据后将无法使用。如何在Streams API中定义不同的序列化器和反序列化器?

1 个答案:

答案 0 :(得分:1)

可以,您可以

创建流,调用groupBy或将输出写入某个主题时,可以提供SerdeSerialized。示例:

Serde<String> stringSerde = Serdes.String();
Consumed<String, String> consumed = Consumed.with(stringSerde, stringSerde);
Produced<String, YourCustomItem> produced = Produced.with(stringSerde, new JsonSerde<>(YourCustomItem.class));

KStream<String, String> kStream = streamsBuilder.stream("sourceTopicName", consumed);
KStream<String, YourCustomItem> transformedKStream = kStream.mapValues((key, value) -> new YourCustomItem());
transformedKStream.to("destinationTopicName", produced);

transformedKStream.groupByKey(Serialized.with(Serdes.String(), new JsonSerde<>(YourCustomItem.class)));

其中JsonSerde来自spring-kafka依赖项。 或者您可以使用以下Serde

Serializer<JsonNode> jsonSerializer = new JsonSerializer();
Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
Serde<JsonNode> jsonSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);