이 글의 코드 및 정보들은 책을 바탕으로 작성하였습니다.
메시지 전송 방법
-
프로듀서 옵션 중
-
acks 옵션을 어떻게 설정하는지에 따라
-
카프카로 메시지를 전송 시
-
메시지 손실 여부 / 메시지 전송 속도 / 처리량 등이 달라지게 된다.
-
각 옵션은 정확하게 이해하고
-
사용해야하므로
-
3가지 경우를 통해
-
자세히 알아보자.
-
이 글에서는 1,2번 상황에 대해 알아보고
-
3번 상황에 대해서는
-
Kafka Message Send Method :: 2st글을 참고하자.
메시지 손실 가능성 ↑ && 빠른 전송
-
메시지를 전송할 때
-
프로듀서는 카프카 서버에서 응답을 기다리지 않고
-
메시지를 보낼 준비가 되는 즉시 다음 요청을 보낸다.
-
즉 카프카로부터 응답을 기다리지 않고
-
프로듀서가 준비되면 즉시 보내기 때문에
-
매우 빠르게 메시지를 보낼 수 있다.
-
하지만 프로듀서가 카프카로부터
-
자신이 보낸 메시지에 대해 응답을 기다리지 않기 때문에
-
메시지 손실이 될 수 있다.
Why?
-
프로듀서가 카프카로 메시지를 전송했지만
-
어떠한 이유로 인해 카프카로 도착하지 못했다.
-
하지만 프로듀서는 카파카의 응답 확인을 하지 않기 때문에
-
카프카가 메시지를 정상적으로 받았는지에 대해서는 모른다.
-
그런 상황에서 프로듀서는
-
또 다른 메시지를 보낼 준비가 되면
-
계속해서 카프카로 메시지를 전송하게 된다.
Q. 무조건 나쁜건가?
-
상황에 따라 다르다.
= Depends on the situation
-
일부 메시지 손실을 감안하더라도
-
매우 빠르게 전송이 필요한 경우에는
-
acks = 0으로 설정하면 된다.
So What?
-
브로커가 다운되는 장애 / 네트워크 다운 등등
-
크리티컬한 이슈가 아닌 이상
-
acks의 값을 0으로 지정해도 된다.
-
다만 손실 가능성이 높은 편이라는 점을 인지하고 사용하면 된다.
메시지 손실 가능성 ↓ && 적당한 전송 속도
-
이 옵션은 프로듀서가 카프카로 메시지를 보낸 후
-
보낸 메시지에 대해
-
카프카가 잘 받았는지 확인(acks)을 한다.
-
응답 대기 시간 없이
-
계속 메시지만 보내던 1번째 방법과는 달리
-
확인을 기다리는 시간이 추가되어
-
메시지를 보내는 속도는 1번 방법에 비해 약간 느리다.
acks = 0 vs acks = 1
-
요청당 1초가 걸린다고 가정을 해보자.
-
그리고 그 요청은
-
보내는 요청과 응답을 받는 행동으로 정의할 수 있다.
-
acks = 0인 경우엔
-
보내는 요청만 신경쓰기 때문에
-
하나의 메시지를 보내는데 1초가 걸린다.
-
반면 acks = 1인 경우엔
-
보내는 요청과 응답을 받는 행동이 하나로 묶이기 때문에
-
하나의 메시지를 보내는데 2초가 걸린다.
acks : 0 | acks : 1 | |
---|---|---|
메시지 전송 완료 시간 | 1초 | 2초 |
So What?
-
메시지 전송 시간은 다소 느리지만
-
응답을 받기 때문에
-
메시지 손실률은 매우 낮다.
Q. acks = 1 이면 손실률은 0인가?
-
모든것엔 예외가 있다.
-
acks = 1 인 상황에서도
-
메시지가 손실될 수 있는 현상은 발생할 수 있다.
-
이와 관련해서는 Kafka 메시지 손실 (Under Certain Conditions) 글을 참고하자.