簡體   English   中英

Kafka中的LongSerializer vs ByteArraySerializer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM