RabbitMQ, doğal olarak gecikmiş mesajları desteklemez. Şu anda ana uygulamalar, ölü-mektup borsası + mesaj TTL düzeni veya rabbitmq-delayed-message-exchange eklentisini kullanarak sağlanmaktadır.
Gecikmiş kuyruklar için kullanım alanları
- Mesaj üretimi ve tüketimi için zaman penceresi gereksinimlerinin olduğu senaryolarda kullanılır. Örneğin, e-ticaret işlemlerinde, ödeme belirli bir süre içinde tamamlanmazsa siparişlerin kapatılması gibi bir senaryo bulunmaktadır. Bu durumda, sipariş oluşturulduğunda gecikmiş bir mesaj gönderilir. Bu mesaj, tüketicilere 30 dakika sonra iletilir ve tüketici, ilgili siparişin ödenip ödenmediğini kontrol etmelidir. Ödeme tamamlanmamışsa sipariş kapatılır; ödeme tamamlanmışsa mesaj görmezden gelinir.
- Mesajlarla tetiklenen gecikmiş görevlerin olduğu senaryolarda kullanılır. Örneğin, belirli bir süre sonra kullanıcılara hatırlatma mesajları gönderme gibi.
Ölü mektup borsası + mesaj TTL düzeni
Bu yaklaşımın temel fikri, bir tüketici olmayan bir kuyruk oluşturmak ve mesaj süresinin sona erme süresini (TTL) kullanmaktır. Bir mesaj süresi dolduğunda, mesaj ölü mektup haline gelir, bu da ölü mektup borsasına yönlendirilir ve ardından tüketilebilecek bir ölü mektup kuyruğuna yönlendirilir.
Bu yaklaşımda, mesaj süresi dolduğunda mesaj gecikme süresi olarak işlev görür. Örneğin, mesaj TTL 30 saniye olarak ayarlandığında ve kuyruk için tüketiciler bulunmadığında, mesaj 30 saniye sonra süresi doldurur ve ölü mektup haline gelir, bu da ölü mektup kuyruğu tarafından işlenir.
Bu yaklaşımın uygulanması için aşağıdaki iki öğreticide açıklandığı gibi özelliklerin ayarlanması gerekir:
Gecikmiş mesaj eklenti çözümü
1. Eklentinin kurulması
rabbitmq-delayed-message-exchange GitHub deposu:
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
GitHub'daki yayın sayfasının varlık bölümünden rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez dosyasını indirin ve RabbitMQ eklenti dizinine (eklentiler dizini) yerleştirin.
Not: Sürüm numarası bu öğreticiden farklı olabilir. Eğer RabbitMQ'nuz en son sürümse, sadece eklentinin en son sürümünü seçin.
2. Eklentinin etkinleştirilmesi
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
3. Değişimi tanımlama
Gecikmiş mesaj göndermeyi desteklemek için özel değişim özelliklerini x-delayed-type kullanarak ayarlayın.
props := make(map[string]interface{})
// Gecikmiş mesaj göndermeyi desteklemek için anahtar parametresi
props["x-delayed-type"] = "direct"
// Değişimi tanımla
err = ch.ExchangeDeclare(
"gecikme.kuyrugu", // Değişim adı
"fanout", // Değişim tipi
true, // Dayanıklı
false,
false,
false,
props, // Özellikleri ayarla
)
4. Gecikmiş mesaj gönderme
Mesaj başlığını (x-delay) kullanarak mesaj gecikme süresini ayarlayın.
msgHeaders := make(map[string]interface{})
// Mesaj başlığını kullanarak mesaj gecikme süresini, milisaniye cinsinden ayarlayın
msgHeaders["x-delay"] = 6000
err = ch.Publish(
"gecikme.kuyrugu", // Değişim adı
"", // Yönlendirme parametresi
false,
false,
amqp.Publishing{
Headers: msgHeaders, // Mesaj başlıklarını ayarla
ContentType: "text/plain",
Body: []byte(body),
})
Not: Eğer Alibaba Cloud'un RabbitMQ Mesaj Kuyruğu hizmetini doğrudan kullanıyorsanız, eklenti kurulumu yapmadan mesaj başlığı özniteliğini (gecikme) kullanarak gecikme süresini ayarlayabilirsiniz. Alibaba Cloud, bu amaçla RabbitMQ'yu genişletmiştir.