در سیستمهای پیامرسانی، گاهی Consumer قادر به پردازش پیامها نیست یا به دلیل خطا پیام ناموفق میشود. برای جلوگیری از از دست رفتن پیامها و افزایش اطمینان از پردازش، مکانیزم Retry استفاده میشود.
پیادهسازی Retry با Nack
زمانی که پردازش پیام با خطا مواجه میشود، میتوان با ارسال basic_nack
پیام را دوباره به صف برگرداند:
def callback(ch, method, properties, body):
try:
process_message(body)
ch.basic_ack(delivery_tag=method.delivery_tag)
except Exception as e:
print(f"خطا: {e}، پیام برای Retry به صف بازگردانده میشود")
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
استفاده از Dead Letter Queue برای Retry کنترلشده
برای کنترل بهتر تعداد دفعات Retry و زمانبندی مجدد، میتوان پیامهای ناموفق را به Dead Letter Queue منتقل کرد و پس از مدت زمان مشخص دوباره به صف اصلی بازگرداند.
# تعریف صف اصلی با Dead Letter Exchange
channel.queue_declare(queue='main_queue',
durable=True,
arguments={
'x-dead-letter-exchange': '',
'x-dead-letter-routing-key': 'retry_queue'
})
# تعریف صف Retry با TTL مشخص
channel.queue_declare(queue='retry_queue',
durable=True,
arguments={
'x-message-ttl': 5000, # زمان انتظار 5 ثانیه
'x-dead-letter-exchange': '',
'x-dead-letter-routing-key': 'main_queue'
})
مزایای Retry کنترلشده
- پیامهای ناموفق چندین بار پردازش میشوند تا موفقیت تضمین شود.
- امکان جلوگیری از پردازش فوری و Overload سیستم با استفاده از صف Retry و TTL وجود دارد.
- قابلیت تحلیل و مانیتورینگ پیامهای مشکلدار با Dead Letter Queue فراهم میشود.
جمعبندی
مدیریت خطا و Retry یکی از اصول طراحی سیستمهای مقاوم در RabbitMQ است. با استفاده از مکانیزمهای Nack، Dead Letter Queue و صفهای Retry میتوان اطمینان حاصل کرد که پیامها حتی در مواجهه با خطاها دوباره پردازش میشوند و سیستم پایدار باقی میماند.