해결된 질문
작성
·
124
·
수정됨
0
안녕하세요,
프로듀서 전송 부분에 대해 강의를 듣던 중 궁금한 점이 있습니다.
최대 한 번 전송 외에는 ack를 받고 다음 메시지를 전송한다고 설명하셨는데, 비동기 전송은 ack와 상관 없이 지속적으로 메시지를 전송할 수 있는거 아닌가요?
메시지 a,b,c 3개를 보낸다고 했을 때
ack = 0의 경우는
a,b,c를 보내고 오는 ack에 대해 신경 쓰지 않는것이고,
ack != 0의 경우 비동기라면 마찬가지로 전송은 ack 여부와 상관 없이 a,b,c를 보내고 대신 ack 여부에 따라 특정 메시지에 대한 재전송이 이루어 지는 것이 아닌지 궁금합니다.
즉, ack 여부에 따라 a이후 b를 전송하는 것이 결정되는게 맞는지 궁금합니다.
답변 1
0
안녕하십니까,
네, 말씀하신 부분이 맞습니다. 좀 더 명확히 설명드리자면,
sync 방식, 즉 producer.send().get() 과 async 방식(callback 적용)에 따라 acks=0/1 이 살짝 달라지는 부분이 있습니다.
강의에서 설명드리는 부분은 sync 방식에서 acks 적용이라고 보시면 될 것 같습니다.
먼저 sync 방식은 send()가 return받는 future 객체가 만들어져서 get()이 반환될때까지 wait가 되면서 순차적인 동기 방식을 유지하게 되는데, 이게 acks=0 일 경우는 get() 이 broker로 부터 ack를 기다리지 않고 바로 반환이 됩니다. 순차적으로는 보내는데, acks를 기다리지 않고 보내기 때문에 해당 메시지가 유실될 수 있습니다.
sync 방식에서 acks=1 이면 acks가 와서 get()이 반환될 때까지 기다리게 됩니다. acks가 일정 기간동안 오지 않으면 다시 해당 메시지를 보내게 됩니다.
async 방식에서 acks=0은 sync 방식과 거의 동일합니다. 다만 acks를 받으면 Callback이 수행된다는 점만 다릅니다.
async 방식에서 acks=1은 조금 헷갈리는 부분이 있습니다. async 방식에서 acks=1 인 경우는, 이전 메시지의 acks를 받지 않았지만, 다음 메시지를 보낼 수 있습니다. 즉 비 순차적으로 메시지를 보낼 수 있습니다. 하지만 이전 메시지의 acks가 특정 기간동안 오지 않는다면 해당 메시지를 다시 보냅니다. 때문에 중복이 발생할 가능성이 있습니다.
강의에서는 acks=1인 경우는 sync 방식으로 보낸 설명으로 생각해 주시면 될 것 같습니다. async 방식의 경우는 메시지를 보내고, acks를 기다리지 않고, 다음 메시지를 보내지만, acks가 오지 않는 경우 해당 메시지를 다시 보내게 됩니다.
생각해 보니, 이 설명을 원래 강의 기획에서는 하려고 했었는데, 어쩌다 보니 빠진 것 같군요. 아마 이 설명을 하면 수강생 분들이 많이 헷갈릴 것 같아서 쉽게 결정을 못하다가 잊어버리고 넘어간 것 같습니다.
좋은 질문 감사합니다.
넵 답변 감사합니다!