Как изменить логику секционирования в работающей системе - PullRequest
2 голосов
/ 06 июня 2019

В развертывании Kafka пользовательская логика разделителя тем используется для маршрутизации всех сообщений, принадлежащих одному корневому объекту (например, всех сообщений для определенного пользователя), в один и тот же раздел.

Кто-нибудь может порекомендовать стратегию того, как бороться с изменением логики разбиения в такой работающей системе?

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

В обоих случаях мы окажемся в ситуации, когда некоторые сообщения для пользователя A, которые поступили в Kafka до изменения,будет в разделе 1, в то время как после изменения логики разделения или количества сообщений раздела для того же пользователя A будет идти раздел 2.

Это может привести к проблеме, когда сообщения для пользователя A обрабатываются внепорядок.Потребитель, читающий сообщения из раздела 2, может обработать сообщения раньше, чем потребитель, который читает сообщения из раздела 1.

Кто-нибудь сталкивался с этой проблемой в действующей системе?Как вы решали или решили бы эту проблему?

Кажется, это очень распространенный сценарий, но я не смог найти в нем ничего.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 июня 2019

По логике разбиения, если вы имели в виду алгоритм разбиения, я не понимаю, как это могло бы так измениться.Что касается увеличения разделов, то теоретически невозможно добиться увеличения разделов, гарантируя порядок сообщений.- для этого есть KIP , но его статус все еще "обсуждается".

Что я обычно делаю, когда увеличиваю разделы, так это допускаю небольшое время простоя.

Книга воспроизведения выглядит следующим образом:

  1. Остановка производителя

  2. Контроль отставания для группы потребителей

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

  4. Увеличьте количество перегородок

  5. Запустите потребителей

  6. Запустить производителей

Таким образом, вы можете быть уверены, что сообщения не будут потеряны и не будут обработаны сообщения не по порядку.

Есливы хотите избежать простоя, вам, возможно, придется полагаться на внешнюю систему, которая может временно хранить данные для каждого раздела в порядке и публиковать, но это решение зависит от нескольких вещей

0 голосов
/ 06 июня 2019

Лучший способ изменить порядок разбиения записей - использовать разделитель Apache Kafka® по умолчанию и изменить ключи записи.Если все записи пользователя должны идти в одну и ту же тему, убедитесь, что все они имеют одинаковый ключ.

Если вы хотите изменить ключи для всего набора, вы можете использовать KSQL для повторного ввода (повторной публикации в новом разделе с новыми ключами) данных с помощью функции PARTITION BY.

...