Перейти до основного вмісту

Стратегії ребалансування в Kafka

Стратегії ребалансування в Kafka

Ребалансування (Rebalancing) — це процес перерозподілу партицій між споживачами (сonsumer) у групі (Consumer Group). Kafka має кілька стратегій ребалансування:

  1. RangeAssignor. Ця стратегія розподіляє партиції на основі діапазонів, які створюються відповідно до сортування топіків і партицій. Наприклад, якщо є два консюмери і 6 партицій (P0–P5), перший консюмер отримає P0–P2, а другий — P3–P5.
    Особливості:
    • Простий алгоритм.
    • Може призводити до нерівномірного розподілу, якщо кількість партицій не ділиться порівну між консюмерами.
  2. RoundRobinAssignor. Ця стратегія рівномірно розподіляє партиції між консюмерами за круговим принципом. Наприклад, якщо є два консюмери і 6 партицій, перший отримає P0, P2, P4, а другий — P1, P3, P5.
    Особливості:
    • Гарантує більш рівномірний розподіл партицій.
    • Використовується в багатотопікових сценаріях.
  3. StickyAssignor. Ця стратегія намагається мінімізувати кількість змін у розподілі партицій між консюмерами при ребалансуванні. Партиції залишаються закріпленими за консюмерами, якщо це можливо.
    Особливості:
    • Мінімізує вплив ребалансування на продуктивність.
    • Використовується в сценаріях, де стабільність розподілу є критично важливою.
  4. Cooperative Sticky Assignor. Поліпшена версія StickyAssignor, виконується поступове (кооперативне) перерозподілення партицій між консюмерами.
    Особливості:
    • Зменшує час простою під час ребалансування.
    • Рекомендується для високонавантажених систем.
Вибір стратегії

Стратегія вибирається за допомогою параметра partition.assignment.strategy у конфігурації споживача.

Значення може бути одним із наведених:

  • org.apache.kafka.clients.consumer.RangeAssignor
  • org.apache.kafka.clients.consumer.RoundRobinAssignor
  • org.apache.kafka.clients.consumer.StickyAssignor
  • org.apache.kafka.clients.consumer.CooperativeStickyAssignor

Sticky Partitioner

Sticky Partitioner в Apache Kafka – це механізм, який забезпечує більш ефективний розподіл повідомлень між партиціями. Sticky Partitioner дозволяє уникнути частої зміни партицій, зменшуючи кількість перенаправлень, що підвищує продуктивність.

Основна ідея Sticky Partitioner

Замість того, щоб визначати партицію для кожного повідомлення окремо (наприклад, на основі ключа), Sticky Partitioner закріплює продюсера за однією партицією на деякий час. Повідомлення записуються в одну партицію, поки не буде досягнуто певного розміру пакета або часу очікування (batch size або linger.ms). Після цього продюсер переходить до іншої партиції.

Алгоритм:

  1. Sticky Partitioner вибирає партицію для першого повідомлення в новому пакеті (batch).
  2. Усі наступні повідомлення надходять до тієї ж партиції, доки не буде заповнено пакет або не спливе час очікування.
  3. Коли пакет відправлено, партиція змінюється, і процес повторюється.
Налаштування Sticky Partitioner:

Sticky Partitioner налаштовується через властивості продюсера, зокрема:

  • batch.size – максимальний розмір пакета (в байтах). За замовчуванням: 16384 (16 KB).
  • linger.ms – максимальний час очікування перед відправкою пакета. За замовчуванням: 0 (відправка негайно).
  • max.request.size – максимальний розмір одного повідомлення чи пакета.

Sticky Partitioner та стратегії ребалансування працюють на різних рівнях Kafka, але вони взаємопов'язані через механізм розподілу навантаження між партиціями та споживачами.

Sticky Partitioner оптимізує роботу продюсера, відправляючи повідомлення батчами в одну партицію.

Стратегії ребалансування оптимізують роботу споживачів, розподіляючи партиції рівномірно.

Коментарі

Популярні публікації

Шпаргалка по базових командах PostgreSQL

1. Підключення до PostgreSQL через командний рядок: psql -h <host> -p <port> -U <username> -d <database> 2. Підключення до бази без параметрів (якщо користувач і база мають однакове ім’я): psql 3. Показати список усіх баз даних: \l 4. Підключитися до іншої бази даних: \c <database_name> 5. Показати список таблиць у поточній базі: \dt 6. Показати всі об'єкти (таблиці, індекси, секвенції): \d 7. Показати таблиці з усіх схем: \dt *.* 8. Переглянути структуру конкретної таблиці: \d <table_name> 9. Виконати SQL-запит (приклад): SELECT * FROM users; 10. Вийти з psql: \q 11. Створити нову базу даних: CREATE DATABASE mydb; 12. Створити нову таблицю: CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE ); 13. Додати новий запис: INSERT INTO users (name, email) VALUES ('Іван', 'ivan@example.com'); 14. Оновити дані в таблиці: UPDATE users SET name = 'Петро' WH...

Основи GLSL

Що таке GLSL? GLSL (OpenGL Shading Language) – мова програмування шейдерів для OpenGL. Використовується для написання vertex, fragment, geometry та інших шейдерів, що працюють на GPU. Оголошення версії #version 330 core Вказує версію GLSL. Наприклад, 330 core відповідає OpenGL 3.3. Вхідні та вихідні змінні layout(location=0) in vec3 aPos; layout(location=1) in vec3 aNormal; out vec3 FragPos; in – вхідні атрибути (vertex shader). out – вихідні змінні (vertex shader) або фінальний колір (fragment shader). Основні типи даних float, int, bool vec2, vec3, vec4 mat2, mat3, mat4 sampler2D (текстури) Тип Опис Приклади використання vec2 Двокомпонентний вектор з типом float. - Текстурні координати (UV) - 2D позиції - Швидкість у 2D vec3 Трикомпонентний вектор з типом float. - Координати позицій у 3D - Нормалі - Колір у форматі RGB vec4 Чотирикомпо...

Атоми в мові програмування Elixir

Атоми в Elixir Атоми є фундаментальною концепцією в Elixir , що відіграє ключову роль у створенні надійних та масштабованих систем. В Elixir це специфічний тип даних, який є константою , незмінною , ідентифікованою за своїм ім'ям . Отже, атом в Elixir — це іменована константа, що представляє себе. Уявіть, що ви даєте унікальне ім'я певній речі, і це ім'я завжди посилається саме на цю річ, і ніколи на щось інше. Наприклад, атом :ok завжди буде означати саме успішне завершення операції, а не якесь інше значення. Технічно, атоми є похідними від чисел . Кожен унікальний атом зберігається у таблиці атомів, і йому присвоюється унікальний цілочисельний ідентифікатор. Це робить їх надзвичайно ефективними для порівняння: замість порівняння рядків (що є повільною операцією), Elixir порівнює цілочисельні ідентифікатори. Переваги та особливості використання атомів Переваги атомів: Ефективність. Завдяки своєму числовому представленню, порівняння атомів є дуже швидким. Це осо...

Встановлення PostgreSQL на Ubuntu-сервер

Встановлення Оновлюємо пакети та встановлюємо PostgreSQL: sudo apt update sudo apt install -y postgresql postgresql-contrib Перевіряємо статус сервісу: sudo systemctl status postgresql Якщо PostgreSQL не запущений, запустимо його: sudo systemctl start postgresql sudo systemctl enable postgresql Налаштування безпеки Зміна пароля: sudo -u postgres psql У консолі PostgreSQL: ALTER USER postgres PASSWORD 'міцний_пароль'; \q \q - вихід з консолі. Список основних команд для роботи з PostgreSQL можна переглянути за посиланням. За замовчуванням PostgreSQL слухає localhost (127.0.0.1). Щоб дозволити доступ із зовнішніх машин, редагуємо конфігурацію: sudo nano /etc/postgresql/17/main/postgresql.conf (замість 17 вкажи версію PostgreSQL, яку встановлено) Шукаємо рядок: #listen_addresses = 'localhost' та замінюємо на listen_addresses = '*' Зберігаємо (Ctrl + X, Y, Enter). Тепер редагуємо pg_hba.conf: sudo nano /etc/postgresql/17/main/pg_hba.conf...

Прості типи даних в Elixir

Мова Elixir має низку простих (примітивних) типів даних, які часто використовуються в повсякденному програмуванні. Числа Elixir підтримує цілі (integer) та дійсні числа (float). # Цілі числа a = 42 b = -7 # Дійсні числа c = 3.14 d = -0.001 Булеві значення Elixir має два булевих значення: true та false . x = true y = false z = x and y # false Атоми Атоми — це константи з іменем, що починається з двокрапки. Вони широко використовуються, наприклад, для імен параметрів або станів. :ok :error :running :elixir_is_fun Рядки Рядки в Elixir — це двійкові дані з кодуванням UTF-8, оголошуються в подвійних лапках. name = "Pavlo" greeting = "Привіт, #{name}!" Nil Nil — це спеціальне значення, що позначає "відсутність значення". value = nil is_nil(value) # true Бінарні дані та байти Бінарні дані оголошуються в подвійних лапках або як бінарні літерали. string = "Привіт" # це рядок, але також бінарні дані binary = ...