해피정

소셜로그인 회원가입시 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 에서 개선하겠다고 하셨으니 좋은 대안이 마련될것으로 기대합니다
댓글을 작성하시려면 로그인이 필요합니다.
+
제목 글쓴이 날짜 조회
21-04-04 조회 6,820
21-04-03 조회 7,516
21-04-01 조회 7,513
21-03-27 조회 8,059
21-03-16 조회 7,293
21-03-16 조회 7,878
21-03-15 조회 9,171
21-03-10 조회 6,052
21-03-09 조회 8,606
21-03-09 조회 9,460
21-03-08 조회 7,022
21-03-08 조회 9,895
21-03-07 조회 6,310
21-03-05 조회 6,993
21-03-04 조회 9,037
21-02-26 조회 7,081
21-02-24 조회 6,197
21-02-20 조회 9,543
21-02-16 조회 8,610
21-02-16 조회 6,616
21-02-14 조회 1.7만
21-02-11 조회 8,038
21-02-03 조회 6,674
21-02-01 조회 6,807
21-01-31 조회 8,716
21-01-30 조회 6,239
21-01-29 조회 7,594
21-01-29 조회 7,125
21-01-28 조회 7,582
21-01-28 조회 1만