Analyse et pratique de la génération d'ID à l'aide de l'algorithme de flocon de neige

Table des matières

1 Qu'est-ce que l'algorithme du flocon de neige ?

structure

avantage

défaut

2 Utiliser en Java

Notes d'utilisation : 

code d'essai

Effet


1 Qu'est-ce que l'algorithme du flocon de neige ?

L'algorithme de flocon de neige de Witter. Snowflake ID est un algorithme de génération d'identifiants uniques distribués conçu pour résoudre le besoin de générer des identifiants uniques dans les systèmes distribués.

structure

La structure de Snowflake ID est la suivante :

0 | 00000000000000000000000000000000000000 | 00000 | 00000 | 000000000000

- Le premier bit (bit le plus élevé) est le bit de signe, généralement 0.

- Les 41 bits suivants sont l'horodatage, utilisé pour enregistrer l'heure à laquelle l'ID a été généré.

-Ensuite, il y a un identifiant de machine en état de marche à 10 chiffres, utilisé pour identifier différentes machines.

- De manière générale, l'ID de la machine de travail est divisé en ID de nœud de travail et ID de centre de données, chacun occupant 5 bits.

 - Le dernier est un numéro de séquence à 12 chiffres, utilisé pour résoudre le problème de conflit de plusieurs identifiants générés dans la même milliseconde.

Grâce à cette structure, Snowflake ID peut générer des identifiants uniques et ordonnés dans les systèmes distribués.

avantage

Efficace, à la pointe de la tendance, triable et ne dépendant pas de bases de données ou de réseaux externes.

défaut

Bien que l'algorithme Snowflake ID présente de nombreux avantages pour générer des identifiants uniques dans les systèmes distribués, il présente également certains inconvénients potentiels :

1. Dépendance à l'horloge de la machine : la partie horodatage de l'ID Snowflake dépend de l'horloge système de la machine qui a généré l'ID. Si l'horloge de la machine est décalée ou désynchronisée, l'ID généré peut être non unique ou incorrect.

2. Problème de restauration de l'horloge : si l'horloge de la machine est restaurée, l'ID généré peut être plus petit que l'ID généré précédemment. Cela peut entraîner des problèmes potentiels, tels qu'un tri ou une indexation incorrecte dans certains scénarios.

3. Duplication du numéro de séquence en cas de concurrence élevée : si le nombre de demandes d'identification générées dans la même milliseconde est très élevé, la partie du numéro de séquence peut ne pas être suffisante pour garantir l'unicité. Dans ce cas, des stratégies supplémentaires sont nécessaires pour résoudre les conflits d’ID générés.

4. Limites d'évolutivité : la structure de Snowflake ID comprend l'ID de la machine de travail et l'ID du centre de données, ce qui limite l'évolutivité du système. Si vous devez augmenter le nombre de machines ou de centres de données, vous devrez peut-être réattribuer la plage d'ID ou modifier l'algorithme.

5. Un seul point est nécessaire pour générer les identifiants : afin de garantir l'unicité des identifiants, un générateur d'identifiants centralisé est nécessaire pour attribuer les identifiants des machines de travail et des centres de données. Cela peut devenir un point de défaillance unique ou un goulot d’étranglement des performances du système.

Bien que l'algorithme Snowflake ID présente certaines lacunes, il reste un schéma de génération d'ID unique distribué réalisable et largement utilisé dans la plupart des cas. En fonction des scénarios et des exigences d'application spécifiques, d'autres algorithmes de génération d'ID peuvent être envisagés ou des mesures supplémentaires peuvent être prises pour remédier à ces lacunes.

2 Utiliser en Java

Nous avons directement utilisé la boîte à outils hutool pour nous aider à implémenter l'algorithme de flocon de neige

compter sur

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


Notes d'utilisation : 

L'ID de la machine de travail est divisé en ID de nœud de travail et ID de centre de données, chacun occupant 5 bits, de sorte que le nombre maximum d'ID de travailleur et d'ID de centre de données est de 31.

code d'essai

    /** 测试 */
    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());
        }
    }

Effet

Je suppose que tu aimes

Origine blog.csdn.net/qq_53679247/article/details/132651246
conseillé
Classement