inflearn logo
강의

講義

知識共有

堅牢な決済システムの構築

Wallet Service 構築

wallet service 구축에서 중복메시지 검증 로직이 필요한지 궁금합니다

295

muyaho

投稿した質問数 2

0

enable.idempotence = true 로 설정 시 카프카에 중복 메시지를 발행하는 producer는 없을것 같은데 중복으로 전송하는 producer가 있을 수 있다고 가정하고 작성하는 로직일까요?

spring spring-boot dbms/rdbms backend payments

回答 2

0

muyaho

말씀하신 답변 이해했습니다 카프카 트랜잭션을 적용하지 않는다면 중복 메시지가 존재할 가능성이 있겟네요. 감사합니다~

0

yjm9505168574

안녕하세요~ 질문 남겨주셔서 감사합니다.

 

카프카 프로듀서에서 enable.idempotence=true 설정을 한다면 멱등성 프로듀서가 되서 중복 메시지는 발행안되는 건 맞습니다.

 

멱등성 프로듀서의 중복 메시지 제거 기법은 프로듀서 ID 와 메시지 Sequence Number 를 통해 중복을 제거하는데요.

 

중요한 건 프로듀서 어플리케이션이 새롭게 시작하는 경우 똑같은 프로듀서 ID 를 재발급 받을 수 없다는거에요.

 

그래서 이건 해당 프로듀서 어플리케이션이 살아있는 세션 내에서만 메시지 발행이 중복이 되지 않습니다.

 

만약 멱등성 프로듀서 어플리케이션이 메시지를 보내다가 죽은 경우, 다시 재부팅되서 메시지를 보내는 경우에는 두 개의 메시지가 전송되는 케이스는 존재하는거죠.

 

그래서 엄격하게 메시지 발행을 하나로만 보장하려면 카프카 트랜잭션을 사용해야하는거죠.

 

물론 현재 저희 어플리케이션에서는 Payment Service 가 트랜잭셔널 아웃박스 패턴으로 메시지를 하나만 발행하고 있기 때문에 메시지는 여러건 발행되지 않으므로 의미는 없긴합니다.

 

그리고 여담이긴 하지만 저 같은 경우는 일관성이 엄격하게 중요한 어플리케이션에서 하나만 믿고 로직을 작성하기 보다는 불확실한 것들이 있는 경우에는 여러가지 케이스를 고려해서 2차까지 방어 로직을 작성하는 것을 선호합니다.

 

도움이 되셨으면 좋겠네요.

 

감사합니다.

프로그램 아키텍쳐

0

60

1

실습코드 압축해제

0

78

1

confirm 로직에서 amount를 검증하는 부분에서 질문이 있습니다.

0

53

1

Transaction Demo 질문 드립니다.

0

60

1

cdc 방식

0

84

1

seed 키 및 orderId 에 대한 질문

0

65

1

결제 이후 404 Error 발생

0

167

1

테스트 코드 중 isPaymentDone 변환

0

76

1

가상의 Checkout 기능 구현 중 질문

0

183

1

docker Mysql 설정 문의

0

106

1

allOpen 설정이 잘못된 거 같습니다.

0

115

1

recovery 동시성 처리 관련 문의

0

119

1

confluent > skip 이 더이상 안되나봅니다.

0

107

1

강의 클론 코딩한 것 public repo에 올려도 되나요?

0

330

1

멱등키에 request를 넘기는 것

0

257

1

동시성 제어 (optimistic locking) 재시도 부분 질문 드립니다.

0

173

1

결제 복구의 세부 과정을 병렬로 처리한 이유가 궁금합니다

0

222

1

전체적인 헥사고날 아키텍쳐 설명

0

275

1

주문, 결제 로직에 대해서 질문이 있습니다.

0

281

1

주문 번호 생성 방식 관련 질문 있습니다

0

927

1

R2DBC 관련해서 질문 드립니다.

0

586

3

payment 상태 업데이트 변경 메서드를 3개나 두는 이유가 궁금합니다.

0

230

2

'더 견고해지기 위해 남은 작업' 수업자료

0

298

1

혹시 코드 리뷰 신청해도 될까요...?

0

311

1