Платформа обмена сообщениями с перегрузкой разделов QoS / Kafka - PullRequest
0 голосов
/ 23 мая 2018

У меня периодически возникает проблема с Kafka: я делю сообщения по идентификатору клиента, и иногда случается, что клиент получает огромное количество сообщений.В результате сообщения этого клиента и всех других клиентов в одном разделе задерживаются.

Существуют ли хорошо известные способы решения этой проблемы?Возможно, с другими платформами обмена сообщениями?

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

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

1 Ответ

0 голосов
/ 02 июня 2018

Я постараюсь ответить на основании ограниченной информации porovided.

Разделы Kafka - это наименьшая единица масштабируемости, поэтому, например, если у вас есть 10 параллельных потребителей (слушателей темы kafka), вы должны разделить свою темув противном случае некоторые из ваших слушателей будут делать ставку на голод, так как kafka управляет потребителями так, что только один потребитель будет получать сообщения от партии.Это необходимо для защиты раздела от порядка смешения сообщений.Поддерживается другой способ, поскольку потребители могут обрабатывать более одной партии за раз.

Мое дизайнерское решение будет состоять в том, чтобы решить, какую мощность вы планируете выделить для экземпляров потребителей (микросервисов)?Это число приведет вас к правильному количеству разделений.

Я бы не использовал динамическое число разделений, так как это плохо масштабируется.Используйте номер, который соответствует емкости, которую вы планируете выделить, и дополнительный запас на случай, если вам потребуется увеличить масштаб в будущем.Допустим, завтра у вас будет 5 новых клиентов, добавление разделов будет нелегким или мудрым.

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

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

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

Одно решение для проектирования очень многохэширования.Сопоставьте номер раздела, используя HASH из идентификатора клиента и ключа разделения.Опять же, определитесь с фиксированным номером раздела и позвольте HASH сопоставить идентификатор клиента с вашим ключом раздела.

с использованием X по модулю разделов

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

Y клиенты с низким уровнем трафика, для этих клиентов, например, используется другое значение по модулю Y / 5, поэтому5 клиентов, разделяющих тему.

убедитесь, что вы добавили номер раздела X к номеру раздела Y, чтобы не перекрывать друг друга.

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

...