작성
·
258
0
안녕하세요, 강사님!
항상 좋은 강의 잘 듣고 있습니다. 이번에 공부하면서 궁금한 점이 생겨서 질문드리게 되었습니다.
Idempotence / transaction의 Producer 관점의 차이는 어떤 것인지 구분할 수 있을까요? 제가 이해한 내용은 다음과 같은데 정확하지 않아서... 질문드리고 싶습니다.
Idempotence는 중복 없이 전송하지만, Producer Fail이 발생했을 때의 중복 전송을 막지는 못한다. 예를 들면 다음과 같은 상황으로 이해를 할 수 있을 것 같습니다.
프로듀서가 브로커에 메세지를 보낸다.
브로커가 ACK를 보낸다. 이 때 ACK를 받지 못하고프로듀서가 죽는다.
프로듀서가 다시 살아난다. 이 때 메세지를 보내려고 하면 다시 PID를 배정받는다. 따라서 SEQ Num도 초기화 된다. 이 때 이전에 발송 취소된 메세지부터 보내려고 한다.
이전에 발송 취소된 메세지를 보내면, PID와 SEQ가 초기화 되기 때문에 브로커 입장에서는 중복메세지가 아니라고 생각하고 저장한다.
그런데 트랜잭션으로 하게 되었을 때는 이런 상황을 방지할 수 있을 것 같습니다. 예시는 다음과 같습니다.
트랜잭션 코디네이터를 통해 TID / PID가 맵핑되고, PID를 에포크 별로 커밋 오프셋을 관리한다.
각 프로듀서는 고유한 TID를 가지고 있기 때문에 위와 같이 죽고 회복되는 상황에서 고유한 TID를 바탕으로 이전의 PID 값을 받아온다.
이전의 PID를 에크별로 커밋 오프셋을 관리하기 때문에 여기서 프로듀서는 이전에 발송했던 Message Seq를 받아올 수 있다.
따라서 프로듀서는 중복없이 정확히 한번 전송을 할 수 있게 된다.
이게 맞을까요??
항상 좋은 강의 너무 감사드립니다!
답변 1
0
안녕하세요 답변드립니다.
Idempotence Producer와 프로듀서 애플리케이션이 정상동작하는 한 중복 전송을 막을 수 있다. Transaction Producer는 기본적으로 Idempotence Producer와 동일한 로직으로 운영되지만, 트랜젝션 레코드를 추가로 전송한다. 라고 보시면 될것 같습니다. Transaction Producer를 사용하더라도 장애가 발생하면 중복전송을 피할 수 없습니다.
https://kafka.apache.org/23/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html
From Kafka 0.11, the KafkaProducer supports two additional modes: the idempotent producer and the transactional producer. The idempotent producer strengthens Kafka's delivery semantics from at least once to exactly once delivery. In particular producer retries will no longer introduce duplicates. The transactional producer allows an application to send messages to multiple partitions (and topics!) atomically.
답변 감사드립니다. 그럼 프로듀서 자체만으로는 동일한 로직을 사용하지만, 트랜잭션 프로듀서가 추가된 것은 트랜잭션 컨슈머와 함께 동작하기 위함이라고 이해를 하면 될까요?