소셜 로그인 토큰 검증을 위해서 프록시 서버 -> 인증 서버로 호출을 하고 있다.
개발 후에 클라분들께 전달 드렸는데, 프록시 서버에서 해당 API 를 호출하자 인증서버 -> 프록시 서버로 응답하는 시간이 5초를 초과하여 타임아웃 에러
가 발생했다.
애플 토큰 검증이 다른 소셜 로그인과 달리 추가적으로 JWT를 생성하고 파싱하는 부분에서 시간이 많이 들거라 예상했다.
이제 로그로 각 메서드 실행시간을 찍어서 병목지점을 찾아보자.
메서드 명 | 소요 시간 |
---|---|
애플 인증 서버 호출 | 758ms |
JWT 생성 및 파싱 | 23ms |
몽고 DB 에서 데이터 조회 | 5522ms |
예상과 달리 병목지점은 조회 메서드였다.
개발환경이라 데이터가 4855593 개 밖에 없는데, 이상하다.
{
"_id": "uuid",
"providers": {
"kakao": {
"id" : "kakao_id",
"pushNotificationAgreed" : true
},
"apple": { // 새로 추가된 필드
"id" : "apple_id",
}
},
}
기존에 카카오 간편가입 밖에 없었지만, 애플 회원가입이 생기면서 providers 하위 필드에 apple 이 추가되었다.
db.SocialLoginInformation.find({"providers.apple.id":"431493942143"}).explain("executionStats")
... "executionStages": {"stage": "COLLSCAN", "nReturned": "0", "executionTimeMillisEstimate": "10364.051"}}
인덱스를 타지 않고, 풀스캔하고 있는 것을 알 수 있다.
COLLSCAN: 전체 스캔
IXSCAN: 인덱스 스캔
... "executionStages": {"stage": "IXSCAN", "nReturned": "0", "executionTimeMillisEstimate": "16.125", "indexName": "providers.kakao.id_1_createdAt_1", "direction": "forward"}}
컬렉션에 대한 인덱스 조회 결과 kakao.id 에 인덱스가 걸려있어 같은 조회 쿼리지만 시간 소요가 적었다. 당연하게도 인덱스를 타는 것을 볼 수 있다.
db.SocialLoginInformation.getIndexes()
db.SocialLoginInformation.createIndex({"providers.apple.id": 1}, { sparse: true, unique: true })
db.SocialLoginInfo.dropIndex("인덱스 이름")
db.SocialLoginInformation.find({"providers.apple.id":"431493942143"}).explain("executionStats")
db.SocialLoginInformation.getIndexes()
db.SocialLoginInformation.createIndex({"providers.apple.id": 1}, { sparse: true, unique: true })