Análisis y práctica de la generación de ID utilizando el algoritmo de copo de nieve.

Tabla de contenido

1 ¿Qué es el algoritmo del copo de nieve?

estructura

ventaja

defecto

2 Uso en java

Notas de uso: 

código de prueba

Efecto


1 ¿Qué es el algoritmo del copo de nieve?

Algoritmo de copo de nieve de Witter. Snowflake ID es un algoritmo de generación de ID único distribuido diseñado para resolver la necesidad de generar ID únicos en sistemas distribuidos.

estructura

La estructura de Snowflake ID es la siguiente:

0 | 00000000000000000000000000000000000000 | 00000 | 00000 | 000000000000

- El primer bit (bit más alto) es el bit de signo, normalmente 0.

- Los siguientes 41 bits son la marca de tiempo, que se utiliza para registrar la hora en que se generó la identificación.

-Luego hay una identificación de máquina en funcionamiento de 10 dígitos, que se utiliza para identificar diferentes máquinas.

- En términos generales, la ID de la máquina en funcionamiento se divide en ID del nodo de trabajo e ID del centro de datos, cada uno de los cuales ocupa 5 bits.

 - El último es un número de secuencia de 12 dígitos, que se utiliza para resolver el problema de conflicto de múltiples ID generados en el mismo milisegundo.

A través de esta estructura, Snowflake ID puede generar ID ordenados y únicos en sistemas distribuidos.

ventaja

Eficiente, de tendencia creciente, ordenable y no dependiente de bases de datos o redes externas.

defecto

Aunque el algoritmo Snowflake ID tiene muchas ventajas para generar ID únicos en sistemas distribuidos, también tiene algunas desventajas potenciales:

1. Dependencia del reloj de la máquina: la parte de la marca de tiempo del ID de Snowflake depende del reloj del sistema de la máquina que generó el ID. Si el reloj de la máquina está retrasado o no está sincronizado, es posible que la identificación generada no sea única o sea incorrecta.

2. Problema de reversión del reloj: si el reloj de la máquina se revierte, la ID generada puede ser más pequeña que la ID generada anteriormente. Esto puede causar algunos problemas potenciales, como no ordenar o indexar correctamente en ciertos escenarios.

3. Duplicación del número de secuencia en condiciones de alta concurrencia: si la cantidad de solicitudes de identificación generadas en el mismo milisegundo es muy alta, la parte del número de secuencia puede no ser suficiente para garantizar la unicidad. En este caso, se requieren estrategias adicionales para resolver conflictos de ID generados.

4. Limitaciones de escalabilidad: la estructura de Snowflake ID incluye la ID de la máquina de trabajo y la ID del centro de datos, lo que limita la escalabilidad del sistema. Si necesita aumentar la cantidad de máquinas o centros de datos, es posible que deba reasignar el rango de ID o modificar el algoritmo.

5. Se necesita un único punto para generar ID: para garantizar la unicidad de las ID, se necesita un generador de ID centralizado para asignar ID de máquinas de trabajo y ID de centros de datos. Esto puede convertirse en un punto único de falla o cuello de botella en el rendimiento del sistema.

Aunque el algoritmo Snowflake ID tiene algunas deficiencias, en la mayoría de los casos sigue siendo un esquema de generación de ID único distribuido factible y ampliamente utilizado. Dependiendo de los escenarios y requisitos de aplicación específicos, se pueden considerar otros algoritmos de generación de ID o se pueden tomar medidas adicionales para abordar estas deficiencias.

2 Uso en java

Usamos directamente el kit de herramientas hutool para ayudarnos a implementar el algoritmo del copo de nieve.

confiar

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>


Notas de uso: 

La ID de la máquina de trabajo se divide en la ID del nodo de trabajo y la ID del centro de datos, cada una de las cuales ocupa 5 bits, por lo que el número máximo de ID de trabajador y de centro de datos es 31.

código de prueba

    /** 测试 */
    public static void main(String[] args) {
        // workerID和datacenterId最大31
        Snowflake snowflake = IdUtil.getSnowflake(0, 31);
        for (int i = 0; i < 10; i++) {
            System.out.println(snowflake.nextId());
        }
    }

Efecto

Supongo que te gusta

Origin blog.csdn.net/qq_53679247/article/details/132651246
Recomendado
Clasificación