תורים: RabbitMQ, Kafka
תורים: RabbitMQ, Kafka
1) מתי לבחור
RabbitMQ (AMQP 0-9-1/1. 0, תורים קלאסיים, תורים של מניין, נחלים)
מתאים: RPC/פקודות, עבודה, משימות קצרות, ניתוב פנוט/נושא, אישורים גמישים, בקרת עדיפות.
מקצוענים: סמנטיקה של ניתוב עשיר (החלפות), בסיסי. qos '(prefetch), לכל הודעה TTL/עיכוב, דפוסי RPC (תשובה-to) נוחים, התחלה קלה.
חסרונות: היסטוריה מאוחסנת בתור, מאוזנת אופקית על פני תורים/רסיסים; עלות תפוקה גבוהה עם זרימות גדולות מאוד.
אפאצ 'י קפקא (יומן אירועים, מסיבות, קבוצות צרכנים)
מתאים: זרמי אירועים, ביקורת, מיקור אירועים, ETL/אינטגרציות (Connect), RPS/MBps גבוה, שידור חוזר/עיבוד מחדש, עיבוד זרם (Streams/ksqlDB).
יתרונות: יומן ארוך טווח, מדשדש על ידי צדדים, שידור חוזר יציב, דחיסת מפתח.
חסרונות: למשוך + צד מודל - לא עבור RPC קטן; רק סדר בתוך המפלגה; סכימה ניהול/אינטרפרטציה היא האחריות של הקבוצה.
2) משלוח סמנטיקה ואינווריאנטים
לכל היותר-פעם: אין מגשים מחדש; מהר, סיכון לאובדן.
לפחות פעם אחת: עם נסיגות; דורש אידמפוטנטיות צרכנית.
בדיוק-פעם אחת: ניתן להשיג בתנאים מגבילים (Kafka TX + idempotent productor + stable skin; RabbitMQ - דרך שולחן השכפול/מפתחות אידמפוטנטים).
סדר: RebitbMQ - תור סדר (ניתן להפרה באמצעות רטראס/רב-צרכנים); קפקא - סדר במפלגה, המפתח קובע את המחיצה.
Domain invariants: כסף/מאזן - באמצעות כתבי עת/סאגות וצוותי אידמפוטנטים; לא לסמוך על LWW.
3) תבניות אינטגרציה
Outbox/Inbox: הקלטה אטומית של המאורע במסד הנתונים * פרסום לתור (outbox) וצריכה אידמפוטנטית עם רישום העיבוד (inbox).
DLQ (אותיות מתות): לאחר N ניסיונות/שגיאות - בכוננות DLQ +.
Retry/Helief: RabbitMQ - TTL + החלפת אותיות מתות; קפקא - נסה מחדש נושאים עם גיבוי.
בקשה/תשובה: RabbitQ - 'תשובה _ to' + 'קורלציה _ id'; קפקא - לעתים נדירות, רק עם דפוסים מיוחדים.
פיצויים: סאגות על אירועים; לכל מבצע יש היפוך.
4) מפתח ועיצוב טופולוגיה
RabbitMQ
החלפות: ”ישיר”, ”נושא”, ”פנוט”, ”כותרות”.
מפתח ניתוב: מפרט את התור להיט (s). לתעדוף - תורים נפרדים.
QOS: ”prefetch” (למשל. 50-300) מאזנים קצב/latency.
תורים של קוורום: תורים משוכפלים ברפסודה; מחליף משקף קלאסי.
זרמים: זרם עם קיזוז (כמו קפקא) עבור תפוקה גבוהה/הילוך חוזר.
קפקא
מחיצות Topice #: לתכנן '# מחיצות' על פריסת מטרות ומקביליות (עלייה בהתאמה לאחור קלה יותר מאשר ירידה).
מפתח: כל הרשומות של מפתח אחד - בחלק אחד (ערובה לסדר על ידי מפתח).
גורם שכפול: 3 לנושאים פרודוקטיביים, insync. שכפול = 2 '+' acks = הכל בשביל אמינות.
שימור: לפי גודל/זמן; קומפוזיציה - מאחסנת את הערכים האחרונים על ידי מצבות מפתח + למחיקה.
5) רטריי, DLQ, אידמפוטנטיות
RabbitMQ
חזרות: לכל הודעה TTL + DLX (החלפת אותיות מתות) עם גיבוי (לדוגמה, 1m * 5m = 15m).
idempotence: "correlation _ id'/' message-id' + טבלת מסרים מעובדת (TTL) או פקודות דטרמיניסטיות.
אישור: ידני 'בייסי. אק 'לאחר עסקה מוצלחת; " בסיסי. נאק (דרישה = שקר) 'Extreme DLQ.
קפקא
חזרות: נושאים בנפרד; הצרכן מתקזז אחרי תופעת לוואי מוצלחת.
עיבוד של פעם אחת בדיוק (EOS): אידמפוטנטיות = אמת ", יצרן/צרכן טרנסצנדנטי," read _ died "על הצרכן; Sink (לדוגמה, Kafka = קפקא או קפקא = DB באמצעות עסקה) - סינכרון מסודר.
דדאפ: על ידי מפתח/מפתח אידמפוטנטי בצד הבסיס, או דרך נושא דחוס.
6) ביצועים ומימד
חוק ליטל: "L = ערכיות × W&fost
עבור Vorker: נדרש חפיפה של N integraphing arrival_rate × avg_processing_time x stock (1. 2–1. 5)`.
RabbitMQ prefetch: התחל עם 'prefetch = 100' ומדוד p99/in-flight time.
מחיצות קפקא: חישוב מקבילות הצרכן הרצויות ומטרת פריטה (לדוגמה, אצווה 1 יציבה 5-20 MB/s על SSD/10GBE).
7) יכולת תצפית והתראות
כללי:- Lag/Backlog (הודעות/בייטים), גיל ההודעות (p95/p99), קצב השגיאות של העיבוד, DLQ-rate.
- Time ”publikatsiya # obrabotka” (מקצה לקצה).
- מפת התלות: producer ac לצרכן.
- חיבורים, ערוצים, הודעות לא מבוססות, ”זיכרון _ אזעקה”, ”disk _ free _ limit”, ”תור אורך” p95.
- דיווחים על קוורום (מנהיג, יומן רפסודה, מפספס ”מניין לא מספיק”).
- מחיצות מתחת לשכפול, מכווץ ISR/להתרחב, שינויים בקר.
- שגיאות יצרן (פסקי זמן, 'בקשה latency'), פיגור צרכני לקבוצה/מחיצה.
- ברוקר איי-או, חיסול מטמון דף, ג 'י-סי, בריאות שומרי ראש/קרפט.
8) בטיחות וריבוי דירות
הצפנת TLS במעבר, אימות (SASL/PLAIN/SCRAM/OAUth, mTLS).
אישור: vhost/הרשאות (RabbitMQ), ACL לנושאים/קבוצות (Kafka).
מכסות: לחיבורים, ערוצים, גודל תור/נושא, הוצאה לאור/מהירות קריאה.
בידוד על ידי סביבות (dev/stage/prod) ועל ידי namespace/vhost.
9) מבצע וכוונון
RabbitMQ
לאחר החלפת תורים/תורים לצמתים (CPU/IO capital).
תורים עצלים (הודעות לדיסק) עבור חוצצים גדולים; להימנע מתורים ”חמים” בלי לשדרג.
תורים של קוורום עבור HA; תוכנית רפסודה גודל רישום ודיסק.
מדיניות TTL/הגבלת אורך, תורים בעדיפות רק לצורך אמיתי (יקר).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
קפקא
SSD/NVME, רשתות מהירות; כוונון מערכת ההפעלה (swappency low, file limits).
'חסרים = כולם', 'להתעכב. ms '(חבטה),' דחיסה. סוג = 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 (שקעים/מקורות), Schema Registry (Avro/JSON/Protobuf) ו-Interoperability (”אחורה/קדימה/מלא”).
זרמי קפקא/ksqlDB: פעולות סטטיסטיות, חלונות, אגרגטים.
RabbitMQ Shubel/Federation: העברה בין אשכולות/מרכזים.
מפעילי K8s: Strimzi (קפקא), RabbitMQ Cluster Operator; מניפוסי GitOps.
11) רשימת מימושים (0-45 ימים)
0-10 ימים
הגדרת מקרי שימוש: פקודות/משימות (RabbitMQ), אירועים/ביקורת (קפקא).
בחר מפתחות (”ניתוב מקש ”/” מפתח מחיצה”), קבע SLO ”publikatsiya # obrabotka”.
מדיניות אבטחה בסיסית (TLS, ACL), מכסות, DLQ/TTL.
11-25 ימים
יישום תיבת יוצא/תיבת דואר אלקטרוני, אידמפוטנטיות ובדיחות.
הגדרת נסיגה עם גיבוי (Rabbit: TTL + DLX; קפקא: מחדש נושאים).
לוחות מחוונים: lag, גיל, DLQ-rate, latency-to-end; התראות.
26-45 ימים
רוחב פס מכוון: prefetch/acks (ארנב); מחיצות/אקס/אצווה (קפקא).
נהלי DR (שיקוף/שכפול), בדיקות כשל צומת.
חוזי אירוע מסמך (סכמות) ומדיניות בין-זמניות.
12) אנטי דפוסים
כלי אחד ”אוניברסלי” לכל המשימות.
היעדר DLQ/TTL: רעלים נצחיים (הודעות רעל).
ללא הגבלה 'prefetch' * רעב צרכני, גידול p99.
קפקא ללא מפתחות = אובדן סדר/צדדים חמים כברירת מחדל.
"בדיוק-פעם אחת, ללא צורך/משמעת אמיתית, היא תחושת ביטחון כוזבת.
סודות/התחברות בקוד, ללא TLS/ACL.
הארדקוד של תוכניות/גרסאות של הודעות ללא רישום ונדידה.
13) מדדי בגרות
לאג/גיל SLO מבוצע ב-99% מהזמן; דרגת DLQ תחת שליטה.
אידמפוטנטיות מכסה 100% של מסלולים קריטיים; תיבת דואר אלקטרוני מיושמת.
שימור/דחיסה מתועדים, שידור חוזר לא שובר את הצרכנים.
התראות על ISR/URP (קפקא) ומגבלות רפסודה/דיסק (ארנב) מוכנות.
חוזי אירועים מבוססים (Schema Registry), תאימות נבחנת ב-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 פותרים מחלקות שונות של בעיות: פקודות/משימות וניתוב עשיר כנגד יומן אירועים ארוך טווח וזרימה סקלרית. הצלחה - בסמנטיקה הנכונה של ההעברה, משמעת של אידמפוטנטיות, קשיחות מתחשבת, מגשים מחדש/DLQ, יכולת תצפית וביטחון קפדני. לבנות שיטות הנדסיות סביב תורים - תיבות יוצא/תיבת דואר אלקטרוני, תוכניות, ומדיניות GitOps -