در سیستمهای پیامرسانی، ممکن است تعداد پیامهای دریافتی از صف بسیار زیاد باشد و Consumer نتواند آنها را با سرعت مناسب پردازش کند. برای کنترل سرعت پردازش پیامها و جلوگیری از Overload، RabbitMQ از مفاهیم Quality of Service (QoS) و Rate Limiting پشتیبانی میکند.
Quality of Service (QoS)
با تنظیم QoS میتوان تعداد پیامهایی که Consumer قبل از ارسال تاییدیه (Ack) دریافت میکند را محدود کرد. این کار باعث میشود مصرفکننده پیامها را با سرعت مناسب پردازش کند و از انباشته شدن پیامها جلوگیری شود.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
# تنظیم QoS: دریافت تنها یک پیام قبل از Ack
channel.basic_qos(prefetch_count=1)
def callback(ch, method, properties, body):
print(f"پیام دریافت شد: {body.decode()}")
# پردازش پیام
ch.basic_ack(delivery_tag=method.delivery_tag)
channel.basic_consume(queue='task_queue',
on_message_callback=callback,
auto_ack=False)
print('در انتظار پیامها...')
channel.start_consuming()
Rate Limiting
Rate Limiting به معنی محدود کردن تعداد پیامهای پردازش شده در یک بازه زمانی مشخص است. در RabbitMQ با ترکیب prefetch_count و تاخیر در پردازش پیامها میتوان Rate Limiting ساده پیادهسازی کرد:
import time
def callback(ch, method, properties, body):
print(f"پیام دریافت شد: {body.decode()}")
time.sleep(1) # پردازش با تاخیر برای کنترل سرعت
ch.basic_ack(delivery_tag=method.delivery_tag)
مزایا
- جلوگیری از Overload شدن Consumer و مصرف منابع بیش از حد.
- افزایش پایداری و کارایی سیستم با مدیریت بهینه سرعت پردازش پیامها.
- کنترل دقیقتر جریان پیامها در سیستمهای توزیعشده و مقیاسپذیر.
جمعبندی
با استفاده از QoS و Rate Limiting میتوان سرعت پردازش پیامها توسط Consumer را مدیریت کرد و از ایجاد ترافیک زیاد و فشار روی سیستم جلوگیری نمود. این مفاهیم برای طراحی سیستمهای پیامرسانی پایدار و مقیاسپذیر بسیار مهم هستند.