Programming-[Backend]/Kafka 5

[TIL] Kafka Transaction mode, offset lag = 1 유지 현상

1. 현상진행 중인 프로젝트에서 메시지의 중복 처리를 막기 위해서 멱등적 프로듀서 및 transaction mode를 적용했다. 이럴 경우 2가지 현상이 나타난다.브로커에 쓰는 메시지가 2개씩 생성됨한 번도 메시지가 쌓이지 않았을 때는 consumer의 offset lag이 0이지만, 한 번 쌓이기 시작하면 offset lag이 1로 유지된다.2번 현상 이후, AWS MSK에서 Estimated Max Time Lag은 30초 정도까지 계속 올랐다 내렸다를 반복한다. 이 중 1번 항목은 널리 알려진 사실이지만, 2번 항목은 offset lag이 올라가서 경고를 받을 수 있음에도 불구하고 잘 알려지지 않은 것 같다. AWS Cloud Watch나 Datadog과 같은 툴에서 offset lag의 경보 알림..

카프카 멱등성(Idempotence) 설정, Retry 및 DLT 설정 시 유의사항

1. 멱등성 설정enable.idempotence = truemax.in.flight.requets.per.connection retries > 0 이여야함 -> '2147483647'로 설정acks = 'all' 이여야함 만약 enable.idempotence = false이고,max.in.flight.requests.per.connection > 1이면 메시지 배치 중 일부가 에러가 났을 때재시도하면서 순서가 바뀔 수 있음2. Retry, DLT 설정DefaultErrorHandler() 부분에 컨슈머 에러 발생 시 Retry, DeadLetter 정책 설정@Bean public DefaultErrorHandler errorHandler() { DefaultErrorHandler handler..

Consumer Lag 남아있는 것 제거하기(docker kafka container shell tool 활용)

1. 개요 프로듀서에 비해 컨슈머 offset이 뒤쳐져있고, 더 이상 프로듀서가 메시지를 발행하고 있지 않은데 Consumer Lag이 남아있는 경우 offset을 변경하는 방법왜 남아있는지는 다양한 원인에 의해서 일 거 같은데.. 상황에 맞게 연구가 필요할듯함.lag에 의한 메시지가 유실되어도 상관없는 경우(앱 오류나 특정 상황으로 인해 consumer lag이 남아있는 경우)에 적용  2. 방법kafka-consumer-groups.sh shell은 docker를 사용하는 경우 아래 명령어를 실행하여 접근 가능 docker exec -it {yourKafkaDockerContainerName} /bin/bashcd /binls ls 명령어로 kafka 툴 관련 .sh 파일들이 있는지 확인. 없다면 다..

[TIL] 카프카 로그 압축 정보 local container에서 확인 방법(kafka-run-class, DumpLogSegments)

1. 개요아래 Ref. 블로그에서 Producer로 메시지 발송 시 압축에 대한 내용을 보고, Docker로 실행 중인 local 컨테이너에서 로그 정보를 출력해볼려고 했다.https://velog.io/@wwlee94/Kafka-메시지-압축에-대하여   docker로 실행하다보니 CLI용 kafka-run-class.sh 스크립트의 경로 및 로그 파일 경로가 달라서 찾느라 시간을 썼다. 저장해놓는다. /usr/bin/kafka-run-class kafka.tools.DumpLogSegments --files /var/lib/kafka/data/{yourPartitionName}/{yourMessageSegment}.log --print-data-log | grep compresscodec   2. 테스..

[검증 중] Kafka - testcontainer : Transaction 묶기, graceful shutdown, 수동 커밋, await

아직 대략적으로만 경험했고, 확실하지는 않은 내용이라 다른 참조 문서들을 참고해야하는 내용이다.  1. Transaction 묶기 ref) https://gunju-ko.github.io/kafka/spring-kafka/2018/03/31/Spring-KafkaTransaction.htmlkafka는 기본적으로 비동기적인 메시지 발행을 하므로 트랜잭션을 끝까지 보장하지 않는다. 반드시 트랜잭션이 보장되도록 할려면 executeInTransaction 메서드를 사용해야한다. 이 방식은 KafkaTransactionManager를 거치는 방식은 아니고, KafkaTemplate만 이용해서 바로 트랜잭션을 묶어준다.kafkaTemplate.executeInTransaction( t -> t.send(y..