Teniendo en cuenta que un UUID rfc 4122 (16 bytes) es mucho mayor que un MongoDB ObjectId (12 bytes), estoy tratando de averiguar cómo su probabilidad de colisión comparar.

Sé que es algo alrededor de bastante raro, pero en mi caso la mayoría de las identificaciones, se genera un gran número de clientes móviles, no dentro de un conjunto limitado de servidores. Me pregunto si en este caso, hay una justificada preocupación.

Comparación con el caso normal, donde todos los identificadores generados por un pequeño número de clientes:

  • Podría tomar meses para detectar una colisión desde la creación del documento
  • IDs generados a partir de una más amplia base de clientes
  • Cada cliente tiene una menor ID de la tasa de generación de
  • ¿Por qué están permitiendo a los clientes móviles para crear el ObjectIds, o cualquier permanente de Identificación si a usted le preocupa la integridad de los datos?
  • Los clientes podrían estar fuera de línea y almacenar la información que no pueden ser sincronizados por un largo tiempo. No quiero forzar un 100% en línea de aplicaciones móviles
  • la mayoría de los cliente de la biblioteca de implementaciones de crear el _id valor por defecto. No diciendo que es una «buena idea» para conectar directamente. Pero «ObjectId» generación es perfectamente válido.
  • Personalmente, yo no construir o diseñar un sistema que permite a los clientes hacer esto. Me gustaría asignar identidades temporales cuando se trabaja sin conexión. Me gustaría considerar no es diferente de esperar a que un cliente no escribir directamente a MongoDb, sin pasar a través de una validación de datos de la capa.
  • sabemos que la mayoría de los clientes que de forma predeterminada. Un cliente sin conexión todavía podría crear ellos, pero ellos deben ser validados antes de insertar en la colección.
  • Me gustaría evitar el uso de ObjectId desde MongoDB optimiza este tipo de datos. A veces incluso se les exigió el pasado (marco de Agregación?)
  • Me gusta mucho el contenido de @mnemosyn, si por no mucho más de lo que hace el monótona punto de que es inherente en el diseño de la especificación. Como tal, también me pareció una feria pregunta y una muy válida la consideración por los demás a ver en el futuro. El mensaje general dice que el «factor de colisión» es un » me gusta más que «muy poco probable».
  • Todo esto me hizo reconsiderar el papel de los Uuid para los clientes sin conexión. @WiredPrairie comentar temporal de los identificadores de espera para la validación de la capa parece estar mejor preparada para el futuro que confiar en Uuid, pero también un dolor para aplicar… bueno, tolerancia a la partición nunca fue un pedazo de la torta. Gracias por el «problema del cumpleaños» mención.

2 Comentarios

  1. 28

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

    Que suena como muy mala arquitectura para mí. Está utilizando una arquitectura de dos niveles? ¿Por qué el móvil, los clientes tienen acceso directo a la base de datos? ¿De verdad quieres depender de la red de seguridad basada en?

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

    Ni UUID ni ObjectId dependen de su tamaño, es decir, no son números al azar, sino que siguen un esquema que intenta sistemáticamente para reducir la probabilidad de colisión. En caso de ObjectIds, su estructura es:

    • 4 bytes segundos desde la época unix
    • 3 bytes de identificación de la máquina
    • 2 byte identificador de proceso
    • 3 byte contador

    Esto significa que, contrariamente a los Uuid, ObjectIds son monótona (excepto en un solo segundo), que es probablemente la propiedad más importante. Monotónica índices hará que el Árbol B para ser llenado de manera más eficiente, que permite la paginación por id y permite un ‘orden predeterminado’ por id para hacer su cursores estable, y, por supuesto, llevar un fácil-a-extracto de sello de tiempo. Estas son las optimizaciones que usted debe ser consciente de, y puede ser enorme.

    Como se puede ver en la estructura de los otros 3 componentes, las colisiones se vuelven muy probable que si usted está haciendo > 1k inserciones/s en un único proceso (realmente no es posible, ni siquiera la de un servidor), o si el número de máquinas crece pasado sobre 10 (véase el problema del cumpleaños), o si el número de procesos en una sola máquina crece demasiado grande (de nuevo, esos no son números al azar, sino que son realmente únicos en un equipo, pero deben ser reducido a dos bytes).

    Naturalmente, para una colisión a ocurrir, que deben coincidir en todos estos aspectos, por lo que incluso si dos equipos tienen el mismo equipo de hash, que es que todavía requieren de un cliente para insertar con el mismo valor de contador en el mismo segundo y el mismo proceso de identificación, pero sí, estos valores podrían entrar en conflicto.

    • Esto lo hicimos de nuevo. Jinx!
    • Sí… Si no hubiera tomado el tiempo para tomar ese café… 🙁
    • Los clientes móviles no tienen acceso directo a la base de datos, de hecho, que puede funcionar incluso sin una conexión a ella. Sin embargo, cada cliente móvil tendrá que subir los documentos a la base de datos principal antes o después.
    • Para ser justo, estoy seguro de que se vierte el vino en mi zona horaria. No importa el tiempo como el punto obtiene a través de.
    • No son perfectamente válidos de los casos para la generación de Id de un cliente, y no implica el acceso a la base de datos. Si usted está haciendo esto, usted definitivamente no debe utilizar ObjectIds, ya que tienen graves problemas de colisión si usted tiene decenas o cientos de miles de clientes de la generación de ellos. No confío en ObjectIds, ya que es demasiado fácil de encontrar los casos, incluso si se requieren condiciones específicas, donde pueden ocurrir colisiones.
    • Responder de manera útil, sin embargo, no entiendo por qué 1k inserciones/s por el proceso ya puede ser un problema. Se podría pensar que el contador se incrementa en 1 en cada «solicitud» en el mismo segundo y se reinicia a cero al principio de la siguiente segundo. Pero con 3 bytes, que puede representar mucho mayor en número que la de 1k. Lo que me estoy perdiendo aquí?

  2. 13

    Echemos un vistazo a la especificación de «ObjectId» de la documentación:

    Resumen

    ObjectId es de 12 bytes BSON tipo, construida a través de:

    • un valor de 4 bytes que representan los segundos desde la época Unix,
    • 3 byte identificador de la máquina,
    • una de 2 bytes identificador de proceso, y
    • un 3 bytes contador, comenzando con un valor aleatorio.

    Así que vamos a considerar esto en el contexto de un «cliente móvil».

    Nota: El contexto aquí no significa el uso de un «directo» de la conexión de el «cliente móvil» a la base de datos. Que debe no hacer. Pero el «_id» generación puede bastante simplemente.

    Para los puntos:

    1. Valor para los «segundos desde la época». Que va a ser bastante aleatorio por solicitud. Tan mínima colisión de impacto justo en ese componente. Aunque en «segundos».

    2. La máquina «identificador». Así que este es un diferentes cliente de la generación de la _id valor. Esta es la eliminación de la posibilidad de seguir «colisión».

    3. El «proceso de identificación». Así que donde que es accesible a la semilla ( y debe ser ), entonces el generado _id ha más oportunidad de evitar la colisión.

    4. El «valor aleatorio». Así que otro «cliente» de alguna manera se las arregló para generar todos los valores por encima y todavía conseguido generar el mismo valor aleatorio.

    Línea de fondo es, si que no es lo suficientemente convincente argumento de digerir, entonces simplemente proporcione su propio «uuid» entradas como la «clave principal» de los valores.

    Pero en mi humilde opinión, que debe ser un feria argumento convincente para considerar que la colisión de los aspectos que aquí se muy amplio. Para decir lo menos.

    La completo tema es probablemente sólo un poco «demasiado amplia». Pero espero que esto se mueve consideración un poco más lejos de «Muy raro» y en algo un poco más concreto.

Dejar respuesta

Please enter your comment!
Please enter your name here