Kafka字符串序列化效率

时间:2017-04-13 19:54:10

标签: java serialization encoding apache-kafka

我是Kafka的新手并且正在尝试存储内存开销最小的消息,因此我希望避免编码中的字段名称(即JSON)。考虑一条包含三个可变长度 String字段的消息,

Interface IMessage:
   String getA()
   String getB()
   String getC()

由于Kafka包含默认的String Serializer,最简单的编码方法是简单地连接和分隔字段。像,

String encoded = "FieldA|FieldB|FieldC"

在引擎盖下,Kafka会将其转换为字节数组。

我的问题是,kafka会使用Java的默认UTF-8编码,这样我的字符串中的每个ASCII字符只占用一个字节吗?换句话说,15个字符的字符串在Kafka的内存中会占用15个字节吗?或者由于某种原因在Java中调用toBytes()并将bytearray直接传递到ByteArraySerializer是否更有效?

byte[] encoded = "FieldA|FieldB|FieldC".toBytes()

1 个答案:

答案 0 :(得分:2)

此课程的文档说明

  

字符串编码默认为UTF8,可以通过设置属性key.serializer.encoding,value.serializer.encoding或serializer.encoding来自定义。前两个优先于最后一个。

因此,默认编码是您需要的UTF-8。

此外,您可以下载资源并查找:

Tahoma

所以,来源匹配文档,这很好。

如果您想确定可以将private String encoding = "UTF8"; @Override public void configure(Map<String, ?> configs, boolean isKey) { String propertyName = isKey ? "key.serializer.encoding" : "value.serializer.encoding"; Object encodingValue = configs.get(propertyName); if (encodingValue == null) encodingValue = configs.get("serializer.encoding"); if (encodingValue != null && encodingValue instanceof String) encoding = (String) encodingValue; } key.serializer.encoding定义为value.serializer.encoding