해결된 질문
작성
·
29
답변 2
0
안녕하세요.
카프카 컨슈머의 poll()
메서드 호출을 위해 while(true)
를 사용하는 것은 상용환경에서도 흔히 사용하는 방식입니다. 그리고 참고로 wakeup()
메서드를 호출하면 poll()
메서드에서 wakeupException
을 발생시키기 때문에 보통 while(true)
앞뒤로 try-catch
문을 작성하여 리소스를 정리하거나 마무리를 합니다. 아래는 관련 코드이므로 참고하시기 바랍니다.
try {
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
records.forEach(record -> {
System.out.printf("offset = %d, key = %s, value = %s%n",
record.offset(), record.key(), record.value());
});
}
} catch (WakeupException e) {
// wakeup() 호출 시 이 예외 발생 (정상 종료 용도)
System.out.println("WakeupException caught. Exiting...");
} finally {
consumer.close();
System.out.println("Consumer closed.");
}
그리고 테스트의 경우 크게 두가지 부분으로 나누면 좋겠습니다. 통합 테스트와 단위 테스트입니다.
통합 테스트의 경우 cbt kafka cluster를 운영하면서 cbt consumer를 올리고 레코드를 전달하여 테스트할 수 있습니다. 그리고 통합 테스트가 완료되면 prod kafka cluster와 연동되는 prod consumer를 새로운 버전으로 배포하는 것이 일반적입니다.
그리고 단위 테스트의 경우 poll()
내부에서 개별 레코드를 처리하는 구문을 메서드 또는 클래스로 빼서 mock 처리 같은 것을 통해 테스트하시면 좋을것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다.
Kafka 컨슈머 애플리케이션을 구현할 때 while (true)
루프를 사용하여 지속적인 폴링을 수행하는 것은 일반적인 방식입니다. 이는 컨슈머가 데이터 처리를 위해 언제든지 메시지를 받을 수 있도록 대기 상태를 유지하기 때문입니다. 하지만 테스트 환경에서 무한 루프는 다소 복잡하게 느껴질 수 있으며, 관리 및 종료를 위한 추가적인 작업이 필요합니다.
다음은 실무와 테스트에서 무한히 폴링하는 컨슈머를 구현하고 테스트하는 일반적인 방법들입니다:
Shutdown Hook 활용: 테스트 환경에서 컨슈머의 적절한 종료를 위해 자바의 Runtime.getRuntime().addShutdownHook(new Thread())
구문을 사용하여 애플리케이션 종료 시점에 스레드를 안전하게 종료할 수 있습니다.
Custom Poll Interval: 테스트 시에는 메시지가 없을 때도 루프를 계속 도는 것을 방지하기 위해 폴링 인터벌(poll interval)을 설정하여 CPU 사용률을 줄일 수 있습니다.
Mocking 라이브러리 사용: 테스트 프레임워크는 mock 라이브러리를 사용하여 Kafka의 실제 호출을 차단하고, 예상하는 메시지 셋을 반환하도록 구현할 수 있습니다. 이는 Mockito
같은 라이브러리를 활용해 테스트할 수 있습니다.
Mini-Kafka Cluster: 통합 테스트 시 실제 클러스터를 사용하기 귀찮은 경우, in-memory Kafka 클러스터를 활용하여 테스트를 진행할 수 있는 프레임워크(Library)들이 있습니다. 예를 들어 EmbeddedKafka
를 사용할 수 있습니다.
Time-out 설정: 무한 루프를 테스트할 때, 특정 시간 이후에 자동으로 타임아웃을 걸어버리는 방식을 통해 테스트 수행이 완료되도록 설정할 수 있습니다.
관련된 다른 질문과 답변들은 아래 URL에서 확인하실 수 있습니다:
컨슈머 애플리케이션 테스트는 생산 환경과 비슷한 수준의 테스트를 구축하는 것이 목표이므로, 다양한 기법들을 조합하여 안정성 있는 애플리케이션을 구현하시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제 질문이 좀 불친절했네요 단위 테스트 방식이 궁금했었습니다. 좋은 말씀 감사합니다~!!