На додаток до дуже корисної прийнятої відповіді, я хотів би додати ще кілька деталей
Розбиття
За замовчуванням Kafka використовує ключ повідомлення, щоб вибрати розділ теми, до якої він пише. Це робиться приблизно так
hash(key) % number_of_partitions
Якщо не вказано жодного ключа, тоді Кафка розподілить дані випадковим чином, круглим способом.
Замовлення
Як зазначено у даній відповіді, Кафка має гарантії щодо упорядкування повідомлень лише на рівні розділів.
Скажімо, ви хочете зберігати фінансові операції для своїх клієнтів у темі Кафки з двома розділами. Повідомлення можуть виглядати так (ключ: значення)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Оскільки ми не визначили ключ, два розділи, мабуть, будуть виглядати
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Ваш споживач, прочитавши цю тему, може в кінцевому підсумку повідомити вам, що залишок на рахунку в конкретний момент становить 600, хоча цього ніколи не було! Просто тому, що він читав усі повідомлення в розділі 0 до повідомлень у розділі 1.
За допомогою розумного ключа (наприклад customerId) цього можна уникнути, оскільки розділення буде таким:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Ущільнення колоди
Без ключа як частина ваших повідомлень, ви не зможете встановити конфігурацію теми cleanup.policy
в compacted
. Відповідно до документації "ущільнення журналу гарантує, що Kafka завжди зберігатиме принаймні останнє відоме значення для кожного ключа повідомлення в журналі даних для одного розділу теми.".
Цей приємний та корисний параметр буде недоступний без жодної клавіші.
Використання ключів
У реальних випадках використання ключа Кафки може мати величезний вплив на вашу ефективність та чіткість вашої ділової логіки.
Наприклад, ключ можна використовувати, природно, для розділення даних. Оскільки ви можете контролювати своїх споживачів читати з певних розділів, це може служити ефективним фільтром. Крім того, ключ може включати деякі метадані про фактичну вартість повідомлення, що допомагає контролювати подальшу обробку. Ключі зазвичай менші за значення, і тому зручніше аналізувати ключ замість цілого значення. У той же час ви можете застосувати всі серіалізації та реєстрацію схеми, як це зроблено зі своїм значенням, також за допомогою ключа.
Як примітка, існує також концепція заголовка, яка може використовуватися для зберігання інформації, див. Документацію .