somoly.tistory.com

라이브 서비스 중인 코드중 DB 샤딩을 하는 코드의 일부분을 가져와 보았습니다.

<?php

$serverList = [
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
    "ko-live.aws.rds.com:3306",
];

$serverListCount = count($serverList);

// userNo 숫자 : 18899626759716424
// userNo UUID 형식 : 1b2a6d9aeddd4dd1a245c33c643ccc31
function getServer($userNo)
{
    global $serverListCount;
    global $serverList;

    $s = $serverList[0];

    if (strpos($s, 'ko') !== false) {
        if (is_numeric($userNo)) {
            $retUserNoRe = bcmod($userNo, $serverListCount);
            return $retUserNoRe;
        }

        return 0;
    }

    $lastChar = substr($userNo, -1);
    if (is_numeric($lastChar)) {
        $retUserNoRe = bcmod($lastChar, $serverListCount);
        return $retUserNoRe;
    }

    $userNo = ord($lastChar);
    $userNo = $userNo % $serverListCount;
    $retUserNoRe = bcmod($userNo, $serverListCount);

    return $retUserNoRe;
}

 

1. 환경이 'ko' 인 경우

- userNo 가 문자열이면 무조건 0번

- 숫자형이면 userId 로 bcmod 적용

 

2. 환경이 'ko' 가 아닌경우 userNo 의 제일 마지막 char 를 이용

- 숫자이면 마지막 char 로 bcmod 적용

- 숫자가 아니면 마지막 char 를 ord 를 이용하여 아스키 코드로 변환하여 mod 한 후 다시 bcmod 를 적용

 

bcmod() 함수

bcmod(string num, string modulus);

num 를 modulus 로 나눈 후 나머지 값을 문자열로 반환하는 함수입니다.

 

도대체 무엇을 하려고 한 것인가?

'백엔드' 카테고리의 다른 글

mysql 8.0 password reset  (0) 2023.06.27
Http URL  (0) 2023.03.21
프로젝트 탄생 25주년을 기념하여 curl 8.0 출시  (0) 2023.03.21
OAuth2  (0) 2023.03.21
What is Redis?  (0) 2023.03.21
profile

somoly.tistory.com

@RxCats

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!