События и очереди

4 мин чтения

Partitioning: как обрабатывать события параллельно и не потерять нужный порядок

Одна очередь сохраняет простой порядок, но быстро становится ограничением. Partitioning даёт параллелизм — и одновременно заставляет решить, какие события действительно должны оставаться последовательными.

Какую проблему мы решаем

При росте потока один потребитель или одна последовательная очередь ограничивают throughput. Естественное решение — обрабатывать больше сообщений одновременно. Но параллелизм разрушает глобальный порядок: два связанных события могут завершиться в обратной последовательности. Для части процессов это безразлично, для части — ломает бизнес-смысл.

Как работает решение

Partitioning делит поток на независимые части. События с одинаковым ключом попадают в одну partition и обрабатываются последовательно, а разные partitions идут параллельно. Ключ становится главным архитектурным решением: это может быть сущность, клиент или агрегат, внутри которого порядок реально важен. Хороший ключ сохраняет нужную последовательность и равномерно распределяет нагрузку; плохой создаёт hot partition.

Что получает бизнес

Бизнес получает масштабирование без необходимости покупать глобальный порядок для всех операций. Система может расти по объёму, сохраняя корректность только там, где она нужна. Выбор ключа напрямую влияет и на эффективность использования инфраструктуры.

Что получает команда

Команда получает явную модель порядка и конкуренции вместо абстрактного требования «всё должно идти по очереди». Нужно мониторить lag по partitions, перекос нагрузки, rebalance и поведение потребителей при изменении числа partitions.

Что получает клиент

Клиент получает более быстрый сервис под нагрузкой, а связанные с ним операции сохраняют ожидаемую последовательность, если ключ выбран правильно.

Чем мы за это платим

Partitioning добавляет hot keys, rebalance, отдельный lag и ограничения на глобальные операции. Ошибка в ключе может быть дорогой для исправления, потому что распределение часто становится частью контракта данных.

Когда не нужно усложнять

Для небольшого потока одна очередь может быть проще. Partitioning нужен, когда последовательная обработка ограничивает масштаб или когда группы событий должны масштабироваться независимо.

Что стоит спросить перед решением

В итоге

Partitioning покупает параллелизм ценой отказа от ненужного глобального порядка. Для бизнеса хороший partition key означает масштабировать поток там, где можно, и сохранять последовательность там, где она влияет на результат.