Java 卡夫卡的LongSerializer vs ByteArraserializer
我是卡夫卡的新手,试图了解使用一些东西的最佳方式。我有一个主题,它将有10个分区,我正在使用kafka producer向它发送数据。我的密钥将是Java 卡夫卡的LongSerializer vs ByteArraserializer,java,apache-kafka,Java,Apache Kafka,我是卡夫卡的新手,试图了解使用一些东西的最佳方式。我有一个主题,它将有10个分区,我正在使用kafka producer向它发送数据。我的密钥将是client\u id,它是长数据类型,值将是字节数组。因此,我应该为我的密钥序列化程序(key.serializer)使用longeserializer,还是应该将我的客户端id转换为代码本身中的字节数组,然后为密钥序列化程序使用ByArraySerializer 所以问题是直接使用lonserializer和使用ByteArraySerialize
client\u id
,它是长数据类型,值将是字节数组。因此,我应该为我的密钥序列化程序(key.serializer)
使用longeserializer
,还是应该将我的客户端id
转换为代码本身中的字节数组,然后为密钥序列化程序使用ByArraySerializer
所以问题是直接使用lonserializer
和使用ByteArraySerializer
有什么区别。在这两种情况下,它都将long转换为字节数组
我正在运行Kafka 0.10.0.0版本。LongSerializer的serialize方法只接受Long/Long类型参数,该参数在内部将长类型整数转换为字节数组。如果使用ByteArraySerializer,则在传递给ByteArraySerializer之前,必须进行此转换。不同的是,生产者上的send()采用长字节数组vs字节数组的生产者记录。在某种程度上,这是正确的,但通常情况下,您希望ProducerRecord类型与用户代码使用的类型相匹配,而无需进行额外转换
我的密钥将是client_id,它是长数据类型,值将是
字节数组
很明显,对于键,您应该使用LongSerializer,对于value,您应该使用TearArraySerializer
LongSerializer与ByteArraserializer的使用
如上所述,在上述答案中,任何对象都可以(也将)序列化为字节[]
,包括您的长对象。
因此,即使是longeserializer
内部也只会这样做
public class LongSerializer implements Serializer<Long> {
public void configure(Map<String, ?> configs, boolean isKey) {
// nothing to do
}
public byte[] serialize(String topic, Long data) {
if (data == null)
return null;
return new byte[] {
(byte) (data >>> 56),
(byte) (data >>> 48),
(byte) (data >>> 40),
(byte) (data >>> 32),
(byte) (data >>> 24),
(byte) (data >>> 16),
(byte) (data >>> 8),
data.byteValue()
};
}
public void close() {
// nothing to do
}
}
公共类lonserializer实现序列化程序{
公共无效配置(映射配置、布尔isKey){
//无事可做
}
公共字节[]序列化(字符串主题,长数据){
如果(数据==null)
返回null;
返回新字节[]{
(字节)(数据>>>56),
(字节)(数据>>>48),
(字节)(数据>>>40),
(字节)(数据>>>32),
(字节)(数据>>>24),
(字节)(数据>>>16),
(字节)(数据>>>8),
data.byteValue()
};
}
公众假期结束(){
//无事可做
}
}
所以,最好使用LongSerializer for your键(这样您就不必担心转换)。为什么要重新发明轮子?是的,我对这部分很了解,所以从技术上讲,它们都是一样的。在ByteArraySerializer
中,我们必须自己转换它,仅此而已?除此之外,没有其他区别,对吗?我看不出这两者之间有任何明显的区别。