Какие инструменты используются в Java для работы с Kafka
Что проверяют
Работали ли вы с Kafka на уровне кода, а не только слышали о ней, и понимаете ли, какой уровень абстракции брать под задачу. Почти всегда следом спрашивают про коммит офсетов, повторные попытки и сообщения, которые не удаётся обработать.
Как отвечать
Идите от низкого уровня к высокому:
kafka-clients: базовая библиотека,KafkaProducer,KafkaConsumer,AdminClient. Продюсер потокобезопасен, консьюмер нет. С версии 3.0 продюсер по умолчанию идемпотентный и работает сacks=all;- Spring for Apache Kafka:
KafkaTemplateдля отправки,@KafkaListenerдля чтения, контейнер сам управляет опросом и коммитами. Spring Boot настраивает всё через свойстваspring.kafka.*. Ошибки обрабатываетDefaultErrorHandlerсDeadLetterPublishingRecoverer, неблокирующие повторы дают@RetryableTopic; - Kafka Streams:
StreamsBuilder,KStream,KTable, оконные агрегаты, локальное состояние в RocksDB,processing.guarantee=exactly_once_v2; - Kafka Connect: интеграция без своего кода, например Debezium для CDC из PostgreSQL;
- Schema Registry: Avro или Protobuf с версиями схем, чтобы продюсер не сломал консьюмеров;
- тесты:
KafkaContainerиз Testcontainers или@EmbeddedKafkaизspring-kafka-test; - эксплуатация: Kafka UI или AKHQ, скрипт
kafka-consumer-groups.shдля просмотра лага.
Упомяните, что с Kafka 4.0 кластер работает только в KRaft, без ZooKeeper.
Где спотыкаются
Используют один KafkaConsumer из нескольких потоков. Клиент бросит ConcurrentModificationException, параллелить нужно партициями и отдельными консьюмерами или через concurrency контейнера в Spring.
Не понимают, когда коммитится офсет. В чистом клиенте enable.auto.commit по умолчанию включён: если обработка ушла в другой поток или исключение проглочено, офсет сдвинется, а сообщение потеряется. Spring Kafka автокоммит отключает и коммитит сам, по умолчанию в режиме AckMode.BATCH.
Не думают о «ядовитом» сообщении, которое не десериализуется. Нужен ErrorHandlingDeserializer, который отдаёт ошибку обработчику, и топик для таких записей, иначе консьюмер рискует застрять на одной записи и заблокировать партицию.