Bu konu, ApsaraMQ for Kafka için istemci parametrelerinin nasıl yapılandırılacağını açıklar. Doğru yapılandırılmış parametreler; mesaj aktarım hızını, teslim güvenilirliğini ve tüketici kararlılığını doğrudan etkiler. Aşağıdaki bölümler, üretim iş yükleri için önerilen değerler ve ayarlama kılavuzlarıyla birlikte üretici ve tüketici parametrelerini kapsar.
Üretici parametreleri
Mesaj teslimi
acks
Üreticinin bir gönderimi başarılı saymadan önce broker'dan kaç onay beklemesi gerektiğini kontrol eder.
| Değer | Davranış | Ödünleşim |
|---|---|---|
0 |
Broker'dan onay alınmaz. | En yüksek aktarım hızı, en yüksek veri kaybı riski. |
1 |
Lider düğüm veriyi yazdıktan sonra onay verir. | Dengeli aktarım hızı ve kalıcılık. Lider, takipçiler veriyi çoğaltmadan önce arızalanırsa veri kaybı yaşanabilir. |
all |
Lider ve eş zamanlı olarak senkronize olan tüm çoğaltmalar veriyi yazdıktan sonra onay verir. | En düşük aktarım hızı, en güçlü kalıcılık. Veri kaybı yalnızca lider ve eş zamanlı olarak senkronize olan tüm çoğaltmalar aynı anda arızalandığında gerçekleşir. |
Önerilen değer: Sıkı kalıcılıktan ziyade aktarım hızına öncelik veren çoğu iş yükü için 1.
retries
Üreticinin başarısız bir gönderimi yeniden deneme sayısı üst sınırı. Daha yüksek bir değer, üreticinin lider seçimi gibi geçici broker arızalarından kurtulmasına yardımcı olur. Yeniden deneme hızını kontrol etmek için retry.backoff.ms ile birlikte kullanın.
retry.backoff.ms
Gönderim yeniden denemeleri arasındaki bekleme süresi. Çok düşük bir değer, broker yük devretmeleri sırasında yeniden deneme fırtınalarına neden olabilir.
| Önerilen | Varsayılan | Birim |
|---|---|---|
| 1000 | -- | milisaniye |
Toplu işleme ve aktarım hızı
Toplu işleme, birden fazla kaydı tek bir istekte birleştirerek ağ ek yükünü azaltır. Bir toplu işin ne zaman gönderileceğini iki parametre kontrol eder: boyut ve süre.
batch.size
Bölüm başına tek bir toplu işin maksimum boyutu. Bir toplu iş bu boyuta ulaştığında, üretici bunu hemen gönderir.
| Tür | Varsayılan | Geçerli değerler | Birim |
|---|---|---|---|
| int | 16384 | [0,...] | bayt |
Çoğu iş yükü için 16384 varsayılan değerini koruyun. Daha küçük bir değer ağ isteği sayısını artırır ve aktarım hızını düşürür. batch.size değerini artırırsanız, daha büyük toplu işleri karşılayacak kadar buffer.memory alanının yeterli olduğundan emin olun.
linger.ms
Üreticinin bir toplu işi göndermeden önce doldurması için beklediği maksimum süre. Bu, TCP'deki Nagle algoritması gibi çalışır: bir toplu iş batch.size değerine ulaştığında, bekleme zamanlayıcısından bağımsız olarak hemen gönderilir. linger.ms süresi dolduğunda toplu iş hâlâ batch.size değerinin altındaysa, üretici birikmiş olanları gönderir.
| Önerilen | Varsayılan | Birim |
|---|---|---|
| 100 ila 1000 | 0 | milisaniye |
Daha yüksek bir linger.ms değeri, mesaj başına gecikme süresi pahasına toplu iş verimliliğini ve aktarım hızını artırır.
Bellek yönetimi
buffer.memory
Üreticinin, tüm bölümlerdeki gönderilmemiş kayıtları arabelleğe almak için ayırdığı toplam bellek miktarı. Bu havuz tükenirse, max.block.ms değerine bağlı olarak send() işlemi engellenir veya bir özel durum oluşturur. Yetersiz boyutlandırılmış bir arabellek yavaş bellek tahsisine, azalan aktarım hızına veya gönderim zaman aşımlarına neden olur.
Birim: bayt. Varsayılan: 33554432 (32 MB).
Boyutlandırma formülü:
buffer.memory >= batch.size x number_of_partitions x 2
Örneğin, batch.size=16384 ve 50 bölüm durumunda:
16384 x 50 x 2 = 1,638,400 bytes (~1.6 MB minimum)
Aktarım hızı için batch.size değerini artırırsanız, buffer.memory değerini de orantılı olarak ölçeklendirin.
Bölümleme
partitioner.class
Üreticinin kayıtları bölümlere nasıl atadığını belirler. Yapışkan bölümleme stratejisi, bir sonraki bölüme geçmeden önce bir bölümün toplu işini doldurarak tamamlanmamış toplu iş sayısını azaltır.
| Kafka istemci sürümü | Varsayılan strateji |
|---|---|
| 2.4 ve sonrası | Yapışkan bölümleme (varsayılan) |
| 2.4'ten önce | Döngüsel (Round-robin) |
Üretici istemciniz 2.4 sürümünden önceyse, toplu iş verimliliğini artırmak için yapışkan bölümleyiciyi açıkça ayarlayın.
Tüketici parametreleri
Getirme ayarlaması
Bu parametreler, tüketicinin getirme isteği başına ne kadar veri aldığını kontrol eder. Bunların ayarlanması hem aktarım hızını hem de gecikme süresini etkiler.
fetch.min.bytes
Broker'ın bir getirme yanıtı döndürmeden önce biriktirdiği minimum veri miktarı. Daha büyük bir değer getirme sıklığını ve broker CPU ek yükünü azaltarak aktarım hızını iyileştirir, ancak uçtan uca mesaj gecikme süresini artırır. Birim: bayt.
Bu değeri ayarlamadan önce üreticinizin mesaj hızını değerlendirin. Mesajlar yavaş geliyorsa, büyük bir fetch.min.bytes değeri gereksiz gecikmeye neden olur.
fetch.max.wait.ms
Broker'ın bir yanıt döndürmeden önce fetch.min.bytes değerini biriktirmek için beklediği maksimum süre. Birim: milisaniye.
Davranış depolama türüne göre değişir:
Yerel depolama: Broker, hangisi önce gerçekleşirse gerçekleşsin
fetch.min.bytesdeğerine ulaşılana veyafetch.max.wait.mssüresi dolana kadar bekler.Cloud depolama: Broker,
fetch.min.bytesdeğerinden bağımsız olarak yeni veriler geldiğinde hemen bir yanıt döndürür.
max.partition.fetch.bytes
Tek bir getirme işleminde broker'ın bölüm başına döndürdüğü maksimum veri miktarı. Birim: bayt.
Oturum yönetimi ve yeniden dengeleme
Hatalı yapılandırılmış oturum ve yoklama parametreleri, beklenmeyen tüketici yeniden dengelemelerinin en yaygın nedenidir. Yeniden dengeleme, bölümler yeniden atanana kadar gruptaki tüm tüketimi durdurduğundan gereksiz yeniden dengelemeleri tetiklemekten kaçının.
session.timeout.ms
Broker'ın tüketiciyi ölü kabul edip bir yeniden dengeleme tetiklemeden önce kalp atışları arasında geçen maksimum süre.
| Önerilen | Geçerli aralık | Varsayılan | Birim |
|---|---|---|---|
| 30000 ila 60000 | 6000 ila 300000 | 10000 | milisaniye |
Java istemci 0.10.1 ve sonraki sürümlerde, ayrılmış bir arka plan iş parçacığı kalp atışlarını
poll()
işleminden bağımsız olarak gönderir. Daha eski Java sürümlerinde veya Java dışı istemcilerde kalp atışları
poll()
çağrıları sırasında gönderildiğinden
session.timeout.ms
değeri hem veri işleme süresini hem de kalp atışı aralığını hesaba katmalıdır.
İpucu:
heartbeat.interval.ms
değerini
session.timeout.ms
değerinin üçte birinden fazla olmayacak şekilde ayarlayın. Örneğin,
session.timeout.ms
45000 ise
heartbeat.interval.ms
değerini 15000 veya daha düşük ayarlayın.
max.poll.records
Tek bir poll() çağrısında döndürülen maksimum kayıt sayısı. Tüketici, bir sonraki poll() son tarihinden önce bu kadar çok kaydı işleyemezse, broker onu ölü kabul eder ve bir yeniden dengeleme tetikler.
Boyutlandırma formülü:
max.poll.records < messages_per_thread_per_second x consumer_threads x session_timeout_seconds
Örneğin, iş parçacığı başına saniyede 500 mesaj, 4 iş parçacığı ve 45 saniyelik oturum zaman aşımı durumunda:
500 x 4 x 45 = 90,000
Tüketicinin oturum zaman aşımına uğramadan önce her zaman işlemeyi bitirmesini sağlamak için max.poll.records değerini bu değerin altında ayarlayın.
max.poll.interval.ms
Broker'ın tüketiciyi gruptan çıkarmadan önce ardışık poll() çağrıları arasında geçen maksimum aralık. Bu parametre yalnızca kalp atışlarının ayrı bir iş parçacığında çalıştığı Java istemci 0.10.1 ve sonraki sürümler için geçerlidir.
| Varsayılan | Birim |
|---|---|
| 300000 | milisaniye |
Boyutlandırma formülü:
max.poll.interval.ms > time_per_record x max.poll.records
Çoğu durumda 300000 (5 dakika) varsayılan değeri yeterlidir. Yalnızca işleme mantığınız son derece yavaşsa bu değeri artırın.
Ofset yönetimi
enable.auto.commit
Tüketicinin ofsetleri sabit bir aralıkla otomatik olarak commit etmesini kontrol eder.
| Değer | Davranış |
|---|---|
true (varsayılan) |
Ofsetler her auto.commit.interval.ms milisaniyede bir otomatik olarak commit edilir. Yönetimi daha basittir ancak çökme sonrasında yinelenen işlemeye neden olabilir. |
false |
Uygulamanız commitSync() veya commitAsync() yöntemlerini açıkça çağırmalıdır. Idempotent işleme ile birlikte kullanıldığında en az bir kez veya tam olarak bir kez teslim semantiği için bu seçeneği kullanın. |
auto.commit.interval.ms
enable.auto.commit değeri true olduğunda otomatik ofset commit işlemleri için kullanılan aralık.
| Varsayılan | Birim |
|---|---|
| 1000 | milisaniye |
Daha kısa bir aralık, çökme sonrasında yinelenen mesajlar için zaman penceresini azaltır ancak broker'a gönderilen commit isteği sayısını artırır.
auto.offset.reset
Tüketicinin commit edilmiş bir ofseti olmadığında veya commit edilmiş ofset geçersiz olduğunda (örneğin, ofset saklama ilkeleri nedeniyle silindiğinde) ne olacağını belirler.
| Değer | Davranış |
|---|---|
latest |
En son ofsetten tüketmeye başlar. Yalnızca yeni mesajlar. |
earliest |
Kullanılabilen en eski ofsetten tüketmeye başlar. Saklanan tüm mesajları yeniden işler. |
none |
Bir özel durum oluşturur. Uygulamanız ofsetleri manuel olarak yönetiyorsa bunu kullanın. |
Önerilen değer: latest. earliest kullanılması, geçersiz bir ofsetle karşılaşıldığında tüketicinin saklanan tüm mesajları yeniden işlemesine neden olur; bu da yinelenen işlemeye ve tüketici gecikmesinde ani artışa yol açabilir.
Uygulamanız ofset yönetimini manuel olarak gerçekleştiriyorsa (örneğin, ofsetleri harici bir veritabanında saklıyorsa) bu değeri none olarak ayarlayın.
Parametre hızlı başvurusu
Üretici parametreleri
| Parametre | Varsayılan | Önerilen | Birim |
|---|---|---|---|
acks |
-- | 1 (aktarım hızı) veya all (kalıcılık) |
-- |
retries |
-- | Kullanılabilirlik gereksinimlerine göre ayarlayın | -- |
retry.backoff.ms |
100 | 1000 | ms |
batch.size |
16384 | 16384 (varsayılan) | bayt |
linger.ms |
0 | 100 ila 1000 | ms |
buffer.memory |
33554432 | >= batch.size x bölümler x 2 |
bayt |
partitioner.class |
Yapışkan (2.4+) | Yapışkan bölümleme | -- |
Tüketici parametreleri
| Parametre | Varsayılan | Önerilen | Birim |
|---|---|---|---|
fetch.min.bytes |
1 | Üretici mesaj hızına göre ayarlayın | bayt |
fetch.max.wait.ms |
500 | -- | ms |
max.partition.fetch.bytes |
1048576 | -- | bayt |
session.timeout.ms |
10000 | 30000 ila 60000 | ms |
heartbeat.interval.ms |
3000 | session.timeout.ms değerinin <= 1/3'ü |
ms |
max.poll.records |
500 | Boyutlandırma formülüne bakın | -- |
max.poll.interval.ms |
300000 | 300000 (varsayılan) | ms |
enable.auto.commit |
true | Teslim semantiğine bağlıdır | -- |
auto.commit.interval.ms |
1000 | 1000 (varsayılan) | ms |
auto.offset.reset |
latest |
latest |
-- |