הגדרת נושאים ומחיצות ב-Kafka: מדריך כוונון

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

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
הגדרת נושאים ומחיצות ב-Kafka: מדריך כוונון
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

מדריך כוונון תצורת נושאים ומחיצות ב-Kafka

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

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

מדוע תצורת מחיצות נכונה חשובה

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

דוגמה: נושא user-events עם 6 מחיצות. אירועים ממשתמש יחיד (user:101) יכולים להגיע למחיצות שונות (0 ו-1), ולשבור את סדר העיבוד. מפתח הודעה פותר זאת: hash(user_id) % num_partitions תמיד מניב את אותה מחיצה.

מידע נוסף על בחירת מספר מחיצות כלל מעשי: `num_partitions = max(throughput_target / throughput_per_partition, num_consumers_target)`. תפוקה טיפוסית למחיצה: 10–50 MB/s לכתיבה (תלוי בחומרה ובתצורת הברוקר). דוגמה: צריך להתמודד עם 200 MB/s עם שיאים עד 400 MB/s ולשמור על יכולת קנה מידה ל-20 צרכנים → קחו 24 מחיצות (כפולה של 6, 8, 12 לקנה מידה קל). יותר מדי מחיצות זה גם רע: כל מחיצה דורשת תיאורי קבצים, זיכרון חיץ, ומכבידה על הבקר במהלך בחירות מנהיג.

כיצד ליצור ולהגדיר נושאים

באמצעות kafka-topics.sh

# Базовый топик для событий пользователей
kafka-topics.sh --bootstrap-server kafka-1:9092 \
  --create \
  --topic user-events \
  --partitions 12 \
  --replication-factor 3 \
  --config retention.ms=604800000 \
  --config retention.bytes=10737418240 \
  --config compression.type=lz4 \
  --config min.insync.replicas=2 \
  --config message.max.bytes=1048576

# Компактный топик — для хранения последнего состояния по ключу
kafka-topics.sh --bootstrap-server kafka-1:9092 \
  --create \
  --topic user-profiles \
  --partitions 24 \
  --replication-factor 3 \
  --config cleanup.policy=compact \
  --config min.cleanable.dirty.ratio=0.1 \
  --config segment.ms=3600000 \
  --config delete.retention.ms=86400000

# Высокоприоритетная очередь с коротким retention
kafka-topics.sh --bootstrap-server kafka-1:9092 \
  --create \
  --topic order-processing-priority \
  --partitions 6 \
  --replication-factor 3 \
  --config retention.ms=3600000 \
  --config max.message.bytes=102400

ניהול פרוגרמטי באמצעות Admin API (Java/Kotlin) יצירת נושאים פרוגרמטית אידיאלית עבור יישומים שיוצרים נושאים דינמית:

Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-1:9092,kafka-2:9092,kafka-3:9092");
props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 5000);
props.put(AdminClientConfig.DEFAULT_API_TIMEOUT_MS_CONFIG, 10000);
try (AdminClient admin = AdminClient.create(props)) {
    NewTopic userEvents = new NewTopic("user-events", 12, (short) 3);
    userEvents.configs(Map.of(
        "retention.ms", "604800000",
        "compression.type", "lz4",
        "min.insync.replicas", "2"
    ));
    NewTopic deadLetter = new NewTopic("user-events-dlq", 3, (short) 3);
    deadLetter.configs(Map.of(
        "retention.ms", "2592000000", // 30 дней
        "retention.bytes", "-1"
    ));
    CreateTopicsResult result = admin.createTopics(List.of(userEvents, deadLetter));
    result.all().get(30, TimeUnit.SECONDS);
}

שינוי תצורה של נושא קיים

# Увеличиваем retention
kafka-configs.sh --bootstrap-server kafka-1:9092 \
  --alter \
  --entity-type topics \
  --entity-name user-events \
  --add-config retention.ms=1209600000

# Добавляем партиции (только увеличение!)
kafka-topics.sh --bootstrap-server kafka-1:9092 \
  --alter \
  --topic user-events \
  --partitions 24

# Внимание: добавление партиций нарушает порядок для ключевых сообщений.
# Существующие ключи пойдут в те же партиции (hash % 12),
# новые ключи будут распределяться по 24 партициям.

# Просмотр конфигурации топика
kafka-configs.sh --bootstrap-server kafka-1:9092 \
  --describe \
  --entity-type topics \
  --entity-name user-events

ניהול מנהיגים והפחתת הטיה

חלוקה לא אחידה של מנהיגים בין ברוקרים מובילה לנקודות חמות:

# Проверяем распределение лидеров
kafka-topics.sh --bootstrap-server kafka-1:9092 \
  --describe --topic user-events

# Предпочтительные реплики — перебалансировка лидеров
kafka-leader-election.sh --bootstrap-server kafka-1:9092 \
  --election-type preferred \
  --all-topic-partitions

# Или для конкретного топика через JSON
cat > election.json << 'EOF'
{
  "partitions": [
    {"topic": "user-events", "partition": 0},
    {"topic": "user-events", "partition": 1}
  ]
}
EOF
kafka-leader-election.sh --bootstrap-server kafka-1:9092 \
  --election-type preferred \
  --path-to-json-file election.json

אם עיכוב הצרכנים משתנה משמעותית בין מחיצות, בדקו את המפתחות: פונקציית גיבוב גרועה גורמת להטיה. פתרון: הגדילו את מספר המחיצות והשתמשו ב-# Базовый топик для событий пользователей kafka-topics.sh --bootstrap-server kafka-1:9092 \ --create \ --topic user-events \ --partitions 12 \ --replication-factor 3 \ --config retention.ms=604800000 \ --config retention.bytes=10737418240 \ --config compression.type=lz4 \ --config min.insync.replicas=2 \ --config message.max.bytes=1048576 # Компактный топик — для хранения последнего состояния по ключу kafka-topics.sh --bootstrap-server kafka-1:9092 \ --create \ --topic user-profiles \ --partitions 24 \ --replication-factor 3 \ --config cleanup.policy=compact \ --config min.cleanable.dirty.ratio=0.1 \ --config segment.ms=3600000 \ --config delete.retention.ms=86400000 # Высокоприоритетная очередь с коротким retention kafka-topics.sh --bootstrap-server kafka-1:9092 \ --create \ --topic order-processing-priority \ --partitions 6 \ --replication-factor 3 \ --config retention.ms=3600000 \ --config max.message.bytes=102400 (זמין מ-Kafka 2.4+). חלופה: עברו ל-Properties props = new Properties(); props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-1:9092,kafka-2:9092,kafka-3:9092"); props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 5000); props.put(AdminClientConfig.DEFAULT_API_TIMEOUT_MS_CONFIG, 10000); try (AdminClient admin = AdminClient.create(props)) { NewTopic userEvents = new NewTopic("user-events", 12, (short) 3); userEvents.configs(Map.of( "retention.ms", "604800000", "compression.type", "lz4", "min.insync.replicas", "2" )); NewTopic deadLetter = new NewTopic("user-events-dlq", 3, (short) 3); deadLetter.configs(Map.of( "retention.ms", "2592000000", // 30 дней "retention.bytes", "-1" )); CreateTopicsResult result = admin.createTopics(List.of(userEvents, deadLetter)); result.all().get(30, TimeUnit.SECONDS); } עבור רישום. נטר את המחיצות באמצעות # Увеличиваем retention kafka-configs.sh --bootstrap-server kafka-1:9092 \ --alter \ --entity-type topics \ --entity-name user-events \ --add-config retention.ms=1209600000 # Добавляем партиции (только увеличение!) kafka-topics.sh --bootstrap-server kafka-1:9092 \ --alter \ --topic user-events \ --partitions 24 # Внимание: добавление партиций нарушает порядок для ключевых сообщений. # Существующие ключи пойдут в те же партиции (hash % 12), # новые ключи будут распределяться по 24 партициям. # Просмотр конфигурации топика kafka-configs.sh --bootstrap-server kafka-1:9092 \ --describe \ --entity-type topics \ --entity-name user-events :

# Consumer lag — отставание группы
kafka-consumer-groups.sh --bootstrap-server kafka-1:9092 \
  --describe --group my-consumer-group
# Суммарный lag > 10000 для критичных топиков — повод для алерта

תצורות טיפוסיות לפי סוג נתונים

סוג נושא מחיצות שכפול ניקוי שמירה
עסקאות 12–24 3 (min.isr=2) מחיקה 7–30 ימים
יומני ביקורת 6–12 3 (min.isr=2) מחיקה 90–365 ימים
פרופילים (CDC) 24–48 3 דחיסה ללא הגבלה
מדדים 12 2 מחיקה 24–48 שעות
התראות 6 3 מחיקה 1–3 ימים

השוואה: Kafka לעומת RabbitMQ עבור זרמי נתונים

Apache Kafka טוב יותר מ-RabbitMQ פי 3–5 בתפוקה בעומס גבוה (מאות MB/s). RabbitMQ מנצח בניתוב גמיש (exchanges) ותמיכה בתורים עם עדיפויות שונות. עבור event sourcing ו-CDC, Kafka הוא התקן דה-פקטו; עבור מיקרוסרביסים עם ניתוב מורכב, RabbitMQ עשוי להיות נוח יותר.

התהליך שלנו וציר הזמן

עם ניסיון של למעלה מ-10 שנים ו-40+ פריסות Kafka מוצלחות, הלקוחות שלנו חוסכים בממוצע $30,000 בשנה על ידי אופטימיזציה של נושאי Kafka. הגישה שלנו היא:

  • ניתוח דרישות: הערכת תפוקה, מספר צרכנים, צורכי סדר, שמירה. תכנון סכמת נושא. משך: יום אחד.
  • יצירת נושא: הגדרת מחיצות, שכפול, דחיסה. הגדרת ACLs אם נדרש אימות. משך: 1–2 ימים.
  • ניטור: הגדרת התראות על עיכוב צרכנים, תיעוד סכמה לצוות. משך: יום אחד.

אנו מציעים תצורה סוהר: מתכנון ועד תיעוד. אנו יכולים להעריך את הפרויקט שלכם ביום אחד — צרו קשר.

מה כלול?

  • תיעוד ארכיטקטוני: סכמת נושא, מפתחות, שמירה.
  • תצורת ברוקר ונושא.
  • הגדרת ניטור והתראות.
  • הדרכת צוות (2–4 שעות).
  • חודש אחד של תמיכה לאחר העלייה לאוויר.

ציר זמן

שלב משך
ניתוח דרישות ותכנון יום אחד
יצירת נושא והגדרת ACL 1–2 ימים
ניטור ותיעוד יום אחד

תצורת מחיצות נכונה מפחיתה את זמן האחזור ב-30% בהשוואה לתצורות לא אופטימליות (בהתבסס על הנתונים שלנו). קבלו ייעוץ לפרויקט שלכם — פנו אלינו.

למדו עוד על Apache Kafka ב-ויקיפדיה.