해피정

소셜로그인 회원가입시 SELECT 쿼리 과부하 현상

[주] 이후 강좌수정내용의 업데이트가 안될수 있습니다.
본 강좌의 최신업데이트는 https://www.happyjung.com/lecture/2978 에서 확인가능합니다.
가급적 동일한 내용을 유지하려고 노력하지만, 우선 작업은 위 링크입니다.


AWS 관리해주는 업체에서 아래와 같은 레포팅을 받았습니다

최근들어 RDS CPU 알람이 많이 발생합니다
추측이 되는 부분에 대하여 말씀드리겠습니다
g5_social_nick_error_20210225_1.png

SELECT COUNT (*) AS `cnt` FROM `g5_member` where `mb_nick` = ? AND `mb_id` != ''

select count(*) as cnt from g5_member where mb_nick = '46' and mb_id <> ''
select count(*) as cnt from g5_member where mb_nick = '209' and mb_id <> ''
select count(*) as cnt from g5_member where mb_nick = '113' and mb_id <> ''
select count(*) as cnt from g5_member where mb_nick = '114' and mb_id <> ''
숫자만 바꾸어서 1초에 몇개의 쿼리가 지속적으로 발생하고 있습니다

이것을 유추해보면 아래의 함수가 작동하는 것으로 판단되며,
소셜로그인(네이버, 다음)에서 계속 쿼리를 요청하고 있습니다

plugin / social / includes / functions.php  1007~1018줄 내용
function exist_mb_nick_recursive($mb_nick){
    static $count = 0;

    $mb_nick_add = ($count > 0) ? $mb_nick.(string)$count : $mb_nick;

    if( ! exist_mb_nick($mb_nick_add, '') ){
        return $mb_nick_add;
    }
    
    $count++;
    return exist_mb_nick_recursive($mb_nick);
}

lib / register.lib.php  76~84줄 내용
function exist_mb_nick($reg_mb_nick, $reg_mb_id)
{
    global $g5;
    $row = sql_fetch(" select count(*) as cnt from {$g5['member_table']} where mb_nick = '$reg_mb_nick' and mb_id <> '$reg_mb_id' ");
    if ($row['cnt'])
        return "이미 존재하는 닉네임입니다.";
    else
        return "";
}


g5_social_nick_error_20210225_2.png


소스를 확인해보니 소셜로그인에서 닉네임이 넘어오지 않는 경우 회원 테이블에서 닉네임을 0 부터 순차적으로 조회를 반복하는 과정이 발생한 것이 었습니다
소셜 회원수가 적은 경우는 별 영향이 없겠으나, 위 사이트는 소셜회원만 수천명이 활동중인 중규모 이상의 서비스 사이트라서 cont 가 0 부터 2000번 이상까지 조회를 반복하는 것이 원인이었습니다

SIR 버그레포트를 제출했으면 차후 버전에서는 수정하겠다고 합니다.
그누보드  5.4.5.1 ( 2021-02-05 배포) 버전까지는 이것에 대한 수정이 필요합니다


g5_social_nick_error_20210225_3.png


plugin / social / includes / functions.php

function exist_mb_nick_recursive($mb_nick){
    static $count = 0;

    $mb_nick_add = ($count > 0) ? $mb_nick.(string)$count : $mb_nick;


를 아래와 같이 변경합니다


function exist_mb_nick_recursive($mb_nick){
    global $mb_id;
    static $count = 0;

    //$mb_nick_add = ($count > 0) ? $mb_nick.(string)$count : $mb_nick;
    $mb_nick_add = ($count > 0) ? str_replace('_','',$mb_id).substr(md5(microtime()), 0, 3).(string)$count : $mb_nick;

|

댓글 10개

좋은 정보 감사합니다 :)
현재 그누 5.3버전을 이용하고 있는데,
그누 5.3버전에서도 function exist_mb_nick_recursive($mb_nick){ 해당 내용을 수정하면 도움이 되나요?
@동글이 그누보드 소셜로그인 시작부터 지금까지 동일한 문제가 있습니다
소셜로그인이 활발하지 않은 경우는 이것이 문제되지 않은것 뿐이지요
감사합니다.
좋은 정보네요
감사합니다!
이번 버전 업데이트 할때 저거 참고했으면 ㅋㅋㅋ
좋은정보 감사합니다.
mb_nick 인덱스 추가후, 쿼리에 use mb_nick 으로 강제 힌팅을 주면 일단 수습은 되겠네요.

어떻게해도 닉이름 중복처리가 깔끔하진 않네요.
@솔그루 소셜에서 닉네임 정보를 받으면 제일 좋겠지만,
그것역시 중복체크에 헛점이 있습니다
sir 에서 개선하겠다고 하셨으니 좋은 대안이 마련될것으로 기대합니다
댓글을 작성하시려면 로그인이 필요합니다.

그누보드5 팁자료실

+
제목 글쓴이 날짜 조회
4년 전 조회 4,305
4년 전 조회 4,281
4년 전 조회 4,684
4년 전 조회 4,023
4년 전 조회 4,801
4년 전 조회 6,027
4년 전 조회 2,980
4년 전 조회 5,447
4년 전 조회 6,245
4년 전 조회 4,042
4년 전 조회 6,600
4년 전 조회 3,409
4년 전 조회 3,937
4년 전 조회 5,951
4년 전 조회 4,112
5년 전 조회 3,328
5년 전 조회 6,532
5년 전 조회 5,377
5년 전 조회 3,573
5년 전 조회 1.3만
5년 전 조회 5,006
5년 전 조회 3,728
5년 전 조회 3,944
5년 전 조회 5,584
5년 전 조회 3,222
5년 전 조회 4,530
5년 전 조회 4,087
5년 전 조회 4,497
5년 전 조회 6,790
5년 전 조회 3,039