caffeine-library / system-design-interview

🌱 가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽는 스터디
4 stars 0 forks source link

[question] ID 생성기의 use case #23

Closed wooyounggggg closed 2 years ago

wooyounggggg commented 2 years ago

질문

책 7장에서는 ID 생성기가 필수 불가결한 컴포넌트이므로 높은 가용성을 요구한다고 합니다. 그런데 경험상 ID 생성기라는 시스템은 생소하기도 하고, 필수 불가결한 정도는 아니라고 생각하는데 어떤 곳에 ID 생성기를 사용하기에 저렇게 언급하는 것인지 궁금합니다.

연관 챕터

21

@caffeine-library/readers-system-design-interview

ngwoon commented 2 years ago

책 전반적인 맥락을 봤을 때 분산 환경에서의 내용을 다루고 있는 것으로 보아 분산 환경에서는 ID생성기가 필수 불가결한 컴포넌트라고 말하고 싶었던 것 같습니다.

use case로는 분산 RDB를 생각해 봤습니다. 분산 RDB는 6장에서 다뤘던 안정 해시 구조라고 가정해 보겠습니다. 지속성, 가용성을 위해 레플리카 서버 개수를 3개로 잡는다면, 해시 링 위에서 3개의 가상 노드는 동일한 데이터들을 관리하게 됩니다. (이 가상 노드들을 각각 A, B, C라고 하겠습니다.) 이러한 분산 RDB에 유저 테이블이 존재하고, 백엔드 애플리케이션 (이하 클라이언트) 에서 회원가입 서비스를 제공한다는 상황을 상상해 보겠습니다.

서로 다른 두 클라이언트에서 거의 동시에 분산 RDB에 각각 한 명씩 유저 저장 (남관우, 지우영)을 요청했다면, coordinator에서 그 요청을 A, B, C에 포워딩할 것입니다. 이 때 네트워크 상태에 의해 A에는 남관우, 지우영 순으로 저장 요청이 왔고, B에는 지우영, 남관우 순으로 요청이 왔습니다. 결과적으로 A에는 PK 1 - 남관우, PK 2 - 지우영 이렇게 저장이 될 것이고, B에는 PK 1 - 지우영, PK 2 - 남관우 이렇게 저장이 될 것입니다. 후에 관리자가 유저를 회원가입 순으로 조회하고자 PK 오름차순으로 조회 쿼리를 던진다면, 이 요청이 A에 의해 처리된 결과와 B에 의해 처리된 결과가 다르게 됩니다. 즉, SELECT 쿼리의 멱등성(?)이 지켜지지 않게 됩니다.

이 use case를 생각해보면서, 분산 시스템이 갖는 여러 불안정한 요소 때문에 시간적 순서가 지켜져야 하는 데이터는 클라이언트 측에서 ID를 생성해서 직접 넣어주는 것이 더욱 안정적이므로 ID 생성기가 반드시 필요한 컴포넌트라고 책에서 언급했구나 라는 생각이 들었습니다.

JasonYoo1995 commented 2 years ago

ID의 역할

ID 없이도 운영 가능하다

만약 RDB에서 ID를 사용하지 않고 엔티티를 찾으려면 ID와 같은 역할을 하는 "무언가"를 사용해야 할 것입니다. 1) "select from table_name where column_name=value"에서 where절에 들어가는 컬럼이 ID의 역할을 할 수도 있고 (즉, Unique 제약 조건이 들어간 컬럼) 2) "select from table_name where column_name1=value1 and column_name2=value2"에서 where절에 들어가는 컬럼들의 조합이 ID의 역할을 할 수도 있을 것입니다. (단, 컬럼들의 조합은 유일해야 합니다)

성능이 문제라면 해당 컬럼들을 Indexing하면 됩니다.

그런데 왜 분산 시스템에서 ID를 '필수 불가결'하다고 표현한 걸까?

저는 다음과 같은 순서로 논리를 펼칠 것입니다.

기본 키(PK)에 대해 알아보자

PK가 없는 전략의 문제점

ID가 아닌 값을 PK로 사용하는 전략의 문제점

바람직한 PK 전략

분산 시스템에서의 ID Use Case

결론

(PK를 쓰지 않고 UI(=Unique Index)만으로 쓰는 것이 더 좋다고 주장하는 등 일부 논란의 여지는 있지만) RDB를 쓰는 엔터프라이즈 앱에서는 비즈니스 요구사항이 빠르게 바뀌므로 스키마의 변경이 잦고 따라서 모든 테이블에 PK를 미리 만들어두는 편이 장기적으로 볼 때 유리하다. 그런데 이때, ID는 '중복되지도 않고 NULL 값을 가질 수 없어야 한다'는 PK의 조건을 모두 충족하므로 PK는 ID로 구성하는 것이 좋다. 따라서 단일 시스템에서 ID 생성기는 필수 불가결하다고 주장할 수 있고 분산 시스템에서도 역시 ID 생성기는 필수 불가결하다고 주장할 수 있다.

참고