inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

결제 관련 서킷 브레이커 전략, 데이터 정합성 및 타임아웃 설정 질문

해결됨

제미니의 개발실무 - 커머스 백엔드 기본편

안녕하세요, 제미니님! 강의 완독 후, 결제 시스템의 안정성을 높이기 위해 개인 프로젝트에 외부 PG사 연동 구간에 장애 격리 처리를 직접 구현하며 경험하고 있습니다. 구현 과정에서 고민했던 설계 내용과 제 나름의 가설이 맞는지, 그리고 기존 강의 코드의 설정 의도에 대해 여쭤보고 싶습니다. 🙇🏻‍♂️ 1. 서킷 브레이커 도입 및 트랜잭션 분리 전략 @Component class BeeceptorPaymentClient( private val restClient: RestClient, private val circuitBreaker: CircuitBreaker, ) : PaymentClient { private val log = LoggerFactory.getLogger(javaClass) override fun requestPayment(command: PaymentCommand): PaymentResult { return circuitBreaker.run("beeceptor-payment") { executePayment(command) } .fallbackIfOpen { log.warn("[Circuit Open] Beeceptor 결제 서비스 차단됨. 잠시 후 재시도 필요.") throw CoreException(ErrorType.PAYMENT_EXTERNAL_API_UNAVAILABLE) } .getOrElse { e -> when (e) { is HttpClientErrorException -> { log.warn("[PAYMENT_REJECTED] 결제 거절: ${e.responseBodyAsString}") throw CoreException(ErrorType.PAYMENT_REJECTED) } is CoreException -> throw e else -> { log.error("[PAYMENT_FAILED] Beeceptor 결제 호출 실패", e) throw CoreException(ErrorType.PAYMENT_EXTERNAL_API_FAIL) } } } } } 외부 PG사 장애 전파를 막기 위해 Resilience4j 를 도입했고, 테스트를 위해 Beeceptor를 활용했습니다. 설정 전략: COUNT_BASED (최소 10회, 실패율 50% Open), 단순 비즈니스 에러(4xx)는 ignoreExceptions 로 제외하여 시스템 장애만 감지하도록 설정했습니다. 트랜잭션 분리 (Facade 패턴): 트랜잭션에 대한 DB 커넥션 점유 시간을 최소화하기 위해 아래와 같이 로직을 3단계로 분리했습니다. 1. 검증: DB 조회 (ReadOnly 트랜잭션) 2. 외부 요청: 외부 PG API 호출 (No 트랜잭션 + 서킷 브레이커 적용) 3. 상태 업데이트 : 결제 결과 저장 (Write 트랜잭션) @Component class PaymentConfirmFacade( private val paymentService: PaymentService, private val paymentClient: PaymentClient, ) { fun success(orderKey: String, externalPaymentKey: String, amount: BigDecimal): Long { // 1. [DB Transaction] 결제 검증 val command = paymentService.validatePayment(orderKey, externalPaymentKey, amount) // 2. [No Transaction] 외부 API 호출 val paymentResult = paymentClient.requestPayment(command) // 3. [DB Transaction] 결제 완료 처리 // 외부 API에서 받은 결과(transactionId 등)를 넘겨줌 return paymentService.completePayment(orderKey, paymentResult) } } [질문] Facade 패턴을 적용함에 따라 '외부 요청'(2번)은 성공했으나, '상태 업데이트 및 저장'(3번)에서 DB 장애 등으로 실패할 경우 데이터 불일치가 발생합니다. 현재 로직상 completePayment 가 실패하면 트랜잭션이 롤백되어 TransactionHistory 조차 남지 않고 Payment 상태는 READY 로 유지됩니다. 따라서 저는 배치/스케줄러 를 통해 일정 시간이 지나도 READY 상태로 남아있는 결제 건들을 조회한 뒤, PG사 결제 내역 조회 API와 크로스 체크 하여 누락된 결제를 보정하는 로직이 필요하다고 판단됩니다. 이러한 접근 방식이 실무에서사용하는 일반적인 보정 패턴인지 궁금합니다. 2. DB Connection/Socket Timeout 설정 의도와 Facade 적용 시의 상관관계 외부 API 타임아웃(Connect 3s, Read 30s)을 학습하며 적용하던 중, 기존 강의 프로젝트의 db-core.yml 설정이 눈에 들어왔습니다. connection-timeout: 1100 (1.1초) socketTimeout: 3000 (3초) [질문 1] 보통 DB 타임아웃을 넉넉하게 잡는 경우도 있는데, 이렇게 타이트하게 설정하신 의도가 "트래픽 급증 시 DB 커넥션을 얻지 못하면 빠르게 실패 처리 하여 스레드 풀 고갈을 막고 시스템 전체 장애를 방지 하기 위함" 인지, 혹은 다른 운영 노하우가 담겨 있는 것인지 궁금합니다. [질문 2] 저는 Facade 패턴을 적용하여 외부 API 호출 시점에는 트랜잭션(DB Connection)을 점유하지 않도록 분리 했습니다. 따라서 기술적으로는 DB 타임아웃과 서킷 브레이커(외부) 타임아웃을 서로 독립적인 관점으로 설정해도 된다고 판단했습니다. 다만, 실무 운영 관점에서는 결국 '전체 사용자 대기 시간(User Latency)' 이라는 제약이 존재할 텐데, 이때 전체 응답 시간 제한 내에서 DB와 외부 API 타임아웃 비중을 어떻게 배분하시는지 강사님만의 기준이나 노하우가 궁금합니다 ! 긴 글 읽어주셔서 감사합니다.

  • kotlin
  • spring-boot
  • 도메인
  • dbms/rdbms
  • backend
  • 서킷브레이커
  • 타임아웃
devfancy 댓글 2 좋아요 2 조회수 220

ec2 접속 시도시 타임아웃 에러가 발생합니다.

미해결

풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, 배포까지) [풀스택 Part3]

안녕하세요. ec2 접속 부분에서 자꾸만 타임아웃 에러가 나서 접속이 불가능한 상황인데, 해결할 방법을 찾지 못해서 질문 드립니다. 관련 강의 부분은 클라우드 서비스(AWS 서비스 구축) 챕터의 EC2 접속 강의 3분 10초 쯤에 있습니다. 에러 메시지는 다음과 같습니다. ssh: connect to host 3.36.244.35 port 22: Operation timed out 우선 회사 vpn 때문인가 하여 vpn을 끄고 시도해도 계속 같은 에러가 나구요, Security Group의 Inbound Rule을 체크하라고 해서 해보았는데 22 port의 ssh type으로 0.0.0.0/0 설정이 이미 되어 있습니다. 어떤 점을 더 체크해보면 좋을지 질문 드립니다..!

  • ssh
  • docker
  • ec2
  • linux
  • timeout
  • 타임아웃
  • network
기쁜 까마귀 댓글 1 좋아요 0 조회수 995

인기 태그

인프런 TOP Writers

주간 인기글