Kafka流头支持

时间:2019-02-16 10:53:01

标签: apache-kafka-streams

在我们的应用程序中,生产者正在发送不同的数据类型,并且分区可能具有不同的数据类型对象,因为我们不想根据数据类型进行分区。

在kafka Streams中,我试图使用标头。 生产者将头添加到BytesObject并将数据推送到kafka。

标题是,特定的dataType(customObject)。 现在基于标头,我想解析反序列化在kafka流中接收到的BytesObject,但是我受到使用processorInterface的束缚,在这里我必须传递实际的反序列化器

有什么方法我不必事先指定反序列化,然后基于processorContext中的标头为接收到的记录进行反序列化

public class StreamHeaderProcessor extends AbstractProcessor<String, Bytes>{


@Override
public void process(String key, Bytes value) {
    Iterator<Header> it = context().headers().iterator();
    while(it.hasNext()) {
        Header head = it.next();
        if(head.key().equals("dataType")) {
            String headerValue = new String(head.value());
            if(headerValue.equals("X")) {

            }else if(headerValue.equals("Y")) {

            }
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

如果您未在StreamsConfig中设置Serdes且未在builder.stream(..., Consumed.with(/*Serdes*/))上设置Serdes,则Kafka Streams默认将使用ByteArraySerde,因此键和值将被复制到byte[]中数组作为数据类型。 (与使用Processor API相似,并且不要在topology.addSource(...)上设置Serde。)

因此,您可以在数据流上应用ProcessorTransformer,检查标头并在自己的代码中调用相应的解串器。您需要提前知道所有可能的数据类型。

public class MyProcessor implements Processor {
    // add corresponding deserializers for all expected types (eg, String)
    private StringDeserializer stringDeserializer = new StringDeserializer();

    // other methods omitted

    void process(byte[] key, byte[] value) {
        // inspect header
        if (header.equals("StringType") {
            // get `context` via `init()` method
            String stringValue = stringDeserializer.deserialize(context.topic(), value);
            // similar for `key`

            // apply processing logic for String type
        }
    }

}