![](/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.