작성
·
227
0
안녕하세요, 항상 좋은 강의 남겨주셔서 감사합니다.
한 가지 질문 드릴 것이 있어 글을 작성합니다
at least once는 적어도 한번 전송을 반드시 보장하는 것일까요?
at least once는 기본적으로 ACK가 오지 않을 경우, 재시도를 하는 방식으로 메세지를 다시 보내어서 적어도 한번 전송하는 것으로 알고 있습니다.
그런데 이것과는 독립적으로 다음 두 가지가 존재하고 있습니다.
재전송 횟수는 정해져있음.
하나의 메세지 배치당 할당된 시간은 정해져있음.
재전송 횟수를 초과한다거나, 할당된 시간을 다 사용해버리면 TimeoutException이 발생하는 것으로 알고 있는데요... 이렇게 TimeoutException이 발생해도 '적어도 한번 전송'은 지켜질까요? 아니면 '적어도 한번 전송'이 안될 수도 있는 걸까요?
코드를 살펴보니...
canRetry()에서 deilvery.timeout.ms를 초과한지 확인하고...
초과한 경우 failBatch() 메서드를 불러오는 것 같습니다.
즉, deilvery.timeout.ms를 초과한 메세지 배치는 전송하지 않고 버리는 것 같은데.. 맞을까요?
답변 1
0
안녕하십니까,
오, 소스코드까지 열어 보셨군요.
네 맞습니다. 재전송 횟수를 초과한다거나, 할당된 시간을 다 사용해버리면 Producer객체는 TimeoutException을 발생 시켜서 호출한 java client에게 해당 Exception을 전송하고 종료합니다.
At Least Once는 Ack를 받을 때까지 Producer 객체 자체에서 계속 전송을 시도한다는 의미인지 무한히 계속 전송을 시도한다는 의미는 아닙니다. 지정된 retries나 delivery.timeout.ms 가 지나면 producer 객체 는 해당 메시지 전송 자체가 더 이상 무의미하므로 TimeOutException을 발생 시켜서 호출한 Java Client에게 전달하고 종료하는 것이 맞습니다.
감사합니다.