Как проверить корректность данных из Kafka и консистентность между сервисами
Что проверяют
Понимаете ли вы, что в асинхронной системе данные согласуются не сразу, и умеете ли это тестировать без sleep и гаданий. Следом спрашивают про дубли и порядок: что будет, если консьюмер перезапустится посреди обработки.
Как отвечать
Разделите проверку на три уровня:
- сообщение в топике: читаете топик через
kcat,kafka-console-consumerс--property print.key=trueили через UI вроде AKHQ и Kafka UI. Проверяете ключ (от него зависят партиция и порядок), заголовки, соответствие схеме и бизнес-значения. Если есть Schema Registry, узнайте режим совместимости: по умолчаниюBACKWARD, и несовместимую схему зарегистрировать не выйдет; - обработка консьюмером: данные дошли до базы сервиса-получателя в нужном виде, отставание группы видно в
kafka-consumer-groups.sh --describe. Негатив: битое сообщение не должно блокировать партицию, его ждут в DLT; - консистентность между сервисами: сверка по идентификаторам, количеству и суммам между базой источника и получателя. Если сервис пишет в базу и шлёт событие, спросите про outbox: без него запись и событие могут разойтись при падении.
На практике чаще всего работает гарантия at-least-once, значит дубли нормальны, и консьюмер обязан быть идемпотентным. Проверка простая: отправляете одно событие дважды с тем же id и ждёте одну запись. Порядок Kafka гарантирует только внутри партиции, поэтому события одной сущности должны идти с одним ключом.
В автотестах ожидание делайте поллингом с таймаутом, например Awaitility в Java, окружение поднимайте через Testcontainers. Для контрактов между продюсером и консьюмером подходит Pact с message-контрактами.
Где спотыкаются
Ставят Thread.sleep(5000). На медленном стенде тест падает, на быстром зря ждёт, и в итоге его отключают как нестабильный.
Читают топик с начала и хватают первое подходящее сообщение, которое оставил чужой тест. Искать своё надо по уникальному ключу или correlation id.
Проверяют только счастливый путь и не трогают перезапуск консьюмера, повторную доставку и изменение схемы.