![](/img/trans.png)
[英]Camel sending byte array to Kafka using ByteArraySerializer Not Working
[英]LongSerializer vs ByteArraySerializer in kafka
我是Kafka的新手,正在尝试了解使用少量事物的最佳方法。 我有一个主题,它将有10个分区,我正在使用kafka生产者向其发送数据。 我的密钥将是client_id
,它是Long数据类型,值将是字节数组。 因此,我应该将LongSerializer
用于密钥序列化程序(key.serializer)
还是应该将我的client_id
转换为代码本身的字节数组,然后将ByteArraySerializer
用于key.serializer
?
因此,问题是直接使用LongSerializer
与使用ByteArraySerializer
有什么区别? 在两种情况下,它都将long转换为字节数组吗?
我正在运行Kafka 0.10.0.0版本。
LongSerializer的serialize方法仅接受Long / long类型的参数,该参数在内部将long型整数转换为字节数组。 如果使用ByteArraySerializer,则必须先进行此转换,然后再传递给ByteArraySerializer。
不同之处在于生产者上的send()接受一个带有Long与字节数组的ProducerRecord。 您在某种程度上是对的,这是完全正确的,但是通常您希望ProducerRecord类型与用户代码使用的类型匹配,而无需进行其他转换。
我的密钥是client_id,它是Long数据类型,值是字节数组
很明显,对于键,您应该使用LongSerializer,对于值ByteArraySerializer
LongSerializer与使用ByteArraySerializer
如上所述,在以上答案中,任何对象都可以(并且将)序列化为一个byte[]
,包括您的Long对象。 因此,即使LongSerializer
内部也只能这样做。
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
}
}
因此,最好为您的密钥使用LongSerializer(这样就不必担心转换了)。 为什么要重新发明轮子?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.