Zamanlanmış mesajlar ve gecikmeli mesajlar, her ikisi de teslimatı tüketicilere erteler. Aradaki fark, zamanlamanın nasıl belirtildiğidir:
Zamanlanmış mesaj: Mutlak bir zaman damgası belirtirsiniz. Broker mesajı tutar ve tam o anda teslim eder.
Gecikmeli mesaj: Göreceli bir süre belirtirsiniz. Broker mesajı tutar ve gönderilmesinden itibaren bu süre dolduğunda teslim eder.
Altta yatan mekanizma aynıdır. Broker mesajı depolar ve hedef zamana ulaşıldığında tüketicilere serbest bırakır.
Kullanım senaryoları
Sipariş zaman aşımı yönetimi: Bir kullanıcı e-ticaret ödeme akışında bir sipariş oluşturduğunda, 30 dakikalık gecikme ile gecikmeli bir mesaj gönderin. 30 dakika sonra tüketici, ödemenin tamamlanıp tamamlanmadığını kontrol eder. Tamamlanmadıysa siparişi iptal eder. Ödeme başarılı olduysa mesajı yok sayar.
Zamanlı bildirimler: Belirli bir saate -- örneğin, ertesi gün saat 09:00'a -- ayarlanmış zamanlanmış bir mesaj göndererek anlık bildirim veya hatırlatıcı tetikleyin.
Teslimat zamanını ayarlama
Her iki mesaj türü de aynı parametreyi kullanır: msg.setStartDeliverTime. Bu parametre, milisaniye hassasiyetinde Unix zaman damgası kabul eder.
Zamanlanmış mesaj: Hedef teslimat zamanının mutlak zaman damgasını geçirin.
Gecikmeli mesaj:
System.currentTimeMillis() + delayMillisdeğerini geçirin; buradadelayMillismilisaniye cinsinden gecikme süresidir.
Kod örnekleri
Bir mesajı şu andan itibaren 10 dakika sonrasına geciktirmek için:
// Calculate the delivery timestamp: current time + 10 minutes
long deliverTime = System.currentTimeMillis() + 10L * 60 * 1000;
msg.setStartDeliverTime(deliverTime);
Belirli bir tarih ve saat için mesajı zamanlamak için:
// Schedule delivery for 2024-06-15 14:30:00 (UTC+8)
// Millisecond Unix timestamp: 1718433000000
long deliverTime = 1718433000000L;
msg.setStartDeliverTime(deliverTime);
Kurallar ve sınırlamalar
| Kural | Ayrıntılar |
|---|---|
| Minimum teslimat zamanı | Geçerli zaman damgasından daha sonra olmalıdır. Belirtilen zaman geçmişte ise mesaj hemen teslim edilir. |
| Maksimum zamanlama penceresi | Geçerli zamandan itibaren 40 gün. Bu pencereyi aşan mesajlar gönderilemez. |
| Zaman birimi | Milisaniye |
| Konu türü gereksinimi | ApsaraMQ for RocketMQ konsolu içinde Message Type değeri Scheduled/Delayed Message olarak ayarlanarak konu oluşturulmalıdır. Bir konu yalnızca yapılandırılan türle eşleşen mesajları kabul eder. |
| Mesaj saklama süresi | En fazla 3 gün. Örneğin, teslimatı 5 gün sonrasına planlanan bir mesaj tüketilmezse 8. günde silinir (5 günlük gecikme + 3 günlük saklama). |
Teslimat hassasiyeti
Zamanlanmış ve gecikmeli mesajların tam belirtilen zamanda ulaşması aşağıdaki faktörler nedeniyle garanti edilmez:
Temel gecikme: 1 ila 2 saniye teslimat gecikmesi bekleyin.
Mesaj birikimi: Kuyrukta birikmiş mesajlar varsa zamanlanmış ve gecikmeli mesajlar bunların arkasına kuyruğa alınır ve hedef zamandan daha sonra gelebilir.
Saat kayması:
StartDeliverTimedeğeri broker saatine göre değerlendirilir. İstemci saati broker saatinden farklıysa gerçek teslimat zamanı üretici tarafından ayarlanan zaman damgasıyla eşleşmeyebilir.
Örnek kod
Tam producer ve consumer örnekleri için protokole ve dile göre düzenlenen aşağıdaki kılavuzlara bakın.
TCP
| Dil | Bağlantı |
|---|---|
| Java | Zamanlanmış mesajları gönderme ve alma |
| Java | Gecikmeli mesajları gönderme ve abone olma |
| C++ | Zamanlanmış mesajları gönderme ve abone olma |
| .NET | Zamanlanmış mesajları gönderme ve alma |