GH GambleHub

صف های وظیفه و تعادل

1) چرا صف کار

صف کار/صف کار قطع تولید کنندگان و نوازندگان با زمان و سرعت:
  • قله Smoothes: بافر بین جلو و زیر سیستم های سنگین.
  • SLA را تثبیت می کند: اولویت ها و جداسازی کلاس های بار.
  • تحمل خطا را ساده می کند: retrays، DLQ، دوباره مرحله بندی.
  • مقیاس به صورت افقی: اضافه کردن کارگران بدون تغییر API.

دامنه های معمولی: پردازش پرداخت، اعلان ها، تولید گزارش/رسانه، پردازش پس از ETL/ML، ادغام با API های خارجی.


2) مدل و مفاهیم اساسی

تولید کننده: وظیفه را منتشر می کند (بارگیری + ابرداده: کلید idempointency، اولویت، مهلت).
صف/موضوع: بافر/ورود به سیستم از وظایف.
کارگر: یک کار را انجام می دهد، پردازش می کند، تایید می کند (ack) یا با یک خطا باز می گردد.
زمان مشاهده/اجاره: وظایف «اجاره» برای مدت زمان پردازش، پس از - تحویل خودکار.
DLQ (Dead Letter Queue): وظایف «دفن» پس از محدودیت تلاش/خطاهای مرگبار.
محدودیت نرخ/همزمانی: محدودیت مصرف هر کارگر/هر صف/هر مستاجر.

مدل های توزیع:
  • کشیدن: کارگر خود درخواست کار (دوز بار).
  • فشار: کرک کارگزار ؛ نیاز به حفاظت در برابر «پر کردن» کارگران ضعیف است.

3) معانی تحویل و تایید

حداکثر یک بار: بدون بازپرداخت ؛ سریعتر، اما از دست دادن امکان پذیر است.
حداقل یک بار (به طور پیش فرض برای اکثر صف ها): تکراری امکان پذیر است → عدم توانایی کنترل مورد نیاز است.
به طور موثر دقیقا یک بار: در سطح برنامه (idempotency، dedup، transactions/outbox) به دست آمد. یک کارگزار می تواند کمک کند، اما نه یک «گلوله جادویی».

تاییدیه ها:
  • Ack/Nack: نتیجه واضح است.
  • Requeue/Retry: с عقب نشینی + لرزش.
  • پیام مسموم - ارسال به DLQ.

4) تعادل و برنامه ریزی

4. 1 دنباله و الگوریتم

FIFO: ساده و قابل پیش بینی است.

صف اولویت: کلاسهای اولویت (P0... P3)

WRR/WSR (وزن گرد رابین/تصادفی): سهام CPU/transput بین کلاس ها.
WFQ/DRR (مشابه صف های «عادلانه» در شبکه ها): سهام هر مستاجر/مشتری.
مهلت/EDF: برای وظایف با مهلت.
سهم منصفانه: محدود کردن «همسایگان پر سر و صدا» (سهمیه هر مستاجر).

4. 2 جریان پردازش

Single-flight/Coalescing: وظایف کلیدی تکراری را ترکیب کنید.
کلاه همزمانی: محدودیت های سخت در موازی با نوع کار/ادغام (API های خارجی).

4. 3 ژئو و شاردینگ

Shards by key (tenant/id) → محل داده ها، نظم پایدار در داخل shards.
حافظه های پنهان/منابع چسبنده: مسیریابی هش به کارگران با حالت «متصل».


5) Retrai، عقب نشینی و DLQ

عقب نشینی نمایشی + jitter: 'پایه 2 ^ تلاش ± تصادفی'.
حداکثر تلاش و مهلت کل (زمان مرگ) در هر کار.
طبقه بندی خطاها: «قابل برگشت» (شبکه/حد)، «غیر قابل برگشت» (اعتبار سنجی/ممنوعیت کسب و کار).
صف پارکینگ/تأخیر: وظایف معوق (به عنوان مثال، بعد از 15 دقیقه تکرار کنید).

سیاست DLQ: مطمئن شوید که نشان می دهد که کجا و تحت چه شرایطی پیام «سمی» می شود ؛ ارائه یک پردازنده مجدد


6) Idempotency و deduplication

Idempotency-کلید در کار ؛ فروشگاه (Redis/DB) با TTL برای آخرین N کلید:
  • → skip/merge/result-cache مشاهده شد.
  • کلیدهای طبیعی: به جای UUIDهای تصادفی از 'order _ id/ payment_id' استفاده کنید.
  • Outbox - ثبت واقعیت کار و وضعیت آن در یک معامله پایگاه داده با یک معامله تجاری.
  • دقیقاً یک بار به رنگ آبی: «UPSERT» با کلید، نسخه، «حداقل یک بار» در صف + idempotency در پایگاه داده.

7) کلاس های چند اجاره ای و SLA

صف های جداگانه/جریان توسط کلاس: «بحرانی»، «استاندارد»، «فله».
سهمیه ها و اولویت های هر مستاجر (طلا/نقره/برنز).
جداسازی: اختصاص استخر کارگران تحت P0 ؛ پس زمینه - در یک خوشه/گره جداگانه.
کنترل پذیرش: بیش از آنچه که می توانید در مهلت ها پردازش کنید، قبول نکنید.


8) کارگران خودکار

معیارهای پوسته پوسته شدن: عمق صف، نرخ ورود، زمان پردازش، مهلت SLA.
KEDA/افقی غلاف Autoscaler: SQS/خرگوش/کافکا عمق تاخیر باعث می شود.
عوامل محدود کننده: محدودیت های نرخ خارجی API ها، پایگاه داده (پایان دادن به عقب را نابود نمی کند).


9) گزینه های تکنولوژی و الگوهای

9. 1 RabbitMQ/AMQP

مبادلات: مستقیم/موضوع/fanout ؛ صف с ack/ttl/DLQ (تبادل نامه مرده).
Prefetch (QoS) تنظیم «تعداد وظایف بر روی کارگر» است.

مثال DLX:
ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.failed x-message-ttl=60000

9. 2 SQS (و آنالوگ)

زمان مشاهده، DelaySeconds، RedrivePolicy (DLQ).
Idempotence - در برنامه (جدول dedup).
محدودیت ها: دکمه ها 1-10 پست ؛ روي کبودي هاي بيهوده تمرکز کن.

9. 3 کافکا/NATS جت استریم

برای خطوط لوله در مقیاس بزرگ: توان بالا، نگهداری/پخش.
صف کار بر روی سیاهههای مربوط: یک کار = یک پیام ؛ یک کارگر در هر کنترل کلیدی از طریق/پارتیشن بندی موضوع.
Retrai: موضوعات فردی/پسوند موضوع با عقب نشینی.

9. 4 صف قرمز (Sidekiq/Resque/Bull/Celery-Redis)

تاخیر بسیار کم ؛ سازمان دیده بان برای ثبات (RDB/AOF)، کلیدهای سعی مجدد و قفل کلید برای تک پرواز.
مناسب برای وظایف «سبک»، نه برای بازپرداخت طولانی مدت.

9. 5 چارچوب

Celery (Python), Sidekiq (Ruby), RQ/BullMQ (Node), Huey/Resque - retrays-ready-made, schedules, middleware, metrics.


10) طرح های مسیریابی و تعادل

Round-Robin: به طور مساوی اما «شدت» وظایف را در نظر نمی گیرد.
RR وزنی: توزیع بر اساس ظرفیت کارگر/استخر.
منصفانه/فشار برگشتی: کارگر تنها زمانی که آماده است، یک کار جدید را انجام می دهد.
خطوط اولویت: صف های جداگانه در هر کلاس ؛ کارگران به ترتیب [P0 →... → Pn] را در صورت موجود بودن بخوانند.
Hash-routing: 'hash (key)% shards' - برای پردازش stateful/cached.


11) مدت زمان، مهلت و SLA

Per-task timeout: اجاره نامه داخلی کار (در کد کارگر) ≤ Timeout Visibility کارگزار.
مهلت جهانی: این کار پس از زمان T معنی ندارد - NACK → DLQ.
آگاه از بودجه: کاهش کار (brownout) زمانی که مهلت نزدیک (نتایج جزئی).


12) قابلیت مشاهده و مدیریت

12. 1 معیارها

'queue _ depth', 'arrival _ rate', 'service _ rate', 'lag' (Kafka), 'invisible _ messages' (SQS).
'success/failed/retired _ total', 'retry _ attempts', 'dlq _ in _ total', 'processing _ time _ ms {p50, p95, p99}'.
'idempotency _ hit _ rate', 'dedup _ drops _ total', 'poison _ total'.

12. 2 سیاهههای مربوط/ردیابی

همبستگی: 'job _ id'، 'correlation _ id'، کلید deduplication.
نشانگذاری 'retry/backoff/dlq' به عنوان رویدادها ؛ پیوند از درخواست اولیه دهانه.

12. 3 داشبورد/هشدار

عوامل: عمق> X، p99> SLO، رشد DLQ، وظایف گیر (دید منقضی شده> N)، کلید های داغ.


13) ایمنی و انطباق

جداسازی مستاجر: صف های فردی/فضاهای کلیدی، ACL ها، سهمیه ها.
رمزگذاری در حمل و نقل و/یا «در حالت استراحت».
به حداقل رساندن PII در payload ؛ هش/شناسه به جای PII خام.
اسرار: نشانه ها را در بدن کار قرار ندهید، از vault/refs استفاده کنید.


14) ضد الگوهای

مدل فشار بدون فشار پشتی → کارگران خفه می شوند

Retray without idempotency → عملیات تکراری/پول «دو بار».
یک صف غول پیکر «برای همه چیز» → بدون انزوا، تاخیر غیر قابل پیش بینی.
Retrai بی پایان بدون DLQ → وظایف «سمی» ابدی.
زمان مشاهده <زمان پردازش → تکراری آبشار.
payload بزرگ در صف → فشار شبکه/حافظه ؛ بهتر است برای ذخیره در یک stor شی و انتقال یک لینک.
مخلوط کردن وظایف مهم و فله در یک استخر از کارگران.


15) چک لیست پیاده سازی

  • طبقه بندی وظایف توسط SLA (P0/P1/P2) و حجم.
  • یک کارگزار/چارچوب را با معانی و نگهداری مورد نظر انتخاب کنید.
  • کلید های طراحی، اولویت ها و مسیریابی (خطوط هش/شارد/اولویت).
  • فعال کردن backoff + jitter retrays و سیاست DLQ.
  • اجرای idempotency (کلید، upsert، deadstore با TTL).
  • تنظیم هر کار، دید، و مهلت زمانی به طور کلی.
  • محدود کردن همزمانی و نرخ توسط ادغام/مستاجران.
  • عمق/تاخیر خودکار مقیاس با فیوز.
  • معیارها/ردیابی/هشدارها ؛ «طوفان» و سرریز DLQ.
  • آزمون برای شکست: سقوط کارگر، پیام «سمی»، اضافه بار، وظایف طولانی.

16) تنظیمات نمونه و کد

16. 1 کرفس (قرمز/خرگوش) - جریان پایه

python app = Celery("jobs", broker="amqp://...", backend="redis://...")
app.conf.task_acks_late = True        # ack после выполнения app.conf.broker_transport_options = {"visibility_timeout": 3600}
app.conf.task_default_retry_delay = 5 app.conf.task_time_limit = 300        # hard timeout

@app.task(bind=True, autoretry_for=(Exception,), retry_backoff=True, retry_jitter=True, max_retries=6)
def process_order(self, order_id):
if seen(order_id): return "ok"      # идемпотентность do_work(order_id)
mark_seen(order_id)
return "ok"

16. 2 RabbitMQ - DLQ/TTL

ini x-dead-letter-exchange=dlx x-dead-letter-routing-key=jobs.dlq x-message-ttl=600000   # 10 минут x-max-priority=10

16. 3 کافکا - Retrays توسط سطح


orders -> orders.retry.5s -> orders.retry.1m -> orders.dlq

(انتقال با تحویل تاخیر از طریق زمانبندی/cron-consumer.)

16. 4 NATS JetStream - بازپرداخت с مصرف کننده

bash nats consumer add JOBS WORKERS --filter "jobs.email" \
--deliver pull --ack explicit --max-deliver 6 \
--backoff "1s,5s,30s,2m,5m"

17) سوالات متداول

س: هنگامی که برای انتخاب فشار در مقابل کشیدن ؟

A: کشیدن به عقب فشار طبیعی و تعادل «صادقانه» می دهد ؛ فشار در سرعت های پایین آسان تر است و زمانی که حداقل TTFB مورد نیاز است، اما نیاز به محدود کننده دارد.

س: چگونه از یک کلید داغ جلوگیری کنیم ؟

A: Shard با کلید کامپوزیت ('order _ id% N')، بافر و فرایند دسته ای، محدودیت های هر کلید را وارد کنید.

س: آیا ممکن است به «دقیقا یک بار» ؟

A: عملا - از طریق idempotence و صندوق خروجی معامله. به طور کامل «ریاضی» دقیقا یک بار به ندرت قابل دستیابی و گران است.

س: پیوست های کار بزرگ را کجا ذخیره کنیم ؟

A: در ذخیره سازی شی (S3/GCS)، و در کار - لینک/ID ؛ کاهش فشار بر کارگزار و شبکه.

س: چگونه TTL/visibility را انتخاب کنیم ؟

A: دید ≥ زمان پردازش p99 × سهام 2-3 ×. وظایف TTL - مهلت کسب و کار کمتر.


18) مجموع

یک سیستم صف بندی قوی، تعادل بین معانی تحویل، اولویت ها و محدودیت ها است. کلید های طراحی و مسیریابی، اطمینان از idempotency، retray با backoff و DLQ، تخصیص منابع به کلاس های SLA و نظارت بر معیارها. سپس فرآیندهای پس زمینه شما قابل پیش بینی، پایدار و مقیاس پذیر خواهد بود - هیچ شگفتی در زیر قله.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.