یکی از مفاهیم حیاتی در RabbitMQ، Acknowledgment (Ack) و Negative Acknowledgment (Nack) است. این مکانیزمها تضمین میکنند که پیامها به درستی پردازش شده و از بین نمیروند یا گم نمیشوند.
Ack (تایید دریافت پیام)
زمانی که Consumer پیامی را دریافت و پردازش میکند، میتواند با ارسال Ack به RabbitMQ، تایید کند که پیام با موفقیت پردازش شده است. در صورت فعال بودن Ack، RabbitMQ پیام را از صف حذف میکند.
def callback(ch, method, properties, body):
print(f"پیام دریافت شد: {body.decode()}")
ch.basic_ack(delivery_tag=method.delivery_tag)
Nack (عدم تایید پیام)
اگر پردازش پیام با خطا مواجه شود، Consumer میتواند با ارسال Nack یا عدم ارسال Ack، پیام را به صف بازگرداند تا دوباره پردازش شود. این کار تضمین میکند که هیچ پیام مهمی از دست نرود.
def callback(ch, method, properties, body):
try:
process_message(body)
ch.basic_ack(delivery_tag=method.delivery_tag)
except Exception:
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
Auto Ack
گزینه auto_ack=True
باعث میشود پیام پس از دریافت به صورت خودکار تایید شود. این روش ساده است اما در صورت بروز خطا، پیام از بین میرود و ممکن است از دست برود. برای تضمین تحویل، بهتر است تایید دستی (Manual Ack) استفاده شود.
channel.basic_consume(queue='task_queue',
on_message_callback=callback,
auto_ack=False)
نکات مهم
- استفاده از Manual Ack تضمین میکند پیامها تا پردازش کامل در صف باقی بمانند.
- Nack با گزینه
requeue=True
پیام را دوباره به صف برمیگرداند. - تضمین تحویل پیام یکی از اصول طراحی سیستمهای پایدار و مقاوم در برابر خطاست.
جمعبندی
استفاده از Ack و Nack برای تضمین تحویل پیامها در RabbitMQ ضروری است. این مکانیزم باعث میشود پیامها حتی در صورت بروز خطا در Consumer از بین نروند و سیستم پیامرسانی پایدار و قابل اعتماد باقی بماند.