문제 정의
사실 수집
원인 추론
해결 방안
해결 시도
C 안 ⇒ Redis 의 Lock key 를 채택
비-동기성이 어느정도 유지된다고 판단이 되고, 로그인 기능에 이미 Redis가 사용중이기 때문에 작업이 용이
async createLockKey(key, id) {
const lockKey = `${this.prefix.LOCK}:${key}:${id}`;
const lockAcquired = await this.client.set(lockKey, 'LOCK', 'NX', 'EX', 5);
return lockAcquired;
}
해당 KEY 로 이미 LOCK 이 등록된 경우 0 을 RETURN 하는 set 의 기능을 활용
해결
// 동시성 제어
const lockAcquired = await redis.createLockKey('register', value.loginId);
if (!lockAcquired) {
logger.info(`[ AUTH: registerRequestHandler ] ALREADY_EXIST_ID ===>>> 동시 접근, 탈락`);
return config.FAIL_CODE.ALREADY_EXIST_ID;
}
// 중복 로그인 검사 KEY
const loginKey = await redis.createUserLogin(loginId.nickname);
if (!loginKey) {
logger.info(`[ AUTH: loginRequestHandler ] ALREADY_LOGGED_IN_ID ===>>> 이미 접속중인 ID`);
return config.FAIL_CODE.ALREADY_LOGGED_IN_ID;
}