Foundry
분산 ID 생성기 설계
고급
핵심

노드 번호를 나눠 주기

두 노드가 같은 번호를 쓰면 중복이다

유일성의 나머지 전제입니다. 같은 시각에 같은 노드 번호를 쓰는 노드가 둘이면 순번이 겹치는 순간 중복이 생깁니다.

번호를 주는 세 방법

방법성질
설정 파일에 적어 둔다가장 단순하다. 사람이 실수하면 겹친다
조정자에서 임대한다겹침을 막을 수 있다. 부품이 하나 늘어난다
호스트 정보로 계산한다자동이다. 값이 겹칠 수 있고 재현이 어렵다

발급기 64대 를 사람이 관리하는 규모라면 설정 파일도 충분합니다. 다만 자동으로 늘고 줄어드는 환경에서는 사람이 따라갈 수 없습니다.

임대의 함정: 성급한 재사용

노드 번호를 성급히 재사용하면 두 노드가 같은 번호로 같은 시각에 발급한다 번호 7 을 쓰던 노드가 죽은 것으로 보였다 옛 노드 번호 7 응답이 없다. 실은 살아 있었다 새 노드 번호 7 같은 번호를 받았다 둘이 같은 밀리초에 같은 순번을 쓰면 같은 ID 가 나온다 그래서 번호를 다시 주기 전에 시간을 둔다 그 번호로 쓴 마지막 시각을 지나야 재사용할 수 있다 응답이 없는 것과 죽은 것은 다르다

임대 방식에서 노드가 응답하지 않으면 그 번호를 회수해 다른 노드에 줍니다. 그런데 응답이 없는 것과 죽은 것은 다릅니다. 잠깐 끊겼던 노드가 살아 있으면 같은 번호를 쓰는 노드가 둘이 됩니다.

그래서 번호를 다시 주기 전에 시간을 둡니다.

그 번호로 발급에 쓴 마지막 시각을 지나야 재사용할 수 있다
그 시각 이후로는 겹칠 수 없다

시간이 겹침을 막는 장치입니다. 시각 칸이 이미 ID에 있으므로, 마지막 사용 시각을 지나면 옛 노드가 살아 있어도 같은 값을 만들 수 없습니다.

번호가 부족해지는 환경

컨테이너 환경에서는 노드가 하루에 수백 번 생기고 사라집니다. 번호 칸이 10비트면 1,024개인데, 반납하지 않으면 하루 만에 소진됩니다.

대응내용
정상 종료 때 반납한다대부분의 경우를 덮는다
임대에 만료를 둔다비정상 종료를 덮는다
만료 뒤 유예를 둔다성급한 재사용을 막는다

세 장치가 함께 있어야 합니다. 반납만 있으면 갑자기 죽은 노드의 번호가 영원히 묶이고, 만료만 있으면 성급한 재사용이 생깁니다.

번호를 못 받으면 발급하지 않는다

시작할 때 번호를 받지 못하면 어떻게 할지 정해야 합니다. 임의의 번호를 골라 시작하면 겹칠 수 있습니다.

받지 못하면 발급을 시작하지 않는 것이 맞습니다. 시계 문제에서와 같은 원칙입니다. 시작 실패는 눈에 보이고 회복되지만, 중복은 조용하고 회복되지 않습니다.

사후 검증을 함께 둔다

구조로 막았어도 확인 장치를 둡니다. 발급한 ID의 중복 여부는 저장소의 유일 제약이 잡아 줍니다.

그 제약이 걸리는 것은 심각한 신호입니다. 시각 되돌림이나 번호 겹침 중 하나가 일어났다는 뜻이므로, 오류 하나로 보지 않고 즉시 원인을 찾아야 합니다.

면접에서 이렇게 나옵니다

Q.노드 번호를 어떻게 나눠 주시겠습니까

조정자에서 임대하고, 시작할 때 받지 못하면 발급을 시작하지 않습니다.

방법성질
설정 파일단순하다. 사람이 실수하면 겹친다
조정자 임대겹침을 막는다. 부품이 하나 늘어난다
호스트 정보로 계산자동이다. 값이 겹칠 수 있다

발급기 64대 를 사람이 관리한다면 설정 파일도 충분합니다. 자동으로 늘고 줄어드는 환경에서는 임대가 필요합니다.

흔한 실수: 번호를 받지 못했을 때 임의의 값으로 시작하는 것. 겹칠 수 있고, 겹치면 중복이 생깁니다. 시작 실패는 눈에 보이지만 중복은 조용합니다.

Q.노드 번호 재사용의 위험은 무엇인가요

응답이 없는 것과 죽은 것이 다르기 때문입니다.

임대 방식에서 응답하지 않는 노드의 번호를 회수해 다른 노드에 주면, 잠깐 끊겼던 노드가 살아 있을 때 같은 번호를 쓰는 노드가 둘이 됩니다. 순번이 겹치는 순간 중복입니다.

그 번호로 발급에 쓴 마지막 시각을 지나야 재사용할 수 있다
그 시각 이후로는 같은 값을 만들 수 없다

시각 칸이 이미 ID에 있으므로 시간이 겹침을 막는 장치가 됩니다.

흔한 실수: 감지를 빠르게 만들어 회수를 서두르는 것. 빠른 감지는 잘못된 감지를 늘리고, 이 설계에서 잘못된 회수의 결과는 중복입니다. 늦게 회수하는 편이 훨씬 안전합니다.

Q.노드가 자주 생기고 사라지는 환경은 어떻게 다루나요

반납과 만료와 유예를 함께 둡니다.

번호 칸이 10비트면 1,024개인데 컨테이너 환경에서는 하루에 수백 번 노드가 바뀌므로 반납하지 않으면 곧 소진됩니다.

장치무엇을 덮나
정상 종료 때 반납대부분의 경우
임대 만료비정상 종료
만료 뒤 유예성급한 재사용

세 개가 함께 있어야 합니다. 반납만 있으면 갑자기 죽은 노드의 번호가 영원히 묶이고, 만료만 있으면 성급한 재사용이 생깁니다.

흔한 실수: 번호 칸을 늘려 소진을 피하려는 것. 칸의 합이 정해져 있어 다른 칸이 줄어듭니다. 수명이나 밀리초당 발급량을 내주는 셈이므로, 반납 절차를 만드는 편이 값싸습니다.

Q.중복이 실제로 생겼는지 어떻게 확인하나요

저장소의 유일 제약이 잡아 줍니다. 구조로 막았어도 확인 장치를 함께 둡니다.

그 제약이 걸리는 것은 심각한 신호입니다. 시각 되돌림이나 번호 겹침 중 하나가 일어났다는 뜻입니다.

제약 위반을 오류 하나로 보지 않는다
즉시 원인을 찾는다. 둘 중 하나다

발급기 쪽 지표로도 함께 봅니다. 시계 되돌림 감지 횟수와 번호 임대 실패 횟수가 그것입니다.

흔한 실수: 유일 제약 위반을 재시도로 넘기는 것. 재시도하면 다음 순번으로 성공할 수 있어 증상이 사라집니다. 그러면 원인이 남은 채로 계속 진행되고, 이미 나간 중복 ID는 그대로 남습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

분산 ID 생성기 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.