Мы столкнулись с некоторыми проблемами и разным пониманием между командой разработчиков и командой поддержки среды в отношении rest-прокси Kafka с конфлюэнтной платформы.
Прежде всего, у нас есть среда 5 брокеров Kafka , с 64 разделами и с коэффициентом репликации 3 .
Случается, что все наши вызовы rest-proxy сейчас используют следующую структуру:
curl -X POST \
http://somehost:8082/topics/test \
-H 'content-type: application/vnd.kafka.avro.v1+json' \
-d '{
"value_schema_id":1,
"records":[
{ "foo":"bar" }]}'
Этот тип вызова работает для 98,4% вызовов, и я заметил, что когда я пытаюсь сделать этот вызов более 2 000 раз, мы не получаем никакого ответа OK из раздела 62 (в точности 1,6% перегородок).
Раньше этот коэффициент ошибок составлял 10,9% , когда у нас было 7 разделов, возвращавших ошибки прямо перед тем, как служба поддержки рециркулировала схему-реестр.
Теперь, когда вызов переходит на раздел 62, мы получаем следующий ответ:
{
"offsets": [
{
"partition": null,
"offset": null,
"error_code": 50003,
"error": "This server is not the leader for that topic-partition."
}
],
"key_schema_id": null,
"value_schema_id": 1
}
Ошибка такая же, когда я пытаюсь отправить сообщения на определенный раздел, добавив "/ partitions / 62" в URL.
Служба поддержки говорит, что rest-proxy недостаточно умен ( «это просто прокси» *, говорят, 1026 *), чтобы выбрать правильный раздел и опубликовать его в ведущем брокере этого раздела.
Они сказали, что он случайным образом выбирает раздел, а затем случайным образом выбирает посредника для публикации (что может привести к публикации на репликах или даже посредникам, у которых нет раздела).
Они рекомендовали нам изменить наши вызовы, чтобы получить метаданные темы, прежде чем публиковать сообщения, а затем сообщить об этом разделу и посреднику и обработать циклическое назначение на стороне приложения, что для меня не имеет смысла.
Что касается разработки, то я понимаю, что rest-proxy использует apache kafka-client для отправки сообщений посредникам и, таким образом, достаточно умен, чтобы отправлять сообщения ведущему посреднику в данный раздел, а также обрабатывает Робин внутри библиотеки kafka-client, когда раздел не сообщается.
Мне кажется, что проблема среды связана с этим разделом, а не с самим приложением вызова (так как оно работает без проблем в других средах с такой же конфигурацией).
Подводя итог, мои вопросы:
- Правильно ли я говорю, что rest-proxy достаточно умен, чтобы обрабатывать циклический перебор раздела и отправлять сообщения лидеру?
- Должно ли приложение обрабатывать логику в вопросе 1? (Я не вижу причины для использования rest-proxy вместо kafka-client напрямую в этом случае)
- Вам это тоже кажется проблемой в оркестровке среды?
Надеюсь, вам стало ясно, что вы мне поможете!
Заранее спасибо!