해피정

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

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,231
4년 전 조회 4,196
4년 전 조회 4,591
4년 전 조회 3,940
4년 전 조회 4,728
4년 전 조회 5,943
4년 전 조회 2,907
4년 전 조회 5,346
4년 전 조회 6,130
4년 전 조회 3,962
4년 전 조회 6,464
4년 전 조회 3,343
4년 전 조회 3,854
4년 전 조회 5,683
4년 전 조회 4,037
4년 전 조회 3,254
4년 전 조회 6,452
4년 전 조회 5,282
4년 전 조회 3,508
4년 전 조회 1.3만
4년 전 조회 4,932
4년 전 조회 3,658
4년 전 조회 3,880
5년 전 조회 5,508
5년 전 조회 3,155
5년 전 조회 4,458
5년 전 조회 4,019
5년 전 조회 4,420
5년 전 조회 6,674
5년 전 조회 2,971
🐛 버그신고