라이브 서비스 중인 코드중 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 |