繁体   English   中英

在使用者中反序列化加密的kafka消息

[英]Deserialize encrypted kafka message in consumer

我有一个kafka主题,其中包含没有Avro架构的消息。 我们最近想使用avro模式将消息推送到该主题。

现在,该主题同时具有带/不带模式的消息。

我有一个从这个主题消费的消费者。

- >如果我设置value.deserializer消费配置为“ KafkaAvroDeserializer.class ”,我没有看到任何消息被消耗。

- >如果我设置value.deserializer消费配置为“ StringDeserializer.class ”,我能够消耗的消息,但是,其中有Avro的模式现在看起来加密的消息。

例如: ConsumerRecord(topic = sample-events, partition = 2, offset = 1089595, CreateTime = 1544116093932, checksum = 2421249481, serialized key size = -1, serialized value size = 159, key = null, value = test_impressLbhpb_extranet_opportunity_cleaning_fecron YH00756f54-ba55-11e7-8df0-fdb86cefa6ed$abcde)

我已经为avro模式生成了Java类,并且我想将带有/不具有来自消费方的模式的消息转换为此生成的avro java类。 我能够将没有架构的消息映射到具有objectMapper的avro Java类。

但是对于来自使用者的具有avro模式的消息,如示例中所提到的,它看起来像是加密的,我尝试下面的代码片段:

SpecificDatumReader<SampleEvents> reader = new SpecificDatumReader<SampleEvents>(SampleEvents.getClassSchema());
Decoder decoder = DecoderFactory.get().binaryDecoder(new ByteArrayInputStream(record), null);
SampleEvents event = reader.read(null, decoder);

但这不起作用。 我收到“错误:

java.lang.ArrayIndexOutOfBoundsException:-1“。

我如何反序列化此消息?

如果在使用者配置中将value.deserializer设置为“ KafkaAvroDeserializer.class”,则看不到任何消息被消耗。

嗯,您至少应该收到HTTP或反序列化器错误...


首先,您应该使用BytesDeserializer或其变体

然后,您需要熟悉ByteBuffer的方法,并将byte[]合并为一个...。

如果您具有Schema Registry编码的 Avro消息,则这些消息具有明确定义的有线格式

因此,您可能会遇到类似以下内容的问题,但最后,它需要对主题中可能包含的数据进行一些推断。

// consumerConfig.put("value.deserializer", ByteBufferDeserializer.class)

ByteBuffer buf = record.value();
Deserializer d;

if (buf == null) {
    System.err.println("Tombstoned record");
} else if (buf.get() == 0x0) { // Check for Avro
    int schemaId = buf.getInt();  // If you wanted it

    d = new KafkaAvroDeserializer();        
    Map<String, String> config = new HashMap<>();
    config.put("schema.registry.url", "http://..."); // address to registry
    boolean isKey = false;
    d.configure(config, isKey);

    AvroValue v = d.deserialize(value);
    // TODO: Handle record
} else {
    try {
        d = new StringDeserializer();
        String s = d.deserialize(value);
        // TODO: Handle record
    } catch (Exception e) {
        e.printStackTrace();
    }

}

要点: 不要将Avro和非Avro数据类型转化为一个主题 否则,您只需要消耗字节并自己处理自定义逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM