صف های پیام: RabbitMQ، کافکا
صف های پیام: RabbitMQ، کافکا
1) هنگامی که برای انتخاب
RabbitMQ (AMQP 0-9-1/1) 0, صف کلاسیک, صف حد نصاب, جریان)
مناسب برای: RPC/دستورات، گردش کار، وظایف کوتاه، مسیریابی fanout/موضوع، تایید انعطاف پذیر، کنترل اولویت.
مزایا: rich routing semantics (exchanges), 'basic. qos '(prefetch)، هر پیام TTL/تاخیر، RPC مناسب (پاسخ به) الگوهای، شروع آسان است.
معایب: تاریخچه ذخیره شده در صف، مقیاس به صورت افقی در سراسر صف/قطعات ؛ هزینه بالا با جریان بسیار بزرگ.
آپاچی کافکا (ثبت رویداد، احزاب، گروه های مصرف کننده)
مناسب برای: جریان رویداد، حسابرسی، منابع رویداد، ETL/ادغام (اتصال)، RPS/MBps بالا، پخش/پردازش مجدد، پردازش جریان (Streams/ksqlDB).
مزایا: مجله بلند مدت، مقیاس بندی توسط احزاب، پخش پایدار، تراکم کلیدی.
منفی: کشیدن + مدل احزاب - نه برای RPC کوچک ؛ نظم فقط در داخل حزب ؛ مدیریت طرح/قابلیت همکاری مسئولیت تیم است.
2) معانی تحویل و ناوردا
حداکثر یک بار: بدون بازپرداخت ؛ سریع، خطر از دست دادن.
حداقل یک بار: با عقب نشینی ؛ نیاز به idemotency مصرف کننده.
دقیقا یک بار: قابل دستیابی در شرایط محدود (Kafka TX + تولید کننده idempotent + سینک سازگار ؛ RabbitMQ - از طریق جدول deduplication/کلیدهای idempotent).
سفارش: RabbitMQ - سفارش صف (ممکن است با retras/چند مصرف کننده نقض شود) ؛ کافکا - نظم در حزب، کلید پارتیشن بندی را تنظیم می کند.
Invariants دامنه: پول/تعادل - از طریق مجلات/sagas و تیم های idempointent ؛ به LWW اعتماد نکنید.
3) الگوهای ادغام
Outbox/InBox: ثبت اتمی رویداد در پایگاه داده → انتشار در صف (صندوق پستی) و مصرف بی نظیر با ورود به سیستم پردازش (صندوق ورودی).
DLQ (حروف مرده): پس از N تلاش/خطا - در DLQ + هشدار.
تلاش مجدد/تاخیر: RabbitMQ - TTL + تبادل نامه مرده ؛ کافکا - سعی کنید موضوعات با عقب نشینی.
درخواست/پاسخ: RabbitMQ - 'پاسخ _ به' + 'همبستگی _ id'; کافکا - به ندرت، فقط با الگوهای خاص.
جبران خسارت: sagas بیش از حوادث ؛ هر عملیات یک معکوس دارد.
4) طراحی کلید و توپولوژی
RabbitMQ
مبادلات: «مستقیم»، «موضوع»، «fanout»، «هدر».
کلید مسیریابی: صف hit (s) را مشخص می کند. برای اولویت بندی - صف های جداگانه.
QoS: 'prefetch' (به عنوان مثال 50-300) نرخ تعادل/تاخیر.
Quorum صف: صف های تکراری در قایق ؛ جایگزین کلاسیک منعکس شده است.
جریان: جریان با آفست (کافکا مانند) برای توان بالا/پخش.
کافکا
پارتیشن ها: برنامه ریزی «# پارتیشن ها» در توان هدف و موازی سازی (افزایش سازگار با عقب آسان تر از کاهش است).
کلید: تمام سوابق یک کلید - در یک بخش (تضمین سفارش توسط کلید).
عامل تکرار: 3 برای موضوعات تولیدی، حداقل insync. replicas = 2 '+' acks = all 'برای قابلیت اطمینان.
نگهداری: با زمان/اندازه ؛ تراکم - آخرین مقادیر را با کلید + سنگ قبر برای حذف ذخیره می کند.
5) Retrai، DLQ، idempotency
RabbitMQ
تکرار: هر پیام TTL + DLX (تبادل نامه مرده) با بازپرداخت (به عنوان مثال، 1m → 5m → 15m).
Idempotence: 'correlation _ id '/' message-id' + جدول پیام پردازش شده (TTL) یا دستورات قطعی.
تأییدها: manual 'basic. ACK پس از معامله موفق ؛ اساسی است. 'nack (requeue = false)' в DLQ.
کافکا
تکرار: موضوعات تکراری فردی ؛ مصرف کننده پس از اثر جانبی موفقیت آمیز جبران می شود.
پردازش دقیق یک بار (EOS): تولید کننده "را فعال کنید. idempotence = درست '، تولید کننده/مصرف کننده معامله،' خوانده شده _ متعهد 'در مصرف کننده ؛ سینک (به عنوان مثال، Kafka → Kafka یا Kafka → DB از طریق یک معامله) - همگام سازی منظم.
Dedup: با کلید/کلید idempotent در سمت پایه، و یا از طریق موضوع فشرده شده است.
6) عملکرد و ابعاد
قانون لیتل: L = λ × W
برای گرداب: مورد نیاز همپوشانی 'N سهام (1. 2–1. 5)`.
RabbitMQ prefetch: با «prefetch = 100» شروع کنید و زمان پرواز را اندازه گیری کنید.
پارتیشن کافکا: محاسبه از موازی مصرف کننده مورد نظر و هدف توان (به عنوان مثال، 1 دسته پایدار است 5-20 MB/s در SSD/10GbE).
7) قابلیت مشاهده و هشدار
عمومی:- تاخیر/عقب ماندگی (پیام ها/بایت ها)، سن پیام ها (p95/p99)، نرخ خطای پردازش، نرخ DLQ.
- زمان «publikatsiya → obrabotka» (پایان به پایان).
- نقشه وابستگی: تولید کننده → کارگزار → مصرف کننده.
- اتصالات، کانال ها، پیام های غیر فعال، «memory _ alarm»، «disk _ free _ limit»، «طول صف» p95.
- گزارش ها در Quorum (رهبر، ورود به سیستم قایق، از دست رفته «quorum کافی نیست»).
- پارتیشن های تحت تکرار، ISR کوچک/گسترش، تغییرات کنترل کننده.
- خطاهای تولید کننده (timeouts، «درخواست تاخیر»)، تاخیر مصرف کننده در هر گروه/پارتیشن.
- کارگزار I/O، صفحه کش ضربه، GC، ZooKeeper/سلامت KRaft.
8) ایمنی و چند اجاره ای
TLS رمزگذاری در حمل و نقل، احراز هویت (SASL/PLAIN/SCRAM/OAuth، mTLS).
مجوز: vhost/permissions (RabbitMQ), ACL به موضوعات/گروه ها (کافکا).
سهمیه ها: برای اتصالات، کانال ها، اندازه صف/موضوع، سرعت انتشار/خواندن.
جداسازی توسط محیط (dev/stage/prod) و namespace/vhost.
9) عملیات و تنظیم
RabbitMQ
تبادل پست/صف به گره (CPU/IO سرمایه).
صف های تنبل (پیام به دیسک) برای بافر بزرگ ؛ اجتناب از صف های «داغ» بدون sharding.
Quorum صف برای HA ؛ طرح قایق اندازه ورود به سیستم و دیسک.
سیاست های TTL/length-limit، صف های اولویت فقط برای نیاز واقعی (گران).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
کافکا
SSD/NVMe، شبکه های سریع ؛ تنظیم سیستم عامل (swappiness کم، محدودیت فایل).
'clacks = all'، 'linger'. ms '(butching)،' فشرده سازی. نوع = zstd '/lz4 برای پهنای باند.
گزینه های مصرف کننده: "حداکثر نظرسنجی. فاصله زمانی. «خانم»، «مکس». نظرسنجی. سوابق، آوردن. حداقل بایت.
حفظ و تراکم - تعادل ذخیره سازی/پخش.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) یکپارچگی و اکوسیستم
Kafka Connect (سینک/منابع)، رجیستری طرح (Avro/JSON/Protobuf) و قابلیت همکاری ('BACKWARD/FORWARD/FULL').
جریانهای کافکا/ksqlDB: عملیات stateful، پنجره ها، aggregates.
RabbitMQ بیل/فدراسیون: انتقال بین خوشه/مراکز.
اپراتورهای K8s: Strimzi (کافکا)، اپراتور خوشه RabbitMQ ؛ بیانیه های GitOps.
11) چک لیست پیاده سازی (0-45 روز)
0-10 روز
موارد استفاده را تعریف کنید: دستورات/وظایف (RabbitMQ)، رویدادها/ممیزی ها (Kafka).
کلیدها را انتخاب کنید («کلید مسیریابی »/« کلید پارتیشن»)، SLO «publikatsiya → obrabotka» را تنظیم کنید.
سیاست های امنیتی پایه (TLS، ACL)، سهمیه ها، DLQ/TTL.
11-25 روز
پیاده سازی صندوق خروجی/صندوق ورودی، idempotency و deadup.
تنظیم عقب نشینی با عقب نشینی (خرگوش: TTL + DLX ؛ کافکا: موضوعات را دوباره امتحان کنید).
داشبورد: تاخیر، سن، نرخ DLQ، تاخیر پایان به پایان ؛ هشدار ها
26-45 روز
تنظیم پهنای باند: prefetch/acks (خرگوش) ؛ پارتیشن/acks/batch (کافکا).
روش DR (معکوس/تکرار)، آزمون شکست گره.
قراردادهای رویداد سند (طرح) و سیاست های قابلیت همکاری.
12) ضد الگوهای
یک ابزار «جهانی» برای همه وظایف.
عدم وجود DLQ/TTL: سموم ابدی (پیام های سمی).
«prefetch» نامحدود → گرسنگی مصرف کننده، رشد p99.
کافکا بدون کلید → از دست دادن سفارش/احزاب داغ به طور پیش فرض.
«دقیقا یک بار»، بدون نیاز واقعی/نظم و انضباط، احساس امنیت کاذب است.
اسرار/ورود به سیستم در کد، بدون TLS/ACL.
سخت افزار از طرح ها/نسخه های پیام بدون رجیستری و مهاجرت.
13) معیارهای بلوغ
SLO تاخیر/سن ≥ 99٪ از زمان انجام می شود ؛ نرخ DLQ تحت کنترل
Idempotency 100٪ از مسیرهای بحرانی را پوشش می دهد ؛ صندوق خروجی/صندوق ورودی اجرا شده است.
نگهداری/تراکم مستند شده است، پخش دوباره مصرف کنندگان را شکست نمی دهد.
هشدارها در ISR/URP (کافکا) و محدودیت های قایق/دیسک (خرگوش) تنظیم می شوند.
قراردادهای رویداد versioned (طرح رجیستری)، سازگاری در CI تست شده است.
روزهای بازی منظم: شکست گره/کارگزار/AZ، بررسی بازیابی.
14) نمونه هایی از پیکربندی (خلاصه)
RabbitMQ: پیشوند و تأیید (شبه کد):python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
مصرف کننده کافکا (ایده ها):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) نتیجه گیری
RabbitMQ و Kafka کلاس های مختلفی از مشکلات را حل می کنند: دستورات/وظایف و مسیریابی غنی در برابر ورود رویداد طولانی مدت و جریان مقیاس پذیر. موفقیت - در معانی صحیح تحویل، نظم و انضباط از idemotence، کلید متفکر، retrays/DLQ، قابلیت مشاهده و امنیت دقیق. شیوه های مهندسی را در اطراف صف ها - صندوق ورودی/صندوق ورودی، طرح ها و سیاست های GitOps ایجاد کنید - و ادغام شما قابل پیش بینی، مقیاس پذیر و پایدار می شود.