본문 바로가기
IT/Knowledge

Kafka 의 Acknowledgement (AcksMode)

by 성준하이 2024. 2. 23.
반응형

줄여서 ack 라고도 하는 acknowledgement 에 대해서 알아볼 것이다.

 

공식 홈페이지는 아래에서 확인할수 있다.

https://docs.spring.io/spring-kafka/api/org/springframework/kafka/support/Acknowledgment.html

 

Acknowledgment (Spring for Apache Kafka 3.1.1 API)

Negatively acknowledge the record at an index in a batch - commit the offset(s) of records before the index and re-seek the partitions so that the record at the index and subsequent records will be redelivered after the sleep duration.

docs.spring.io


acknowledgments의 약자로 사전에서 찾아 보면 "승인", 확인 이라는 뜻이고 

말 그대로 작업의 완료를 응답 받을수 있다.

 

0, 1, all 이 있으며 각각 값이 의미하는 바는 아래와 같다.

 

ACK 0


프로듀서가 확인 응답을 기다리지 않겠다는 의미이다.
그러기에 데이터 손실 가능성이 있다.
프로듀서는 메시지가 전송된 순간 메시지 쓰기에 성공했다고 간주하고 브로커가 수신하기까지 기다리지 않는다.
리더에게 데이터 전송 후 리더가 쓰기 작업을 하던 중에 브로커가 오프라인 상태가 되거나 예외가 발생해도 Producer 쪽에서는 문제가 발생한 걸 알 수가 없고 데이터는 손실된다.
설정값 중 처리량이 가장 많고 오버헤드가 최소화된다.

 

ACK 1


프로듀서는 리더 브로커에 확인 응답을 받을 때 쓰기가 성공했다고 간주한다.
카프카 버전 1.0 ~ 2.8까지 기본 값이다.
프로듀서가 리더에 데이터를 보내면 리더가 쓰기 작업을 한 뒤 요청이 성공적이라고 응답한다.
하지만 리더가 요청을 받긴 하지만 데이터가 복제되었는지는 모른다.
데이터를 가진 건 리더뿐이고 복제는 백그라운드에서 일어나기 때문이다.
그렇기에 레플리카가 데이터를 복제하지 못했다면 데이터 손실이 발생한다.

 

ACK ALL (-1)


프로듀서는 동기화된 레플리카들이 메시지를 수신했을 때 메시지 쓰기에 성공했다고 간주한다.
카프카 버전 3.0부터는 기본값이다.
프로듀서가 리더에 데이터를 전송하면 리더는 레플리카에 전송하고 레플리카는 리더 브로커에 쓰기 완료 확인 응답을 보낸다.
리더가 모든 레플리카에게 완료 확인 응답​을 받으면 Producer에게 완료되었다고 응답한다.

 

또한 카프카에서는 커밋이라는 단어보다는 ackmode라는 단어를 사용하는데 해당 값 설정에 대한 값들과 의미는 아래 표와 같다.

 

 AcksMode
컨슈머의 AckMode 기본값은 BATCH이고 컨슈머의 enable.auto.commit 옵션은 false로 지정

 

RECORD 레코드 단위로 프로세싱 이후 커밋
BATCH poll() 메서드로 호출된 레코드가 모두 처리된 이후 커밋
스프링 카프카 컨슈머의 AckMode 기본값
TIME 특정 시간 이후에 커밋
이 옵션을 사용할 경우 시간 간격을 선언하는 AckTime 옵션을 설정해야 한다.
COUNT 특정 개수만큼 레코드가 처리된 이후 커밋
이 옵션을 사용할 경우에는 레코드 개수를 선언하는 AckCount 옵션을 설정해야 한다.
COUNT_TIME TIME, COUNT 옵션 중 맞는 조건이 하나라도 나올 경우 커밋
MANUAL Acknowledgement.acknowledge() 메서드가 호출되면 다음번 poll() 때 커밋을 한다. 매번 acknowledge() 메서드를 호출하면 BATCH 옵션과 동일하게 동작한다. 이 옵션을 사용할 경우에는 AcknowledgingMessageListener 또는 BatchAcknowledgingMessageListener를 리스너로 사용해야 한다.
MANUAL_IMMEDIATE Acknowledgement.acknowledge() 메서드를 호출한 즉시 커밋한다. 이 옵션을 사용할 경우에는 AcknowledgingMessageListener 또는 BatchAcknowledgingMessageListener를 리스너로 사용해야 한다.
반응형

'IT > Knowledge' 카테고리의 다른 글

JCP / JSR 이란?  (27) 2024.02.25
Heroku 란?  (23) 2024.02.24
Trigger 란? (트리거)  (27) 2024.02.16
[kafka] 컨슈머 그룹이란?  (20) 2024.02.11
샤딩(Sharding) 이란?  (21) 2024.02.04

댓글