我是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()
答案 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