MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Probabilidade de colisão de ObjectId vs UUID em um grande sistema distribuído


no meu caso, a maioria dos ids será gerada em um grande número de clientes móveis, não em um conjunto limitado de servidores. Gostaria de saber se, neste caso, há uma preocupação justificada.

Isso soa como uma arquitetura muito ruim para mim. Você está usando uma arquitetura de duas camadas? Por que os clientes móveis teriam acesso direto ao banco de dados? Você realmente quer confiar na segurança baseada em rede?

De qualquer forma, algumas deliberações sobre a probabilidade de colisão:

Nem UUID nem ObjectId dependem de seu tamanho, ou seja, ambos não são números aleatórios, mas seguem um esquema que tenta reduzir sistematicamente a probabilidade de colisão. No caso de ObjectIds, sua estrutura é:
  • 4 bytes segundos desde a época do unix
  • ID de máquina de 3 bytes
  • ID do processo de 2 bytes
  • Contador de 3 bytes

Isso significa que, ao contrário dos UUIDs, os ObjectIds são monotônicos (exceto em um único segundo), o que provavelmente é sua propriedade mais importante. Índices monotônicos farão com que o B-Tree seja preenchido com mais eficiência, permite paginação por id e permite uma 'classificação padrão' por id para tornar seus cursores estáveis ​​e, claro, eles carregam um timestamp fácil de extrair. Essas são as otimizações que você deve conhecer e podem ser enormes.

Como você pode ver na estrutura dos outros 3 componentes, as colisões se tornam muito prováveis ​​se você estiver fazendo> 1k inserções/s em um único processo (não é realmente possível, nem mesmo de um servidor), ou se o número de máquinas crescer passado cerca de 10 (veja o problema de aniversário), ou se o número de processos em uma única máquina crescer muito (de novo, esses não são números aleatórios, mas são verdadeiramente únicos em uma máquina, mas devem ser reduzidos para dois bytes ).

Naturalmente, para que ocorra uma colisão, eles devem corresponder em todos esses aspectos, portanto, mesmo que duas máquinas tenham o mesmo hash de máquina, ainda seria necessário que um cliente inserisse o mesmo valor de contador no mesmo segundo e o mesmo ID de processo, mas sim, esses valores podem colidir.