استفاده از Dead Letter Exchange در RabbitMQ
یکی از قابلیتهای کاربردی RabbitMQ امکان ارسال پیامهای به خطا خورده به یک صف دیگر برای پردازش یا داشتن لاگ از پیامهای پردازش نشده است.
بطور مثال فرض کنید پیامهای انتقال موجودی کاربر را بر روی صف قرار میدهید و همچنین قابلیت پردازش دوباره پیامها را هم فعال کردهاید تا به تعداد دلخواه پیامها دوباره پردازش شوند. اما بعد از رسیدن به تعداد مشخص چه؟
اگر پیام را دور بیاندازید دیگر امکان بررسی آن را ندارید و همچنین اگر بگذارید در صف بماند باز هم پردازش میشود و به خطا میخورد. همچنین جلو پردازش دیگر پیامهای صف را هم میگیرد.
در این موقع میتوانید از این قابلیت استفاده کنید.
برای این کار در صفی که میخواهید باید دو مقدار x-dead-letter-exchange و x-dead-letter-routing-key را بدهید.
با دادن این مقادیر اگر پیغام basic.Reject شود و یا Basic.Nack داده شود و همچنین مقدار Requeue در آن برابر False باشد پیغام مورد نظر به Exchange گفته شده ارسال میشود.
مقدار Routing Key هم اگر Exchange مورد نظر را بصورت Direct تعریف کرده باشید مهم است. اگر نوع آن FanOut باشد نیاز به این مقدار ندارید.
_channel.ExchangeDeclare(
config.Exchange,
config.ExchangeType,
config.Durable,
config.ExchangeAutoDelete);
_channel.QueueDeclare(
config.Queue,
config.Durable,
false,
false,
new Dictionary<string, object>
{
{ "x-dead-letter-exchange", config.DeadLetter.Exchange },
{ "x-dead-letter-routing-key", config.DeadLetter.RoutingKey }
});
_channel.QueueBind(
config.Queue,
config.Exchange,
config.RouteKey);
دقت کنید که Exchange گفته شده را هم خودتان باید در کد ایجاد کنید و همچنین یک صف هم بر روی آن درست کنید.
_channel.ExchangeDeclare(
exchange: config.DeadLetter.Exchange,
type: "direct",
durable: true,
autoDelete: false);
_channel.QueueDeclare(
queue: config.DeadLetter.Queue,
durable: true,
exclusive: false,
autoDelete: false);
_channel.QueueBind(
config.DeadLetter.Queue,
config.DeadLetter.Exchange,
config.DeadLetter.RoutingKey);
برای اضافه کردن قابلیت پردازش چندباره یک پیام هم میتوانید از کد زیر استفاده کنید:
توضیحات بیشتر: