안녕하세요 현재 정기결제를 구현하고있습니다.
정기 결제를 구현하고나서, 실제 결제가 이루어지는것을 확인했습니다. 근데 매달 돈을 빠져나가게하는 거는 CustomerKey랑 빌링키로 다음달에 자동으로 결제하도록 Batch를 만들었습니다.
저희가 배치로 정기결제를 진행하는 프로세스는 특정 날짜에 1시간 간격으로 회원이 결제한 시간에 정기결제를 매달 진행하고 있는데요, 여기서 Batch의 레이턴시를 줄이고자 비동기와 쓰레드를 이용해서 구현하고 있습니다.
단건 테스트를 진행했을 때에는 문제가 없었으나, 병렬 처리할 떄 에러가 발생합니다.
에러 메시지 = {"code":"FAILED_INTERNAL_SYSTEM_PROCESSING","message":"[S008] 기존 요청을 처리중입니다."}
https://api.tosspayments.com/v1/billing/ 해당 url로 빌링페이 요청을 했을 때 병렬 처리할 떄 다음과 같은 에러가 발생합니다.
빌링페이를 요청하는 API가 병렬처리를 지원하지 않나요?
여러건에 대해서 정기결제가 들어올 수 있어서 병렬처리를 진행하려고 하는데, 다른 방법이있을까요?
[시나리오]
Thread수 3개
해당 시간에 배치처리할 결제 건수 4개
3개가 병렬로 결제처리를 요청했지만, 사진과 같이 두개의 에러가 발생했습니다.
하지만 디비에 쌓일떄는 2개가 성공하였고 1개가 실패했습니다.
실패 이후 1분뒤에 다시 배치가 돌아서 이전에 실패한 1건과, 새로운 1건 해서 총 2건이 2차시도 배치에서 돌았습니다.
병렬처리를 하기위해 어떤 조치를 해야할지 궁금합니다!
11 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
그렇게 응답을 받으신 건에 orderId값이나 customerKey값을 알려주실 수 있으신가요?
toss_1731634500242
toss_1731634500237
이렇게 두건이 응답을 사진과 같이 받았는데,
1분뒤에 배치가 다시 돌아서 결국 성공은했습니다. 근데 제가 원하는거는 동시에 10개정도를 병렬로 처리하고자합니다!
보내드린건 orderId입니다
네, 병렬요청 지원하지 않습니다.
@김대현 "기존 요청을 처리중..." 메시지를 받았을때의 request body 전달 가능하실까요?
주문번호를 한개만 명시한 다건의 결제라면 그런 에러가 발생할 수 있습니다.
스레드로 분기를 한 상태에서 각자 별도의 주문번호로 각자의 트렌젝션이 개시되었다면 처리되었을거에요.
유부장님께서 안내주신 병렬요청 지원은 한개의 트렌젝션에 여러개의 거래를 담으면 안된다는 의미입니다
당사 API 중 request body 예시가 배열로 명시되어있지 않은 API 는 다건을 요청주시면 안됩니다. 하나의 거래에 한건만 처리하면 괜찮구요
💡 정보 제출
민감 정보를 안전하게 제출해주세요
총 3개의 건을 병렬로
{
"customerKey":"customerKey",
"amount":"amount",
"orderId":"orderId",
"orderName":"orderName",
"customerEmail":"customerEmail",
"taxFreeAmount":"taxFreeAmount"
}
이렇게 body에 담아서 빌링페이 API요청을 하고있었습니다.
이때 orderId는 String orderId = "toss_" + System.currentTimeMillis(); 이렇게 처리했습니다.
병렬 처리를 진행할때, 한 건에대해 하나의 빌링페이를 진행하는데,
트랜잭션 {
//결제 주문 테이블 저장
//빌링페이 API요청
//TOSS 결제 확인 API
//결제 테이블 저장
}
이렇게를 하나의 트랜잭션으로 묶고 병렬처리를 진행합니다!
동일한 mid 내에서 주문번호는 중복이 되면 안됩니다
"toss_" + System.currentTimeMillis(); 이런형태는 당연히 중복이 발생하구요
발생하지 않은 거래가 있다면 운이 좋으셨던거 같습니다
지금 찾으셔서 더 좋은 상황같아요
주문번호는 가맹점 DB에 담으셔야하는 값이기도해서 생성시 중복위험이 없는 로직으로 만들어 주시는것이 좋습니다. UUID 를 생성하여 사용하시거나 DB 시퀀스와 결합한 형태로 사용하시는것을 권장드려요
밀리세컨드단위라서 동시에 요청해도 충돌이안날거라 생각했는데, 중복이 되는군요 답변주셔서 감사합니다!!
넵, 좋은 서비스 만드시길 바랍니다!
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.