Les solutions d'identification distribuée les plus couramment utilisées sont ici!

"1. Concept d'identité distribuée"
En parlant d'identité, la caractéristique est l'unicité. Dans le monde humain, l'ID est la carte d'identité et est l'identité unique de chaque personne. Dans les systèmes distribués complexes, il est souvent nécessaire d'identifier de manière unique de grandes quantités de données et de messages. Par exemple, le champ ID de la base de données peut utiliser l'auto-incrémentation comme ID dans le cas d'une seule entité, mais après la sous-table de la sous-base de données, un ID unique doit être requis pour identifier un élément de données. Cet ID est un identifiant distribué. Pour l'ID distribué, il doit également avoir les caractéristiques d'un système distribué: haute concurrence, haute disponibilité, hautes performances, etc.

«Deux, plan de mise en œuvre des ID distribués»

Le tableau suivant est une comparaison de certaines solutions courantes:
Insérez la description de l'image ici
Il existe deux solutions d'identification distribuée populaires: "mode segment de nombre" et "algorithme de neige".

Le "mode segment de nombre" dépend de la base de données, mais il est différent du mode d'augmentation de la clé primaire de la base de données. En supposant que 100 est un segment numérique de 100, 200, 300, 100 identifiants peut être obtenu chaque fois qu'il est récupéré, et les performances sont considérablement améliorées.

L '"algorithme de neige" est composé du bit de signe + horodatage + identifiant de la machine de travail + numéro de série, comme indiqué sur la figure: le
Insérez la description de l'image ici
bit de signe est 0, 0 signifie un nombre positif et l'ID est un nombre positif.

Inutile de dire que le bit d'horodatage est utilisé pour stocker l'horodatage et que l'unité est la ms.

Le bit id de la machine en fonctionnement est utilisé pour stocker l'identifiant de la machine et est généralement divisé en 5 bits de zone + 5 bits d'identification de serveur.

Le bit du numéro de série augmente automatiquement.

Combien de données l'algorithme de flocon de neige peut-il stocker? Plage de temps: 2 ^ 41 / (3652460601000) = 69 ans de processus de travail plage: 2 ^ 10 = 1024 Plage de numéros de série: 2 ^ 12 = 4096, ce qui signifie que 4096 ID peuvent être générés en 1 ms.
Selon la logique de cet algorithme, il suffit de mettre en œuvre cet algorithme en langage Java et de l'encapsuler en tant que méthode outil, puis chaque application métier peut utiliser directement la méthode outil pour obtenir l'ID distribué, et doit uniquement s'assurer que chaque application métier a son propre travail L'ID machine est suffisant et il n'est pas nécessaire de créer une application pour obtenir l'ID distribué séparément. Voici la version Twitter de l'algorithme Snowflake:

public class SnowFlake {
    
    

    /**
     * 起始的时间戳
     */
    private final static long START_STMP = 1480166465631L;

    /**
     * 每一部分占用的位数
     */
    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
    private final static long MACHINE_BIT = 5;   //机器标识占用的位数
    private final static long DATACENTER_BIT = 5;//数据中心占用的位数

    /**
     * 每一部分的最大值
     */
    private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    /**
     * 每一部分向左的位移
     */
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;

    private long datacenterId;  //数据中心
    private long machineId;     //机器标识
    private long sequence = 0L; //序列号
    private long lastStmp = -1L;//上一次时间戳

    public SnowFlake(long datacenterId, long machineId) {
    
    
        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
    
    
            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
    
    
            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
        }
        this.datacenterId = datacenterId;
        this.machineId = machineId;
    }

    /**
     * 产生下一个ID
     *
     * @return
     */
    public synchronized long nextId() {
    
    
        long currStmp = getNewstmp();
        if (currStmp < lastStmp) {
    
    
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }

        if (currStmp == lastStmp) {
    
    
            //相同毫秒内,序列号自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            //同一毫秒的序列数已经达到最大
            if (sequence == 0L) {
    
    
                currStmp = getNextMill();
            }
        } else {
    
    
            //不同毫秒内,序列号置为0
            sequence = 0L;
        }

        lastStmp = currStmp;

        return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
                | datacenterId << DATACENTER_LEFT       //数据中心部分
                | machineId << MACHINE_LEFT             //机器标识部分
                | sequence;                             //序列号部分
    }

    private long getNextMill() {
    
    
        long mill = getNewstmp();
        while (mill <= lastStmp) {
    
    
            mill = getNewstmp();
        }
        return mill;
    }

    private long getNewstmp() {
    
    
        return System.currentTimeMillis();
    }

    public static void main(String[] args) {
    
    
        SnowFlake snowFlake = new SnowFlake(2, 3);

        for (int i = 0; i < (1 << 12); i++) {
    
    
            System.out.println(snowFlake.nextId());
        }

    }
}

"Trois composants open source ID distribués"

3.1 Comment choisir les composants open source

Le choix d'un composant open source doit d'abord voir si les fonctionnalités du logiciel répondent aux besoins, y compris la compatibilité et l'évolutivité.

Deuxièmement, nous devons examiner la capacité technique actuelle et savoir si elle peut être utilisée sans heurts en fonction de la pile technique actuelle et de la capacité technique de soi-même ou de l'équipe.

Troisièmement, cela dépend de la communauté des composants open source. Il se concentre principalement sur la fréquence de la mise à jour, si le projet est géré par quelqu'un, lorsque vous rencontrez un gouffre, vous pouvez contacter pour obtenir de l'aide et si elle est largement utilisée. dans l'industrie.

3.2 Feuille de Meituan

Leaf est un service de génération d'identifiants distribué lancé par la plate-forme de recherche et développement de base de Meituan. Son nom est tiré d'une phrase du philosophe et mathématicien allemand Leibniz: «Il n'y a pas deux feuilles identiques dans le monde.» Leaf est très fiable, des fonctionnalités telles que la faible latence et unicité mondiale. À l'heure actuelle, il a été largement utilisé dans de nombreux départements tels que Meituan Finance, Meituan Takeaway et Meituan Liquor. Pour des détails techniques spécifiques, veuillez vous référer à un article sur le blog de la technologie Meituan: "Leaf Meituan Distributed ID Generation Service". Actuellement, le projet Leaf a été open source sur Github: https://github.com/Meituan-Dianping/Leaf. Les caractéristiques de Leaf sont les suivantes:

Unique au monde, il n'y aura jamais d'identifiants en double et la tendance générale des identifiants est à la hausse.
Très disponible, le service est entièrement basé sur une architecture distribuée, même si MySQL est en panne, il peut tolérer l'indisponibilité de la base de données pendant un certain temps.
Concurrence élevée et faible latence. Sur une machine virtuelle CentOS 4C8G, QPS peut être appelé jusqu'à 5 W + à distance et TP99 est à moins de 1 ms.
L'accès est simple et il est accessible directement via le service RPC ou l'appel HTTP de l'entreprise.
3.3 Baidu UidGenerator

UidGenerator Baidu open source est un générateur d'identifiant unique distribué haute performance basé sur l'algorithme Snowflake. Utilisation d'une description du site Web officiel: UidGenerator fonctionne dans des projets d'application sous forme de composants, prend en charge les bits workerId personnalisés et les stratégies d'initialisation, et convient aux scénarios tels que le redémarrage automatique et la dérive d'instances dans des environnements virtualisés tels que docker. En termes de mise en œuvre, UidGenerator utilise le temps futur pour résoudre la limitation de concurrence inhérente à la séquence; il utilise RingBuffer pour mettre en cache l'UID généré, parallélise la production et la consommation de l'UID et complète la CacheLine pour éviter le niveau matériel causé par RingBuffer. Problème de "pseudo-partage". Le QPS final sur une seule machine peut atteindre 6 millions. Adresse GitHub d'UidGenerator: https://github.com/baidu/uid-generator

3.4 Comparaison des composants open source

Baidu UidGenerator est en langage Java; le dernier enregistrement de soumission date d'il y a deux ans, et il n'est fondamentalement pas maintenu; seul l'algorithme de flocon de neige est pris en charge.

Meituan Leaf est également en langage Java; il a été maintenu pour 2020 récemment; il prend en charge le mode segment de nombre et l'algorithme de flocon de neige.

En résumé, la comparaison entre la théorie et les deux composants open source montre que Meituan Leaf est légèrement meilleur.

Savez-vous toujours quelles solutions d'identification distribuées couramment utilisées?

Je suppose que tu aimes

Origine blog.csdn.net/ncw8080/article/details/113854360
conseillé
Classement