再说了,我发布和使用不同类型的Java objects.For每个我必须定义自己的序列实现。 我们如何能够提供在卡夫卡生产者/消费者特性都实现在“serializer.class”属性的文件?
Answer 1:
我们有一个类似的设置,在不同的主题不同的对象,但总是一个话题在同一个对象类型。 我们使用ByteArrayDeserializer
自带的Java API的0.9.0.1,这意味着或消息得到消费者永远只能一个byte[]
作为消息的价值部分(我们始终如一地使用String
的键)。 特定主题的消息消费者做的第一件事就是打电话给正确的解串器的转换byte[]
你可以使用Apache的百科全书辅助类 。 够简单。
如果你喜欢让KafkaConsumer
做反序列化的你,当然你可以写你自己的Deserializer
。 在deserialize
需要实现方法有话题作为第一个参数。 用它作为钥匙插入一张地图,提供了必要的解串器和您去。 我的预感是,在大多数情况下,你会只是做一个普通的Java序列化反正。
第二个方法的缺点是,你需要一个共同的超类所有的消息对象,以便能够参数化ConsumerRecord<K,V>
正常。 与第一种方法,但是,它是ConsumerRecord<String, byte[]>
反正。 但你转换byte[]
的对象,你只需要在正确的地方,只需要一个投在那里。
Answer 2:
一种选择是Avro公司 。 Avro公司允许您定义记录类型,你可以很容易序列化和反序列化。
下面是改编自文档的示例模式:
{"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "default": null, "type": ["null","int"]},
{"name": "favorite_color", "default": null, "type": ["null","string"]}
]
}
Avro的所谓区分SpecificData
和GenericData
。 随着SpecificData
读者和作家,你可以很容易地进行序列化和反序列化已知的Java对象。 缺点是SpecificData
需要的类模式转换的编译时知识。
在另一方面, GenericData
读者和作家让你处理,你不知道在编译时的记录类型。 虽然明明很厉害,这样可以得到一种笨拙的 - 你将不得不花时间周围的粗糙边缘编码。
还有其他的选择了- Thrift
想到的-但是从我个人理解,主要的区别之一是Avro公司与工作能力GenericData
。
另一个好处是多语言的兼容性。 Avro的,我知道有很多语言的原生支持,在很多的平台。 其他选项做太多,我相信 - 也许任何现成的选项将是比滚动自己在多语言支持方面更好,这只是一个度的问题。