2014-04-18 19 views
27

RabbitMQ kullanıyorum ve e-posta iletileri içeren bir kuyruğum var. Tüketici hizmetim mesajları gönderiyor ve onları göndermeye çalışıyor. Herhangi bir sebeple, tüketicim mesajı gönderemezse, tekrar gönderilecek mesajı tekrar sıraya koyarım. Ben bir basicNack yapabileceğimi ve requeue flag'inin gerçek olmasını sağlayabileceğimin farkındayım, ancak mesajı süresiz olarak yeniden iletmek istemiyorum (eğer eposta sistemimiz bozulursa, sürekli mesajların tekrarlanmasını istemiyorum). Tekrar gönderilecek mesajı yeniden düzenleyebileceğim sınırlı sayıda tanımlamak istiyorum. E-posta mesajı nesnesinde bir alan ayarlayamıyorum, ancak, onu düşürdüğümde ve bir nack gönderdiğimde. Sıradaki iletide güncel alan yok. Buna yaklaşabileceğim başka bir yol var mı? Şimdiden teşekkürler.RabbitMQ'de yeniden deneme denemesi sayısını nasıl belirlerim?

+0

Bu blog yazısı neden kullanmak istediğinizi açıklayan oldukça iyi bir iş çıkarıyor Bu tür sorunları çözmek için .MyMusMQ içinde NServiceBus veya MassTransit gibi bir çerçeve: https://www.make-awesome.com/2017/12/sure-you-can-just-use-rabbitmq/ –

cevap

39

RabbitMQ'da (AMQP protokolünde olduğu gibi) yeniden deneme denemeleri gibi bir özellik yoktur. Sonra ve bırakın ve - daha önce redelivered olmasaydı

  1. yeniden teslim mesajı (Kütüphanenizin bunun için bazı arayüze sahip olmalıdır redelivered parametre yöntemi basic.deliver kontrol):

    Olası çözüm yeniden deneme girişimleri davranışını sınırlamak uygulamak dead letter exchange'da yakalayın, sonra bir şekilde işleyin.

  2. Her seferinde ileti yeniden yayınlanamaz, ancak başlık alanı artar veya azaltılır/azaltılır, yani x-redelivered-count (istediğiniz herhangi bir adı seçebilirsiniz). Bu durumda redeliveries üzerinde kontrol elde etmek için, bir sınırına ulaşıp ulaşmadığınızı kontrol etmelisiniz (üst veya alt - 0 benim tercihimdir, tcp/ip'ten ip başlığında a-la ttl). Redis, memcache veya diğer depolarda, mesela tekrar tekrar sayımla birlikte mysql'de ve daha sonra her bir yeniden dağıtım artış/azaltma değerinde, mesajın benzersiz anahtarını (uuid, ancak mesajı gönderdiğinizde manuel olarak ayarlamanız gerektiğini söyleyin) saklayın limite ulaşıncaya kadar.

  3. (gerçek geeksler için), istediğiniz gibi davranacak olan eklentiyi yazınız.

3. yanlısı olduğunu kuyruk kafasında redelivered mesaj konaklama. Uzun kuyruklarınız varsa veya ileti sırası sizin için önemliyse, bu önemlidir (not, bu yeniden gönderimler katı mesaj sırasını bozar, ayrıntılar için resmi belgelere veya this question on SO'a bakın).

P.S. .:

Orada bu konudaki similar answer olmakla php. Üzerinden bakın, belki biraz yardımcı olur (kelimesinden okumaya başlayın "Çevrim tekrarı sorunuyla başa çıkmak için birden çok teknik var".

+0

Teşekkürler Ölü mektubu değişim yoluna gideceğim sanırım – user2689570

+2

Ayrıca, yeniden deneme sayısını sınırlamak yerine mesaj ömrünü kısaltmak için zaman ayırmazsanız, her zaman bir TTL ayarlayabilirsiniz. –

İlgili konular