개요
평균 400ms 전후의 responseTime의 API 요청이 평균 1000ms까지 올라간 정황을 파악했다.
CloudWatch의 Logs insight를 통해 responseTime 로그를 확인해보니 10초 이상의 응답시간을 가진 API 지속적으로 호출되고 있어 평균치를 올리고 있는 것으로 보인다.
위 결과와 같이 응답까지 최대 19초까지 걸리는 API도 확인되고 있다.
개선진행
10초 이상 응답지연이 발생한 API 목록은 아래와 같다
url | method | 설명 | 중요도 | 상태 |
/iamport-web-hook/web-hook | POST | 결제관련 API | 높음 | |
/vehicle-details?vehicleNumber=372%EA%B0%808969&owner… | POST | 차량등록 관련 API | 보통 | |
/customer/pending-orders | POST | 주문생성 API | 높음 | 개선완료 |
/v2/promotions, /v2/promotions/:id | GET | 프로모션 조회 API | 매우높음 | 개선완료 |
/v2/reviews/recent, /v2/reviews | GET, POST | 리뷰 호출 API | 매우높음 |
GET /v2/promotions
최근 당일장착 프로모션 진행으로 인해 /v2/promotions API가 지속적으로 호출되고 있으나
해당 건은 확인결과 for문 내의 await/async 문을 사용하게 되면서 반복문이 중첩되는 이슈였다.
반복문 내의 await문이 순차대로 실행되지 않도록 비동기 처리후 10000ms 전후에서 → 1000ms 전후로 성능이 크게 개선되었다.
Logs insights 결과
POST /iamport-web-hook/web-hook
/iamport-web-hook/web-hook 의 경우 내부 로직에 사용되는 쿼리 중 불필요하게 많은 JOIN이 발견되었다. 실제로 사용되지 않는 JOIN이 불필요한 오버헤드를 발생시키고 있었고 필요한 값만 호출하도록 변경하였다.
모니터링 결과 해결되지 않았다.
POST /customer/pending-orders
사용자가 상품을 구매하기 위한 절차로 주문을 생성하는 API이며 성능 저하는 크리티컬하다고 할 수 있다.
분석결과 아래와 같이 특정 쿼리의 EXPLAIN cost가 높게 측정되고 있다.
이유는 최근 추가된 컬럼이 INDEX에 추가되지 않았던 것으로 보이며, 기존 로직 또한 불필요한 호출이 발생하고 있었다.
Update on "Order" o (cost=192639.09..205723.41 rows=1054 width=580)
-> Nested Loop (cost=192639.09..205723.41 rows=1054 width=580)
-> Subquery Scan on sub_order (cost=192638.67..197498.38 rows=1054 width=32)
-> HashAggregate (cost=192638.67..197487.84 rows=1054 width=4)
Group Key: o2.id
Filter: (count(oi2.id) = count(oi2."deletedAt"))
Planned Partitions: 8
-> Hash Right Join (cost=29637.84..177543.09 rows=226788 width=16)
Hash Cond: (oi2."orderId" = o2.id)
-> Seq Scan on "OrderItem" oi2 (cost=0.00..136408.26 rows=861326 width=16)
-> Hash (cost=26179.39..26179.39 rows=210756 width=4)
-> Seq Scan on "Order" o2 (cost=0.00..26179.39 rows=210756 width=4)
Filter: ("deletedAt" IS NULL)
-> Index Scan using "PK_3d5a3861d8f9a6db372b2b317b7" on "Order" o (cost=0.42..7.80 rows=1 width=544)
Index Cond: (id = sub_order.id)
SQL
복사
index 추가
CREATE INDEX "IDX_orderId" ON "OrderItem" ("orderId"); //default b-tree
CREATE INDEX "IDX_productId" ON "OrderItem" ("productId"); //default b-tree
SQL
복사
INDEX 추가와 동시에 로직 개선을 병행하고나니 아래와 같이 1000ms대로 응답시간이 개선되었다.
POST /vehicle-details
차량등록 API로서 차량정보를 가져오는 외부업체의 API 성능이 5-6초 이상 걸리는 것으로 보인다.
해당 건은 업체측에 개선요청이 필요해보인다.
POST /v2/reviews
사용된 Logs insights 쿼리
# 하루 평균 요청
fields url, @timestamp, @message
| filter statusCode < 400
| stats avg(responseTime) by bin(1d) // 30m, 1h ...
# 10초 이상 지연이 발생한 요청
fields url, method, responseTime
| sort @timestamp desc
| filter responseTime > 10000
| limit 10000
Plain Text
복사