2017-02-07 2 views
0

Количество пропущенных сообщений невелико, но существует необходимость в строгом упорядочении сообщений на сущности. Например, у нас может быть миллион сообщений, но на 200 тыс. Объектов. Если сообщение для сущности терпит неудачу, последующие сообщения не должны потребляться, но могут быть использованы сообщения для других объектов.Порядок размещения сообщений и альтернативы kafka

С Kafka мы получаем заказ на раздел с ограничением на то, что если сообщение в разделе не будет потреблено, все последующие сообщения будут заблокированы, даже если они принадлежат другому объекту. Мы можем увеличить количество разделов, но это ограничение.

Каковы общие шаблоны для решения этих проблем?

+0

Вы все еще можете «использовать» и игнорировать сообщение, если хотите его пропустить - для последующей обработки. Если вы измените свое решение, вы можете запомнить смещение сообщения, а затем '#seek()' для этого смещения, чтобы обработать сообщение позже. –

+0

Как сказал @ MatthiasJ.Sax - вы действительно можете пропустить проблемное сообщение, когда вам нужно. Следовательно, это ложное предположение, что «все последующие сообщения будут заблокированы».Возможно, вам нужно обновить свой вопрос несколькими подробностями, например, что вы добавили в свой комментарий ниже? –

+0

Извинения за недопущение информации. Поскольку для объекта требуется упорядочение, если я удаляю сообщение, последующие сообщения для этих объектов также должны быть отклонены. Поскольку @ ossu54 предложил мне отслеживать сущности, имеющие проблемы, и каждый раз, когда я использую сообщение, я могу проверить этот список и принять решение о его обработке или нет. См. Мои проблемы с этим в комментарии к ответу ossu5 Проясняет ли он miguno и Matthias J. Sax – anfab

ответ

1

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

Самый простой способ (на мой взгляд) сделать это - указать раздел на стороне производителя.

new ProducerRecord(topicName, partitionId,messageKey,message) 

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

Продолжая свой пример, предположим, что у вас есть some_topic с миллионами сообщений и 200 тыс. Сущностей, у вас может быть потребитель с высокой пропускной способностью, который потребляет все и производит для some_topic_2, так что сообщение для определенного объекта всегда создается для того же раздел.

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

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

Соответствующие Блогпост: http://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html

Дополнительные мысли:

Другой способ сделать это, если вы используете по крайней мере Кафка 0,10 должны использовать Кафку Streams (http://kafka.apache.org/documentation/streams).

[...] возможность сохранять состояние открывает множество возможностей для сложных приложений для обработки потоков: вы можете присоединяться к входным потокам или группировать и собирать записи данных.

К сожалению, я не работал с API Kafka Streams, но не могу указать подход.

Надеюсь, другие ответчики могут предоставить дополнительную информацию.

+0

Спасибо, я думаю, у меня немного другой вопрос. В пользователе для some_topic_2 мне нужно будет следить за тем, какие объекты нужно игнорировать, чтобы я мог перейти к другим объектам, которые не связаны друг с другом, но находятся в одном разделе. Этим я должен был бы где-то хранить и проверять его для каждого объекта, добавляющего накладные расходы. Скажем, если бы я создал миллион разделов, то у меня не было бы этой проблемы, но количество разделов ограничено. Я могу использовать отсортированный набор в redis для каждого объекта, чтобы сбой одного объекта не влиял на других. Считаете ли вы, что это подход к рассмотрению? – anfab

Смежные вопросы