back-end/🐾 삼냥이즈 트러블슈팅 2

[삼냥이즈 트러블슈팅] MySQL Deadlock 원인 분석과 해결

이슈서비스를 운영하던 중 유저가 늘어나자 일부 API에서 데드락 문제가 발생했다.당시 서비스는 DAU가 약 400명 정도 되는 상황이었다. 종종 서버 로그에 데드락 문제가 관찰되었고, 이에 관한 유저의 피드백도 제기되던 상황이었다. 1차 원인 추측데드락은 서로 다른 트랜젝션이 서로가 가진 lock을 기다리면서 순환 대기 상태가 되는 경우 발생한다. 당시 나는 트랜잭션을 원자성을 보장하는 도구 정도로만 이해하고 사용하고 있었다. 여러 로직을 하나의 작업 단위로 묶기 위해 트랜잭션을 사용했고, 트랜잭션의 범위에 대해서는 깊게 고민하지 않았던 상태였다. 이 부분에서 문제가 생겼을 것이라 생각하고 관련 자료를 찾아보던 중 트랜젝션은 가능한 짧게 유지해야 한다는 조언을 보게 되었다.당시 로깅 같은 비핵심 작업도..

[삼냥이즈 트러블슈팅] Typeorm Findone()

이슈현재 클라이언트는 서버로부터 access 토큰 및 refresh 토큰을 발급 받고, 시간이 지나 토큰이 만료되면 서버에 저장된 토큰 데이터를 이용해 재발급 받는 방식이다. 개발을 하던 와중 창준이 계정의 토큰이 만료된 후 다시 접속하면 돈이나 경험치, 장비 등의 개수 등이 서버에 있는 값과 다르게 전달되고, 결제 등을 하면 창준이 계정의 인벤토리가 아닌 내 계정의 인벤토리 정보가 수정되는 것을 발견하였다. 테스트 결과 access token이 만료되어 재발급 하는 과정에서 refresh token 을 비워서 보내면 뜬금없이 내 계정에 대한 JWT 토큰이 발급되는 것을 확인하였다. 원인 async findByRefreshToken(refreshToken: string): Promise { ret..