Resolvendo os desafios de identificação distribuída com IDs de floco de neve no TypeScript

A geração de identificadores exclusivos em sistemas distribuídos é uma dor de cabeça comum. Métodos tradicionais como IDs de banco de dados de incrementação automática atingem limites de escala e UUIDs, embora exclusivos, carecem de classabilidade inerente. E se houvesse um ID que fosse único e ordenado pelo tempo? Aqui é onde os IDs de floco de neve entram em jogo. Originalmente do Twitter, os IDs de floco de neve são identificadores únicos, ordenados por tempo e 64 bits, perfeitos para ambientes distribuídos de alto rendimento. Hoje, quero apresentá-lo a @Se-Oss/Snowflake-Sevence, uma biblioteca de texto leve e de alto desempenho que traz IDs de floco de neve diretamente aos seus aplicativos Node.js. Por que IDs de floco de neve? Os IDs de floco de neve resolvem problemas importantes nos sistemas distribuídos: escalabilidade: gerado localmente em cada nó, evitando gargalos centrais. Sortabilidade: incorpora um registro de data e hora, portanto, os IDs mais recentes são sempre maiores que os mais antigos. Singularidade: praticamente garantida em todo o seu sistema. Eficiência: um número inteiro compacto de 64 bits. É aqui que brilha o @Se-OSS/Snowflake-seqüência, oferecendo uma implementação robusta e fácil de usar. Anatomia de um ID do floco de neve Um ID do floco de neve é ​​um número inteiro de 64 bits composto por três partes: Timestamp (41 bits): milissegundos desde uma época personalizada. Isso permite a classificação baseada no tempo. ID do nó (10 bits): um identificador exclusivo para a máquina ou processo de geração (0-1023). Sequência (12 bits): incrementos para IDs gerados dentro do mesmo milissegundo no mesmo nó (até 4096 por milissegundo). A biblioteca lida com todas as operações complexas para você. Instale-o com PNPM (ou seu gerenciador de pacotes preferido): pnpm install @se-oss/snowflake-sequence Digite o modo de tela cheia de tela cheia de tela cheia gerar e desconstruir IDs: importar {snowflake} de ‘ @se-oss/snowflake-sequence’; // 1. Crie uma nova instância do gerador de floco de neve. // O nodeid é crucial para a singularidade em seu sistema distribuído. // A época é opcional; Padrão para a época original do Twitter. const Snowflake = novo floco de neve ({nodeid: 42, // ID exclusivo para esta instância de serviço (0-1023) Epoch: 1672531200000, // Opcional: 1 de janeiro de 2023, 00:00:00 UTC}); // 2. Gere um novo ID do floco de neve. const id = snowflake.nextId (); console.log (`ID gerado: $ {id} n`); // Observe o ‘n’ para bigint // 3. Desconstrua o ID para inspecionar seus componentes. const desconstruído = snowflake.deconstruct (id); console.log (‘ID desconstruído:’, desconstruído); / * A saída será algo como: {Timestamp: 1672531200000n + Some_millisEconds_since_epoch, nodeid: 42n, sequência: 0n, // ou superior se vários IDs foram gerados no mesmo milissegundos a fútera: 12834974657n // Nota: Personalização do modo de tela cheia e robustez Configure seu gerador de flocos de neve para o seu ambiente: ID do nó: atribua um nodeid exclusivo (0-1023) a cada instância de serviço, talvez por meio de variáveis ​​de ambiente ou descoberta de serviço (como cônsul ou eureka). Epoch: Defina um registro de data e hora de época personalizado para maximizar a vida útil do ID ou alinhar com os sistemas existentes. A biblioteca também lida com casos de borda: relógio para trás: lança um erro se o relógio do sistema se mover para trás, impedindo IDs não únicos. Rollover de sequência: aguarda automaticamente o próximo milissegundo se mais de 4096 IDs forem gerados em um único milissegundo, garantindo a singularidade. Aplicativos do mundo real Os IDs de flocos de neve são ideais para: registro distribuído: classificação cronológica de logs entre serviços. OBRIGADO DE EVENTOS: IDs de eventos exclusivos e ordenados. Conteúdo gerado pelo usuário: classifique e recupere e com eficiência postagens, comentários, etc. sob o capô: a mágica bit a eficiência dos IDs de floco de neve vem de operações inteligentes que empacota o registro de data e hora, o ID do nó e a sequência de um único BIGINT de 64 bits. Imagine os 64 bits do id:

[ 0 | 41-bit Timestamp | 10-bit Node ID | 12-bit Sequence ]

Aqui está uma visão simplificada de como funciona: Gerando um ID: Timestamp: a diferença entre a hora atual e a época escolhida é calculada. Esse valor de 41 bits é deslocado para a esquerda pelo timestamp_shift (que é node_id_bits + sequence_bits = 10 + 12 = 22 bits). Isso move o registro de data e hora para a posição mais significativa à esquerda. ID do nó: Seu nodeid (10 bits) é deslocado para a esquerda por node_id_shift (que é sequence_bits = 12 bits). Isso coloca o ID do nó em seu slot designado de 10 bits. Sequência: o número da sequência (12 bits) é adicionado diretamente, ocupando os 12 bits mais à direita. Esses três valores deslocados são então combinados usando o operador bit ou (|) para formar o ID de floco de neve final de 64 bits. Desconstruindo um ID: Para recuperar os componentes: registro de data e hora: o ID é deslocado para a direita pelo timestamp_shift para isolar o registro de data e hora e, em seguida, a época é adicionada de volta para obter o registro de registro absoluto. ID do nó: o ID é deslocado para a direita por Node_Id_Shift e, em seguida, uma operação bit e (&) com max_node_id (uma máscara de 10) é usada para extrair apenas o ID do nó de 10 bits. Sequência: uma operação um bit e (&) com max_sequence (uma máscara de 12) extrai diretamente o número de sequência de 12 bits. Essa manipulação direta de bits é o que torna incrivelmente rápida e eficiente a geração de identificação de neve e desconstrução. CONCLUSÃO E ACTION à ação Os IDs de floco de neve oferecem uma solução escalável, única e classificável para a geração de identificação distribuída. A biblioteca @Se-OSS/Snowflake-seqüência fornece uma implementação pura e de alto desempenho, fácil de integrar. Se você estiver construindo sistemas distribuídos, experimente @se-oss/snowflake-sequence! Codificação feliz!

Fonte

Você pode ter perdido