Tüm Ürünler
Search
Belge Merkezi

ApsaraMQ for RocketMQ:Message sending retry and throttling

Son Güncelleme:Oct 04, 2026

Bir üretici ApsaraMQ for RocketMQ broker'ına mesaj gönderdiğinde; ağ sorunları, broker yeniden başlatmaları veya kapasite sınırları nedeniyle istek başarısız olabilir. İstemci SDK'sı bu hataları iki yerleşik mekanizma ile yönetir:

  • Gönderme yeniden deneme, başarısız mesajları otomatik olarak yeniden gönderir; işlem başarılı olana veya yeniden deneme sınırına ulaşılana kadar devam eder.

  • Kısıtlama, yetersiz kapasite durumunda istekleri reddederek broker'ın aşırı yüklenmesini önler.

Bu iki mekanizma birlikte çalışır. Kısıtlama bir isteği reddettiğinde yeniden deneme mekanizması, broker üzerinde ek yük oluşturmadan mesajı üstel geri çekilme (exponential backoff) stratejisiyle yeniden gönderir.

Gönderme yeniden deneme

Yeniden deneme süreci

İstemci SDK'sı yerleşik yeniden deneme mantığı içerir. Bir gönderim isteği başarısız olduğunda SDK mesajı otomatik olarak yeniden gönderir; uygulama düzeyinde ek bir yeniden deneme kodu yazmanıza gerek yoktur.

Üreticiyi başlatırken maksimum yeniden deneme sayısını ayarlayın. Bir istek başarısız olursa SDK, mesaj iletilene veya yeniden deneme sınırına ulaşılana kadar denemeye devam eder. Son yeniden deneme de başarısız olursa SDK uygulamanıza bir hata döndürür.

Yeniden deneme davranışı kullanılan gönderim moduna göre değişir:

Gönderim modu İş parçacığı davranışı Son başarısızlık durumunda
Eşzamanlı (Synchronous) Çağıran iş parçacığı tüm yeniden deneme dizisi boyunca bloke olur SDK bir özel durum (exception) fırlatır
Asenkron (Asynchronous) Çağıran iş parçacığı bloke edilmez SDK bir başarısızlık geri arama (callback) olayı iletir

Yeniden deneme tetikleyicileri

Yeniden denemeler iki kategoriye giren hata türleri tarafından tetiklenir:

İstemci tarafı hataları

  • Bir ağ hatası bağlantı kopmasına veya istek zaman aşımına neden olur.

  • Broker'ın yeniden başlatılması veya dağıtımının kaldırılması bağlantı hatalarına yol açar.

  • Broker'ın yavaş çalışması istek zaman aşımlarına neden olur.

Broker tarafı hataları

  • Sistem mantık hatası: Broker üzerindeki dahili işleme hatası.

  • Sistem kısıtlama hatası: Broker, kapasitesini aştığı için isteği reddeder. Bkz. Kısıtlama.

Not

İşlemsel mesajlar yalnızca şeffaf yeniden denemeleri destekler. SDK, ağ istisnaları veya zaman aşımları durumunda işlemsel mesajları yeniden denemez.

Yeniden deneme aralığı

Yeniden deneme aralığı hata türüne bağlıdır:

Hata türü Yeniden deneme aralığı
Kısıtlama dışındaki tüm hatalar Anında (gecikme yok)
Sistem kısıtlama hatası Jitter içeren üstel geri çekilme

Kısıtlama hataları için SDK aşağıdaki parametrelerle üstel geri çekilme kullanır:

Parametre Açıklama Varsayılan
INITIAL_BACKOFF İlk yeniden denemeden önceki gecikme 1 saniye
MULTIPLIER Her yeniden denemeden sonra gecikmenin arttığı çarpan 1,6
JITTER Her gecikmeye uygulanan rastgeleleştirme faktörü 0,2
MAX_BACKOFF Yeniden denemeler arasındaki maksimum gecikme 120 saniye
MIN_CONNECT_TIMEOUT Minimum bağlantı zaman aşımı 20 saniye

Geri çekilme algoritması şu şekilde çalışır:

ConnectWithBackoff()
  current_backoff = INITIAL_BACKOFF
  current_deadline = now() + INITIAL_BACKOFF
  while (TryConnect(Max(current_deadline, now() + MIN_CONNECT_TIMEOUT)) != SUCCESS)
    SleepUntil(current_deadline)
    current_backoff = Min(current_backoff * MULTIPLIER, MAX_BACKOFF)
    current_deadline = now() + current_backoff +
      UniformRandom(-JITTER * current_backoff, JITTER * current_backoff)

Tam teknik özellikler için bkz. gRPC bağlantı geri çekilmesi.

Toplam yeniden deneme süresi bütçesini anlama

SDK yalnızca bir yeniden deneme kontrolü sunar: maksimum yeniden deneme sayısı. Eşzamanlı modda çağıran iş parçacığı tüm yeniden deneme dizisi boyunca bloke kalır. Bu nedenle toplam blokaj süresi, istek başına zaman aşımınız ile maksimum yeniden deneme sayısı arasındaki ilişkiye bağlıdır:

Total blocking time (worst case) = max_retries x per_request_timeout + sum_of_backoff_delays

Kısıtlama dışı hatalar (anında yeniden deneme) için geri çekilme gecikmesi sıfırdır:

Total blocking time = max_retries x per_request_timeout

Kısıtlama hatalarında ise geri çekilme gecikmeleri üstel olarak birikir. Örneğin, varsayılan parametreler ve 5 yeniden deneme ile:

Yeniden Deneme Geri çekilme gecikmesi (yaklaşık) Kümülatif gecikme
1 1 sn 1 sn
2 1,6 sn 2,6 sn
3 2,56 sn 5,16 sn
4 4,1 sn 9,26 sn
5 6,55 sn 15,81 sn

Eşzamanlı modda çağıran iş parçacığının çok uzun süre bloke kalmasını önlemek için istek başına zaman aşımınızı ve maksimum yeniden deneme sayınızı birlikte değerlendirin.

Yeniden denemeler tükendikten sonra başarısız mesajları yönetme

Yerleşik yeniden denemeler teslimatı garanti etmez. Tüm yeniden denemeler başarısız olursa SDK bir hata döndürür. Bu hatayı uygulamanızda yakalayın ve bir geri dönüş stratejisi uygulayın:

  • Başarısız mesajı daha sonra yeniden işlemek üzere yerel bir günlüğe veya ölü harf (dead-letter) deposuna yazın.

  • Kök nedeni araştırabilmeniz için izleme sisteminizi uyarın.

Yeniden denemelerden kaynaklanan yinelenen mesajları yönetme

Bir gönderim isteği zaman aşımına uğradığında SDK broker'ın mesajı zaten alıp almadığını belirleyemez. Bir yeniden deneme, broker üzerinde yinelenen bir mesaj üretebilir. Bu, en az bir kez teslimat (at-least-once delivery) sistemlerinde temel bir ödünleşimdir.

Yinelenen mesajları yönetmek için tüketicilerinizi idempotent işleme için tasarlayın:

  • Her mesaja benzersiz bir iş anahtarı atayın (örneğin, sipariş kimliği veya işlem kimliği).

  • İşlemeden önce anahtarın daha önce işlenip işlenmediğini kontrol edin.

  • Benzersizliği zorlamak için veritabanı kısıtlamalarını veya yinelenen öğe silme önbelleklerini kullanın.

Kısıtlama

Kısıtlama, cloud mesajlaşma sistemlerinde normal bir operasyonel mekanizmadır. Sistem kapasitesi yetersiz olduğunda veya kullanım önceden tanımlanmış bir eşiği aştığında ApsaraMQ for RocketMQ broker'ı isteği anında reddeder ve bir sistem kısıtlama hatası döndürür. SDK'nın yerleşik yeniden deneme mantığı ardından reddedilen isteği üstel geri çekilme kullanarak yönetir.

Kısıtlama tetikleyicileri

Kısıtlama aşağıdaki senaryolarda tetiklenir:

  • Depolama baskısı artışı: Bir tüketici grubu bir kuyruğun maksimum ofsetinden tüketmeye başlar. Bir tüketici grubunun belirli bir zamanda tüketmeye başlamasının gerektiği iş yayını gibi senaryolarda kuyruk üzerindeki depolama baskısı ani bir artış gösterir. Daha fazla bilgi için bkz. Tüketici ilerleme yönetimi.

  • Mesaj birikimi: Tüketiciler gelen mesajların hızına yetişemediğinde tüketilmeyen mesajlar kuyrukta birikir. Birikim eşikleri aşarsa broker alt sistem üzerindeki baskıyı azaltmak için kısıtlamayı tetikler.

İstemci türüne göre hata kodları ve yeniden deneme davranışı

Kısıtlama tetiklendiğinde hata kodu ve yeniden deneme davranışı kullandığınız istemci protokolüne bağlıdır.

gRPC istemcileri

Öğe Değer
Hata kodu 530
Hata mesajı anahtar kelimesi TOO_MANY_REQUESTS
Yeniden deneme davranışı Üstel geri çekilme ile otomatik yeniden deneme

Remoting istemcileri

Öğe Değer
Hata kodu 215
Hata mesajı anahtar kelimesi messages flow control

Remoting istemcileri için yeniden deneme davranışı SDK sürümüne göre değişir:

SDK Kısıtlama durumunda yeniden deneme davranışı
Java için ApsaraMQ for RocketMQ TCP istemci SDK < 1.9.0.Final Yeniden deneme yok
Java için ApsaraMQ for RocketMQ TCP istemci SDK >= 1.9.0.Final Üstel geri çekilme ile otomatik yeniden deneme
Açık kaynak Apache RocketMQ SDK (üretici) Yeniden deneme yok
Açık kaynak Apache RocketMQ SDK (tüketici) Üstel geri çekilme ile otomatik yeniden deneme

SDK sürümünüz kısıtlama hatalarında otomatik yeniden deneme yapmıyorsa uygulama kodunuzda üstel geri çekilme ile yeniden deneme mantığını uygulayın.

Not

Desteklenen istemci sürümleri için bkz. SDK uyumluluğu.

Kısıtlamayı önleme ve yönetme

Trafik artışlarından önce kapasiteyi izleyin

Sistem kullanımını ve kapasiteyi izlemek için ApsaraMQ for RocketMQ gözlemlenebilirlik özelliklerini kullanın. İş yayınından veya beklenen trafik artışlarından önce:

  • Örneğinizin beklenen trafik için yeterli kaynağa sahip olduğunu doğrulayın.

  • Birikim risklerini belirlemek için tüketici grubu gecikmesini kontrol edin.

  • Gerekirse örneğinizi ölçeklendirin veya tüketici aktarım hızını optimize edin.

Çalışma zamanında beklenmeyen kısıtlamayı yönetin

Kısıtlama beklenmedik şekilde gerçekleşirse ve SDK'nın yerleşik yeniden denemeleri durumu kurtaramazsa:

  • Kısıtlama koşulu geçene kadar istekleri bir geri dönüş sistemine yönlendirin.

  • Kök nedeni teşhis etmeye yardımcı olmak için kısıtlama olaylarını günlüğe kaydedin (gRPC için 530 / TOO_MANY_REQUESTS veya Remoting için 215 / messages flow control hata kodlarını arayın).