Post

polling loop 벗어나기

polling loop 벗어나기 주제의 핵심 개념과 적용 포인트를 정리합니다.

polling loop 벗어나기

wakeup()이 필요한가

Consumer가 poll()에서 오래 대기 중이면 종료 신호를 받아도 즉시 루프를 빠져나오기 어렵다.
이때 다른 스레드에서 consumer.wakeup()을 호출하면 poll 대기를 깨고 종료 흐름으로 진입할 수 있다.

ShutdownHook과 함께 쓰는 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    consumer.wakeup();
    try {
        mainThread.join();
    } catch (InterruptedException e) {
        // ...
    }
}));

try {
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(10));
        for (ConsumerRecord<String, String> record : records) {
            // ... do something
        }
        consumer.commitAsync();
    }
} finally {
    consumer.close();
}

핵심은 종료 이벤트가 왔을 때 polling을 즉시 멈추고, 커밋/리소스 정리 후 close()를 수행하는 것이다.

실무 포인트

  • 강제 종료 대신 graceful shutdown을 구현하면 리밸런스 충격과 중복 처리를 줄일 수 있다.
  • 종료 루틴에서도 마지막 커밋 전략(동기 커밋 여부)을 명확히 정해두는 것이 좋다.
This post is licensed under CC BY 4.0 by the author.