대규모 분산 시스템에서 ObjectId와 UUID의 충돌 확률
UUID rfc 4122(16바이트)가 MongoDB ObjectId(12바이트)보다 훨씬 크다는 점을 고려하여 충돌 확률이 어떻게 비교되는지 알아보고 있습니다.
거의 불가능하다는 것은 알지만, 제 경우 대부분의 ID는 제한된 서버 집합이 아닌 다수의 모바일 클라이언트에서 생성됩니다.저는 이 경우에 정당한 우려가 있는지 궁금합니다.
모든 ID가 소수의 클라이언트에 의해 생성되는 일반적인 경우와 비교:
- 문서가 생성된 이후 충돌을 감지하는 데 몇 달이 걸릴 수 있습니다.
- ID는 훨씬 더 큰 클라이언트 기반에서 생성됩니다.
- 각 클라이언트의 ID 생성률이 낮습니다.
이 경우 대부분의 ID는 제한된 서버 세트가 아닌 다수의 모바일 클라이언트에서 생성됩니다.저는 이 경우에 정당한 우려가 있는지 궁금합니다.
그것은 저에게 매우 나쁜 건축물처럼 들립니다.2계층 아키텍처를 사용하고 있습니까?모바일 클라이언트가 DB에 직접 액세스하는 이유는 무엇입니까?네트워크 기반 보안을 사용하시겠습니까?
어쨌든, 충돌 가능성에 대한 몇 가지 고려 사항:
UUID와 ObjectId는 순수한 크기에 의존하지 않습니다. 즉, 둘 다 랜덤 숫자는 아니지만 충돌 확률을 체계적으로 줄이려는 계획을 따릅니다.ObjectIds의 경우 구조는 다음과 같습니다.
- unix epoch 이후 4바이트 초
- 3바이트 시스템 ID
- 2바이트 프로세스 ID
- 3바이트 카운터
즉, UUID와 달리 ObjectId는 (단일 초 이내를 제외하고) 단조롭다는 의미이며, 이는 아마도 가장 중요한 속성일 것입니다.단조로운 인덱스는 B-Tree를 더 효율적으로 채울 수 있게 하며, id별 페이징을 허용하고 id별 '기본 정렬'을 통해 커서를 안정적으로 만들 수 있으며, 물론 추출하기 쉬운 타임스탬프를 제공합니다.이것들은 여러분이 알아야 할 최적화들이고, 그것들은 거대할 수 있습니다.
다른 세 구성 요소의 구조에서 알 수 있듯이, 단일 프로세스에서 1k개 이상의 삽입/초를 수행하는 경우(서버에서조차 불가능), 또는 시스템 수가 약 10개를 초과하여 증가하는 경우(생일 문제 참조), 또는 단일 시스템의 프로세스 수가 너무 증가하는 경우(그렇다면, 충돌 가능성이 매우 높습니다).이러한 숫자는 임의의 숫자는 아니지만 기계에서 실제로 고유하지만 2바이트로 단축해야 합니다.).
충돌이 발생하려면 이러한 모든 측면에서 일치해야 하므로, 두 시스템이 동일한 시스템 해시를 가지고 있더라도 클라이언트가 동일한 카운터 값을 동일한 초와 동일한 프로세스 ID에 삽입해야 하지만, 이러한 값이 충돌할 수 있습니다.
설명서에서 "ObjectId"에 대한 사양을 살펴보겠습니다.
개요
ObjectId는 다음을 사용하여 구성된 12바이트 BSON 유형입니다.
- 4바이트 값은 유닉스 시대 이후의 초를 나타냅니다.
- 3바이트 기계 식별자,
- 2바이트 프로세스 ID 및
- 임의의 값으로 시작하는 3바이트 카운터
이를 "모바일 클라이언트"의 맥락에서 고려해 보겠습니다.
참고: 여기서 컨텍스트는 "모바일 클라이언트"를 데이터베이스에 "직접" 연결하는 것을 의미하지 않습니다.그렇게 해서는 안 됩니다.그러나 "_id" 생성은 매우 간단하게 수행할 수 있습니다.
요점:
"epoch 이후의 초"에 대한 값입니다.그것은 요청당 상당히 무작위적일 것입니다.따라서 충돌이 그 구성 요소에 미치는 영향은 최소화됩니다.비록 "초"이지만.
"기계 식별자".그래서 이것은 다른 클라이언트가 생성하는 것입니다.
_id
가치. 이것은 더 이상의 "충돌" 가능성을 제거하고 있습니다.프로세스 ID입니다.이 씨앗에할 수 있는 에 ( 합니다) 된 것이 생성된 것입니다.
_id
충돌을 피할 가능성이 더 높습니다."임의 값"입니다.그래서 다른 "클라이언트"는 어떻게든 위와 동일한 값을 모두 생성할 수 있었고 여전히 동일한 랜덤 값을 생성할 수 있었습니다.
결론적으로, 만약 그것이 소화하기에 충분히 설득력 있는 인수가 아니라면, 자신의 "uuid" 항목을 "기본 키" 값으로 제공하십시오.
하지만 IMHO, 그것은 여기서 충돌 측면이 매우 광범위하다는 것을 고려하는 상당히 설득력 있는 주장이 되어야 합니다.최소한으로 말하자면.
전체 주제는 아마도 약간의 "너무 광범위한" 것일 것입니다.하지만 저는 이것이 "매우 가능성이 낮다"는 것에서 조금 더 구체적인 것으로 고려를 옮겼으면 합니다.
언급URL : https://stackoverflow.com/questions/22606364/collision-probability-of-objectid-vs-uuid-in-a-large-distributed-system
'bestsource' 카테고리의 다른 글
계산된 속성이 서로 다른 탭에서 UI를 업데이트하지 않음 (0) | 2023.07.08 |
---|---|
자바.java.java잘못된 상태 예외:로드 밸런싱에 대한 페이그니 클라이언트가 정의되지 않았습니다.봄-구름-스타터-넷플릭스-리본을 포함하는 것을 잊으셨습니까? (0) | 2023.07.08 |
Woocommerce 주문 검토를 체크아웃의 맨 위로 이동 (0) | 2023.07.08 |
SQL 스키마만 백업하시겠습니까? (0) | 2023.07.08 |
한 번 로그인하도록 Git over SSH 구성 (0) | 2023.07.08 |