IT 삽질기

Kafka consumer와 commit 본문

BigData/Kafka

Kafka consumer와 commit

화이팅빌런 2021. 6. 28. 23:18

이번 글에서는 Kafka consumer에서 record를 가지고 갈 때 어떤 일이 일어나는지, 처리한 record와 처리할 record를 어떻게 구분하는지에 대해 알아보도록 하자. 아래의 본문에서 이야기하는 내용은 Java를 이용한 consumer application을 개발하는 환경을 가정한 것이다.

Kafka consumer offset

Kafka에서는 record를 어디까지 처리했는지 구분하기 위해 comsumer offset를 이용한다. 

consumer offset은 kafka의 내부 topic인 __consumer_offsets를 통해 관리하며, consumer에서 commit이 일어나면 변경된다. consumer는 offset 값을 이용하여 다음에 처리할 record를 consume 하여 사용하게 된다.

Kafka consumer commit

그렇다면 commit은 언제 일어나게 될까

기본적으로 consumer에서 poll() 메서드가 실행되면 auto commit이 일어나고 이때 offset의 값 또한 변경된다.

auto commit은 enable.auto.commit값이 true로 설정되어 있어 일어나게 되고 필요에 따라 false로 설정해 사용한다.

 

이렇게 처리되는 경우 문제점는 없을까?

consumer에서 poll() 메서드를 호출하여 데이터를 가지고 간 이후 consumer에서 장애가 발생하면 어떻게 될까

Kafka에서는 이미 commit이 되어 이미 가져간 record가 정상적으로 처리되었다고 판단할 것이다.

이런 경우 데이터 유실이 발생할 수 있게 된다. 일부의 데이터 유실이 발생해도 되는 환경에서라면 문제없겠지만 데이터가 유실되면 안 되는 환경에서는 사용할 수 없는 방법이다.

 

Commit은 언제 일어나야 안전할까?

그렇다면 commit은 언제 일어나야 안전할까?

먼저 위에서 나온 것처럼 auto commit을 이용하는 방식은 데이터 유실이 발생할 수 있어 안전하지 않다.

poll() 메서드로 record를 가지고 간 consumer가 데이터 처리를 정상적으로 완료한 경우에 commit을 진행하면 데이터를 안전하게 처리했다고 할 수 있을 것이다.

먼저 auto commit 옵션을 false로 설정한 후 데이터 처리가 완료되면 commitSync() 메서드를 호출하면 된다. commitSync() 메서드를 사용하면 poll() 메서드를 통해 반환된 레코드의 가장 마지막 offset를 기준으로 commit를 수행하여 데이터가 완전히 처리되었음을 의미한다.

이렇게 commitSync()을 사용하게 되면 안전하게 데이터를 처리하고 유실되지 않는 것을 보장할 수 있지만 데이터가 처리될 때까지 기다리는 과정이 필요해 데이터 처리량이 줄어들게 된다.

 

commit 비동기 처리

commitSync() 메서드를 이용하는 경우 메서드명에서 알 수 있듯 동기 커밋 방식을 이용하기 때문에 데이터 처리 생각보다 많이 늦어질 수 있다. commit 역시 비동기 방식으로 처리할 수 있는대 commitAsync() 메서드를 이용하면 이를 비동기로 처리할 수 있게 된다. 커밋 요청을 전송하고 broker의 응답에 관계없이 다음 데이터를 처리하게 되는데 커밋 요청이 실패하는 경우 데이터의 순서와 데이터 중복 처리가 발생해 문제가 생길 수 있다.

'BigData > Kafka' 카테고리의 다른 글

Kafka 멱등성 producer  (0) 2021.07.11
Kafka Acks  (0) 2021.06.08
Kafka-manager을 이용한 Partition reassign  (0) 2021.06.05
Kafka scale out  (0) 2021.06.01
Kafka ISR(In-Sync-Replicas)  (0) 2021.05.29
Comments