tl; dr
Hayır, Kafka'ya mesaj göndermenin bir parçası olarak bir anahtar gerekmez. Fakat...
Kabul edilen çok faydalı cevaba ek olarak birkaç ayrıntı daha eklemek istiyorum
Bölümleme
Varsayılan olarak Kafka, yazdığı konunun bölümünü seçmek için mesajın anahtarını kullanır. Bu yapılır DefaultPartitioner
saldırıdaki
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
Anahtar sağlanmadıysa, Kafka verileri rastgele sıralı bir şekilde bölümlere ayırır.
Kafka'da Partitioner
sınıfı genişleterek kendi Partitioner'ınızı oluşturmanız mümkündür . Bunun için partition
imzaya sahip yöntemi geçersiz kılmanız gerekir :
int partition(String topic,
Object key,
byte[] keyBytes,
Object value,
byte[] valueBytes,
Cluster cluster)
Genellikle, bir Kafka mesajının anahtarı bölümü seçmek için kullanılır ve dönüş değeri (türünün int
) bölüm numarasıdır. Anahtar olmadan, işlenmesi çok daha karmaşık olabilecek değere güvenmeniz gerekir.
Sipariş verme
Verilen cevapta da belirtildiği gibi Kafka, mesajların sadece bölüm seviyesinde sıralanması konusunda garantiye sahiptir.
Diyelim ki müşterileriniz için finansal işlemleri iki bölümlü bir Kafka konusunda depolamak istiyorsunuz. Mesajlar şöyle görünebilir (anahtar: değer)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Bir anahtar tanımlamadığımız için iki bölüm muhtemelen şöyle görünecektir:
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Bu konuyu okuyan tüketiciniz, size hesaptaki bakiyenin belirli bir zamanda 600 olduğunu söylemeye başlayabilir, ancak bu asla böyle olmamıştır! Sadece 1. bölümdeki mesajlardan önce bölüm 0'daki tüm mesajları okuyordu.
Hassas bir anahtarla (customerId gibi) bu, ayırma şu şekilde olacağından önlenebilir:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Günlük sıkıştırma
Mesajlarınızın bir parçası olarak bir anahtar olmadan, konu yapılandırmasını cleanup.policy
olarak ayarlayamazsınız compacted
. Belgelere göre "günlük sıkıştırma, Kafka'nın her zaman tek bir konu bölümü için veri günlüğündeki her ileti anahtarı için en azından bilinen son değeri tutmasını sağlar."
Bu hoş ve yararlı ayar, herhangi bir anahtar olmadan kullanılamayacak.
Anahtarların Kullanımı
Gerçek hayattaki kullanım durumlarında, bir Kafka mesajının anahtarı, performansınız ve iş mantığınızın netliği üzerinde büyük bir etkiye sahip olabilir.
Örneğin bir anahtar, verilerinizi bölümlemek için doğal olarak kullanılabilir. Tüketicilerinizi belirli bölümlerden okumak için kontrol edebildiğiniz için, bu verimli bir filtre görevi görebilir. Ayrıca, anahtar, mesajın gerçek değeriyle ilgili sonraki işlemeyi kontrol etmenize yardımcı olacak bazı meta verileri içerebilir. Anahtarlar genellikle değerlerden daha küçüktür ve bu nedenle tüm değer yerine bir anahtarı ayrıştırmak daha uygundur. Aynı zamanda tüm serileştirmeleri ve şema kaydını değeriniz ile yaptığınız gibi anahtar ile de uygulayabilirsiniz.
Not olarak, bilgi depolamak için kullanılabilecek Başlık kavramı da vardır, belgelere bakın .