MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Probabilità di collisione di ObjectId vs UUID in un grande sistema distribuito

nel mio caso la maggior parte degli ID verrà generata all'interno di un gran numero di client mobili, non all'interno di un insieme limitato di server. Mi chiedo se in questo caso vi sia una preoccupazione giustificata.

Mi sembra una pessima architettura. Stai usando un'architettura a due livelli? Perché i client mobili dovrebbero avere accesso diretto al db? Vuoi davvero fare affidamento sulla sicurezza basata sulla rete?

Ad ogni modo, alcune riflessioni sulla probabilità di collisione:

Né UUID né ObjectId si basano sulle loro dimensioni, ovvero non sono entrambi numeri casuali, ma seguono uno schema che cerca di ridurre sistematicamente la probabilità di collisione. In caso di ObjectId, la loro struttura è:

  • 4 byte secondi da unix epoch
  • ID macchina a 3 byte
  • ID processo a 2 byte
  • Contatore a 3 byte

Ciò significa che, contrariamente agli UUID, gli ObjectId sono monotoni (tranne entro un solo secondo), che è probabilmente la loro proprietà più importante. Gli indici monotonici faranno sì che il B-Tree venga riempito in modo più efficiente, consente il paging per id e consente un "ordinamento predefinito" per id per rendere stabili i cursori e, naturalmente, portano un timestamp facile da estrarre. Queste sono le ottimizzazioni di cui dovresti essere a conoscenza e possono essere enormi.

Come puoi vedere dalla struttura degli altri 3 componenti, le collisioni diventano molto probabili se stai facendo> 1k inserimenti/i su un singolo processo (non proprio possibile, nemmeno da un server), o se il numero di macchine cresce passato circa 10 (vedi problema compleanno), o se il numero di processi su una singola macchina cresce troppo (di nuovo, quelli non sono numeri casuali, ma sono veramente unici su una macchina, ma devono essere abbreviati a due byte ).

Naturalmente, affinché si verifichi una collisione, devono corrispondere in tutti questi aspetti, quindi anche se due macchine hanno lo stesso hash della macchina, richiederebbe comunque a un client di inserire lo stesso valore del contatore nello stesso identico secondo e lo stesso ID processo, ma sì, questi valori potrebbero entrare in conflitto.