sql >> Base de Datos >  >> NoSQL >> MongoDB

Probabilidad de colisión de ObjectId vs UUID en un gran sistema distribuido

en mi caso, la mayoría de las identificaciones se generarán dentro de una gran cantidad de clientes móviles, no dentro de un conjunto limitado de servidores. Me pregunto si en este caso hay una preocupación justificada.

Eso me suena a muy mala arquitectura. ¿Está utilizando una arquitectura de dos niveles? ¿Por qué los clientes móviles tendrían acceso directo a la base de datos? ¿Realmente desea confiar en la seguridad basada en la red?

De todos modos, algunas deliberaciones sobre la probabilidad de colisión:

Ni UUID ni ObjectId se basan en su tamaño, es decir, ambos no son números aleatorios, pero siguen un esquema que intenta reducir sistemáticamente la probabilidad de colisión. En el caso de ObjectIds, su estructura es:

  • 4 bytes segundos desde la época de Unix
  • ID de máquina de 3 bytes
  • ID de proceso de 2 bytes
  • Contador de 3 bytes

Esto significa que, a diferencia de los UUID, los ObjectId son monótonos (excepto en un solo segundo), lo que probablemente sea su propiedad más importante. Los índices monotónicos harán que el B-Tree se llene de manera más eficiente, permite la paginación por id y permite una 'clasificación predeterminada' por id para hacer que sus cursores sean estables y, por supuesto, llevan una marca de tiempo fácil de extraer. Estas son las optimizaciones que debe tener en cuenta y pueden ser enormes.

Como puede ver en la estructura de los otros 3 componentes, las colisiones se vuelven muy probables si está haciendo> 1k inserciones/s en un solo proceso (realmente no es posible, ni siquiera desde un servidor), o si la cantidad de máquinas crece más allá de 10 (ver problema de cumpleaños), o si la cantidad de procesos en una sola máquina crece demasiado (por otra parte, esos no son números aleatorios, pero son verdaderamente únicos en una máquina, pero deben reducirse a dos bytes ).

Naturalmente, para que ocurra una colisión, deben coincidir en todos estos aspectos, por lo que incluso si dos máquinas tienen el mismo hash de máquina, aún sería necesario que un cliente inserte con el mismo valor de contador en el mismo segundo exacto y la misma identificación de proceso, pero sí, estos valores podrían colisionar.