RabbitMQ TTL ve DLX Kullanımı

sinem sepetci
hepsiburadatech
Published in
3 min readFeb 3, 2023

Herkese merhaba, bu yazımda RabbitMQ’da biriken mesajları expire süresi tanımlayarak nasıl yönetebileceğimizi sizlere anlatacağım. Şimdi önce TTL ve DLX kavramlarından ve bunları neden birlikte anlattığımdan kısaca bahsedelim.

TTL(time-to-live)

RabbitMQ, hem mesajlar hem de kuyruklar için TTL tanımlamamıza olanak tanır. Süresi dolmuş mesajlar veya kuyruklar silinir ve daha sonrasında kendi konfigürasyonumuza göre yönetebiliriz.
TTL özelliği, optional argümanlar ile kontrol edilebilir. TTL tek bir kuyruğa veya mesaja uygulanabilir.

DLX(Dead Letter Exchange)

Kuyruktaki mesajların dead lettered olabilme durumlarını şu şekilde inceleyebiliriz.
· Mesaj, requeue parametresi false olarak ayarlanmış basic.reject(olumsuz bildirimler için kullanılır ancak basic.nack’e kıyasla bir sınırlaması vardır) veya basic.nack(olumsuz onaylar için kullanılır) kullanan bir consumer tarafından olumsuz ack(negatively ack) alınmışsa,
· per-message TTL nedeniyle mesajın süresi doluyor,
· Kuyruktaki uzunluk sınırını aştığı için mesaj drop olmuş olabilir.

Bu iki özelliği kullanırken birbiriyle ilişkilendireceğiz. DLX queue’ları diğer kuyruklar nasıl tanımlanıyorsa aynı şekilde tanımlanır ve diğerlerinden hiçbir farkı yoktur.
Var olan bir kuyruktaki mesaja Expire özelliği verildiğinde dead-letter-exchange kuyruğunu tanımlamalıyız ki, mesaj expire olduğunda buraya düşsün. Ya da var olan bir kuyruğa TTL özelliğini tanımlarsak kuyruktaki mesajların süresi dolduğunda DLX olarak tanımladığımız kuyruğa mesajlar taşınacaktır. Böylece alıcısı olmayan mesajlar için kuyrukta birikme gibi bir durum meydana gelmeyecek.

Yukarıdaki resimde aslında ne yaptığımızı anlatmaya çalıştım. MainExchange adında bir exchange’im var. mainqueue tanımlarken argüman olarak x-dead-letter-exchange ve x-message-ttl policy tanımlarını yaptığımızda kuyruğa ttl eklemiş oluruz. Yani kuyruktaki mesajlar 60 saniyeden sonra dlx isimli exchange’e iletilir. Şimdi bunu arayüzden uygulamaya bakalım.

Exchange oluşturalım.

Exchange’e gelen mesajları ileteceğimiz kuyruğu oluşturalım.

Dead-letter-exchange süresi dolan mesajımızı dlxqueue’ya yönlendirmesi için oluşturalım.

Dead-letter-exchange için bir dead letter queue oluşturalım.

Şimdi bu oluşturduğumuz kuyruklara tek tek giderek bindinglerini exchange’lerimiz olacak şekilde ekleyelim. mainqueue için mainexchange ekledik. dlxqueue için de aynı şekilde dlx isimli exchange binding eklemeliyiz.

Publish edilen mesaj 60 saniye sonra dlx’e iletilmek üzere bu kuyruktan siliniyor.

Şimdi bunu kodda nasıl uygularız kısaca ona bakalım.

Yukarıda arayüzde yaptıklarımızı kod içerisinde yukarıdaki şekilde gerçekleştirebiliyoruz. mainqueue’ya gelen bir mesaj süresi dolduğunda dlx’e iletilirken rabbitmq tarafından otomatik olarak oluşturuluyor.

Aslında queue bazında ttl ve dlx kullanımını görmüş olduk. Ancak mesajlara da ttl eklenebileceğinden bahsetmiştik. Bunu yapabilmek için producer mesajı yayınlarken Expiration ile dolu gönderirse mesaj süresi dolduğunda kuyruktan silinecek ve expired olarak işaretlenecektir.

Mesajı dlx kuyruğundan get ile çektiğinizde aşağıdaki şekilde hangi kuyruktan geldiğini ve durumunu görebilirsiniz.

Mesaj abc queue’dan abc_dlx queue’ya iletilmiştir.

Bunu arayüzden aşağıdaki şekilde iletirseniz aynı işlemi yapmış olursunuz.

TTL ve DLX kullanımı hakkında anlatacaklarım bu kadardı. Bir sonraki yazımda görüşmek üzere…

--

--