Как добиться порядка вставки из многопоточности производителя Kafka - PullRequest
0 голосов
/ 15 января 2019

У меня есть Ingres DB с таблицей истории, которая регистрирует события БД, такие как обновление и удаление вставки У меня есть продюсер, который будет многопоточным. Этот производитель будет читать таблицу истории, чтобы найти, какую таблицу и какую строку выбрать, а затем к этой строке будет добавлена ​​тема Кафки. Теперь продюсер должен убедиться, что события добавляются в тему Kafka так же, как вошла таблица History. Таким образом, потребитель читает их в том же порядке, в каком он зарегистрирован в таблице History, и выполняет их в Postgrace DB.

Я могу выдавать эти данные нескольким производителям. Пример

Producer1 has message 1 to 5
producer2 has message 6 to 10
producer3 has message 11 to 15

Но когда я потребляю, я получаю сообщения на тему, подобную

messageId 1
messageId 2
messageId 3
messageId 6
messageId 7
messageId 11

и т. Д.

Я хочу получить все сообщения в следующем порядке

messageId 1
messageId 2
messageId 3
messageId 4
messageId 5
messageId 6
messageId 7
messageId 8
messageId 9

и т. Д.

ПРИМЕЧАНИЕ: - У меня есть 1 тема и 1 раздел и 1 потребитель

Ответы [ 3 ]

0 голосов
/ 16 января 2019

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

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

0 голосов
/ 16 января 2019

За Рекомендация Google , если вы используете синхронного издателя (производителя) и одного подписчика, следуйте алгоритму в коде Node JS в во второй половине страницы , чтобы гарантировать порядок обработки.

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

Лучшее решение - следовать разделу

Порядок в конечном результате имеет значение

Типичные случаи использования: журналы, обновления состояния

многопоточные издатели должны прикреплять отметку времени к каждому сообщению о событии pub / sub, чтобы подписчики могли сохранять сообщения о событиях в Google Cloud Datastore или Firestore как объекты. Отдельное задание cron обработчика сообщений о событиях может извлекать объекты сообщений о событиях в отсортированном по времени метке для обеспечения порядка сообщений.

0 голосов
/ 15 января 2019

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

Если вам нужно гарантировать порядок вставки и потребления, вам нужно настроить тему Kafka на использование только 1 раздела. Это единственный способ гарантировать порядок в Кафке. Тем не менее, вы потеряете много преимуществ kafka, а именно высокую производительность, распределенную по нескольким серверам, ядрам и т. Д.

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