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.