Как правильно настроить Kafka Stream для обеспечения устойчивости брокеров? - PullRequest
0 голосов
/ 29 августа 2018

Недавно я попытался убедиться, что мое приложение Kafka Streams (версия 2.0.0) все еще будет работать (потоки будут возобновлены) после того, как какой-либо брокер Kafka начнет работать после неуказанного простоя всех брокеров (время простоя больше похоже на несколько часов, чем несколько секунд).

Он не подошел с конфигурацией по умолчанию (retries на 0), так как после того, как все брокеры были убиты, все мои потоки изменили состояние на ERROR или даже DEAD и перестали работать:

INFO  o.a.k.s.p.internals.StreamThread - stream-thread [MyStream-0936f6a6-c9f4-4591-9b25-534abc65b8d1-StreamThread-24] State transition from RUNNING to PENDING_SHUTDOWN

и затем:

INFO  o.a.k.s.p.internals.StreamThread - stream-thread [MyStream-0936f6a6-c9f4-4591-9b25-534abc65b8d1-StreamThread-24] State transition from PENDING_SHUTDOWN to DEAD

И некоторые из потоков перешли к ОШИБКЕ:

stream-client [MyStream-88a8fe9a-d565-43e3-acb5-20cccc6b4a88] State transition from RUNNING to ERROR

В результате, учитывая изменение состояния (https://static.javadoc.io/org.apache.kafka/kafka-streams/2.0.0/org/apache/kafka/streams/KafkaStreams.State.html) Я не могу возобновить работу каким-либо иным способом, кроме перезапуска приложения.

То, что я нашел, было этой темой: Kafka Streams прекращает прослушивание темы и обработку сообщений, когда брокер отключается

Он отвечает на мой вопрос советом по увеличению моих потоков retries, а также retry.backoff.ms config. Это то, что я сделал (увеличил retries до Int.MaxNumber и retry.backoff.ms до 1000) и обнаружил, что есть некоторые проблемы с производительностью при таком подходе, и я случайно получил повторяющуюся ошибку в журналах: FETCH_SESSION_ID_NOT_FOUND, которую я не могу найти информацию о.

Существуют ли другие способы достижения устойчивости брокеров, кроме увеличения числа повторных попыток? Я могу принять некоторые сообщения, потерянные после сбоя Kafka Brokers, и мне не нужно повторять попытку, если сообщение не может быть создано / использовано. Я думал о ручном перезапуске потока после сбоя брокера, но я не совсем уверен, как отловить «исключение брокера», как вы думаете?

Это моя конфигурация потоков:

buffered.records.per.partition = 1000
cache.max.bytes.buffering = 10485760
commit.interval.ms = 30000
connections.max.idle.ms = 540000
default.key.serde = ... Serdes$StringSerde
default.production.exception.handler = ... DefaultProductionExHandler
default.timestamp.extractor = ... FailOnInvalidTimestamp
default.value.serde = ... Serdes$StringSerde
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
num.standby.replicas = 0
num.stream.threads = 8
partition.grouper = ... DefaultPartitionGrouper
poll.ms = 100
processing.guarantee = at_least_once
receive.buffer.bytes = 32768
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
replication.factor = 1
request.timeout.ms = 40000
retries = 0
retry.backoff.ms = 1000
rocksdb.config.setter = null
security.protocol = PLAINTEXT
send.buffer.bytes = 131072
state.cleanup.delay.ms = 600000
state.dir = /tmp/kafka-state
topology.optimization = all
upgrade.from = null
windowstore.changelog.additional.retention.ms = 86400000

1 Ответ

0 голосов
/ 30 августа 2018

Увеличение числа повторных попыток - это правильный способ справиться с простоем брокера.

Я не уверен, почему увеличение числа повторных попыток может повлиять на производительность. Можете ли вы уточнить это?

Кроме этого, нет ничего похожего на «исключение брокера вниз». Вы можете зарегистрировать необработанный обработчик исключений в KafkaStream экземпляре. Он сообщает вам об умирающем потоке, и, таким образом, вы можете отреагировать на него, перезапустив клиент KafkaStreams.

Вы также можете попробовать изменить production.exception.handler и пропустить некоторые производственные ошибки. Обратите внимание, что в этом случае вы можете потерять все буферизованные сообщения в клиенте. (Также обратите внимание, что вы не можете пропустить все ошибки с помощью обработчика - некоторые ошибки считаются FATAL и KafkaStreams завершит работу независимо от вашей конфигурации.)

...