Topics and Partitions - Kafka - קפקה - הרצאה 3 מתוך 5

פורסם: 31 באוקטובר 2019

תקציר

טופיק ופרטישנים: פיצול למקביליות והפצה בין ברוקרים; Commit Log (append-only), מחיקה לפי מדיניות; Offset ייחודי לפרטישן וזיהוי חד-ערכי (טופיק + פרטישן + אופסט); Current Offset לקונסיומר ואחריות מקומית; סדר הודעות רק בתוך אותו פרטישן; הכנה לפרק הבא — Keys וניתוב לפרטישן.

האזנה ישירה

תמלול הפרק (לחצו לפתיחה)

קפקא פרק 3 - Topics ו-Partitions

שלום לכולם, אני אורן מהייטקיסטים בדרכים, וברוכים הבאים להרצאה השלישית על קפקא. בהרצאה הקודמת הכרנו את הישויות במערכת – הפרודוסר, הקונסיומר, הברוקר והזוקיפר. היום אנחנו הולכים להעמיק בתוך הישות שנקראת Topic (טופיק) ולהבין איך היא בנויה מבפנים.

כפי שציינו, טופיק הוא מעין תיבת דואר שאליה הפרודוסרים שולחים הודעות והקונסיומרים קוראים מהן. אבל כדי שקפקא תוכל לעמוד בעומסים אדירים, היא לא שומרת את כל הטופיק כיחידה אחת על ברוקר בודד. היא משתמשת במושג שנקרא Partition (פרטישן).

פרטישן הוא למעשה פיצול של הטופיק ליחידות קטנות יותר. כשמייצרים טופיק, אנחנו מגדירים לכמה פרטישנים אנחנו רוצים לחלק אותו. זה מאפשר לנו Parallelism (מקביליות) – אם יש לי טופיק עם כמה פרטישנים, אני יכול להפיץ אותם בין ברוקרים שונים בקלאסטר. בצורה הזאת, כמה ברוקרים יכולים לטפל באותו טופיק בו-זמנית, מה שמגדיל משמעותית את קצב העבודה של המערכת.

בתוך כל פרטישן, ההודעות נשמרות במבנה שנקרא Commit Log. זהו מבנה נתונים שבו הודעות חדשות תמיד מתווספות לסוף (Append only). אי אפשר לשנות הודעה שכבר נכתבה ואי אפשר למחוק הודעה בודדת באמצע. הן נמחקות רק לפי מדיניות שמירה שנלמד בהמשך.

לכל הודעה שנכנסת לפרטישן ניתן מספר סידורי עולה שנקרא Offset (אופסט). ההודעה הראשונה בפרטישן תקבל אופסט 0, הבאה 1, וכן הלאה. חשוב מאוד להבין שהאופסט הוא ייחודי אך ורק בתוך הפרטישן הספציפי. הודעה בפרטישן 0 יכולה לקבל אופסט 5, ובאותו זמן תהיה הודעה אחרת לגמרי בפרטישן 1 שגם לה יש אופסט 5. כדי לזהות הודעה בצורה חד-ערכית בקפקא, אנחנו חייבים לדעת שלושה דברים: שם הטופיק, מספר הפרטישן ומספר האופסט.

האופסט הוא קריטי עבור הקונסיומר. כשהקונסיומר קורא הודעות, הוא שומר לעצמו את המקום שבו הוא עצר, את ה-Current Offset שלו. אם הוא יקרוס ויעלה מחדש, הוא יפנה לקפקא ויגיד מאיזה אופסט הוא רוצה להמשיך לקרוא: "אני הייתי באופסט 10, תביא לי בבקשה את הודעה 11". המנגנון הזה מאפשר לקונסיומרים להיות Stateless מבחינת קפקא – האחריות לדעת איפה הם אוחזים היא עליהם.

נושא חשוב נוסף הוא סדר ההודעות (Ordering). קפקא מבטיחה סדר הודעות רק בתוך פרטישן ספציפי. אם שלחתם הודעה א' והודעה ב' לאותו פרטישן, א' תמיד תיקרא לפני ב'. אבל, אם א' הלכה לפרטישן 0 וב' הלכה לפרטישן 1, אין שום הבטחה מי מהן תיקרא קודם. לכן, אם הסדר של ההודעות קריטי ללוגיקה שלכם, אתם חייבים לוודא שהן מגיעות לאותו פרטישן.

בפרק הבא נלמד איך הפרודוסר מחליט לאיזה פרטישן לשלוח את המידע ואיך משתמשים ב-Keys. נתראה בהרצאה הבאה!