国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison php教程 php手冊 Résumé des solutions de génération d'ID uniques pour les systèmes distribués

Résumé des solutions de génération d'ID uniques pour les systèmes distribués

Sep 14, 2018 pm 01:39 PM
distribué

L'ID système unique est un problème que nous rencontrons souvent lors de la conception d'un système, et nous sommes souvent aux prises avec ce problème. Il existe de nombreuses fa?ons de générer des identifiants, en s'adaptant à différents scénarios, besoins et exigences de performances. Par conséquent, certains systèmes plus complexes auront plusieurs stratégies de génération d’ID. Voici quelques stratégies courantes de génération d’identifiants.

1. Séquence ou champ auto-croissant de base de données

La manière la plus courante. En utilisant la base de données, l’ensemble de la base de données est unique.

Avantages?:

  1. Code simple et pratique, performances acceptables.

  2. Les identifiants numériques sont naturellement triés, ce qui est utile pour la pagination ou les résultats qui doivent être triés.

Inconvénients?:

  1. La syntaxe et l'implémentation de bases de données différentes sont différentes, lors de la migration de la base de données ou lorsque plusieurs versions de la base de données sont prises en charge Doit être traité.

  2. Dans le cas d'une seule base de données ou d'une séparation lecture-écriture ou d'un ma?tre et de plusieurs esclaves, il y a est qu'une seule base de données principale peut être générée. Il existe un risque de défaillance unique.

  3. Il est difficile de se développer lorsque les performances ne peuvent pas répondre aux exigences.

  4. Si vous rencontrez plusieurs systèmes qui doivent être fusionnés ou si une migration de données est impliquée, ce sera assez douloureux.

  5. Il y aura des problèmes lors de la division des tables et des bases de données.

Plan d'optimisation?:

  1. Pour la bibliothèque principale, point unique, s'il existe plusieurs bibliothèques Master, chaque Master The Le numéro de départ défini par la bibliothèque est différent, mais la taille du pas est la même, qui peut être le nombre de ma?tres. Par exemple?: Master1 génère 1, 4, 7, 10, Master2 génère 2,5,8,11, Master3 génère 3,6,9,12. Cela peut générer efficacement des identifiants uniques dans le cluster et peut également réduire considérablement la charge des opérations de génération d'identifiants dans la base de données.

2. Méthodes courantes UUID.

Il peut être généré à l'aide d'une base de données ou d'un programme, et est généralement unique au monde.

Avantages?:

  1. Code simple et pratique.

  2. Les performances de génération d'ID sont très bonnes et il n'y a pratiquement aucun problème de performances.

  3. Unique au monde, en cas de migration de données, de fusion de données système ou de modification de base de données, vous pouvez le prendre dans la foulée.

Inconvénients?:

  1. Il n'y a pas de tri et on ne peut pas garantir que la tendance augmente.

  2. L'UUID est souvent stocké à l'aide de cha?nes et l'efficacité des requêtes est relativement faible.

  3. L'espace de stockage est relativement important S'il s'agit d'une base de données massive, vous devez tenir compte du stockage. montant.

  4. Grande quantité de données à transférer

  5. n'est pas lisible.

3. Redis génère un identifiant

Lorsque les performances d'utilisation de la base de données pour générer un identifiant ne sont pas suffisantes, nous pouvons essayer d'utiliser Redis pour générer un identifiant. Cela repose principalement sur le fait que Redis soit monothread, il peut donc également être utilisé pour générer des identifiants uniques au monde. Ceci peut être réalisé en utilisant les opérations atomiques INCR et INCRBY de Redis.

Vous pouvez utiliser le cluster Redis pour obtenir un débit plus élevé. Supposons qu'il y ait 5 Redis dans un cluster. Les valeurs de chaque Redis peuvent être initialisées à 1, 2, 3, 4, 5 respectivement, puis la taille du pas est de 5. Les identifiants générés par chaque Redis sont :

A : 1,6,11,16,21 B : 2,7,12,17,22 C : 3,8,13,18,23 D : 4 , 9,14,19,24 E?: 5,10,15,20,25

Cela peut être déterminé par la machine dans laquelle il est chargé. Il sera difficile de le modifier à l'avenir. Cependant, 3 à 5 serveurs peuvent essentiellement satisfaire les besoins du serveur, et ils peuvent tous obtenir des identifiants différents. Mais la taille du pas et la valeur initiale doivent être requises à l'avance. L'utilisation du cluster Redis peut également résoudre le problème du point de défaillance unique.

De plus, il est plus adapté d'utiliser Redis pour générer un numéro de série quotidien à partir de 0. Par exemple, numéro de commande = date + numéro auto-croissant ce jour-là. Vous pouvez générer une clé dans Redis chaque jour et utiliser INCR pour l'accumulation.

Avantages?:

  1. Ne dépend pas de la base de données, est flexible et pratique, et offre de meilleures performances que la base de données.

  2. Les identifiants numériques sont naturellement triés, ce qui est utile pour la pagination ou les résultats qui doivent être triés.

Inconvénients?:

  1. S'il n'y a pas de Redis dans le système, de nouveaux composants doivent être introduits, augmentant ainsi la complexité du système.

  2. La charge de travail requise pour le codage et la configuration est relativement importante.

4. L'algorithme de flocon de neige de Twitter

Snowflake est l'algorithme de génération d'identifiant distribué open source de Twitter, et le résultat est un identifiant long. L'idée principale est la suivante?: utiliser 41 bits comme nombre de millisecondes, 10 bits comme ID de machine (5 bits sont le centre de données, 5 bits comme ID de machine) et 12 bits comme numéro de série en millisecondes (ce qui signifie que chaque n?ud peut générer 4096 ID), et il y a un bit de signe à la fin, qui est toujours 0. Le code d'implémentation spécifique peut être trouvé sur?: https://github.com/twitter/snowflake

public class IdWorker {
// ==============================Fields===========================================
/** 開始時(shí)間截 (2015-01-01) */
private final long twepoch = 1420041600000L;

/** 機(jī)器id所占的位數(shù) */
private final long workerIdBits = 5L;

/** 數(shù)據(jù)標(biāo)識id所占的位數(shù) */
private final long datacenterIdBits = 5L;

/** 支持的最大機(jī)器id,結(jié)果是31 (這個(gè)移位算法可以很快的計(jì)算出幾位二進(jìn)制數(shù)所能表示的最大十進(jìn)制數(shù)) */
private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

/** 支持的最大數(shù)據(jù)標(biāo)識id,結(jié)果是31 */
private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

/** 序列在id中占的位數(shù) */
private final long sequenceBits = 12L;

/** 機(jī)器ID向左移12位 */
private final long workerIdShift = sequenceBits;

/** 數(shù)據(jù)標(biāo)識id向左移17位(12+5) */
private final long datacenterIdShift = sequenceBits + workerIdBits;

/** 時(shí)間截向左移22位(5+5+12) */
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

/** 生成序列的掩碼,這里為4095 (0b111111111111=0xfff=4095) */
private final long sequenceMask = -1L ^ (-1L << sequenceBits);

/** 工作機(jī)器ID(0~31) */
private long workerId;

/** 數(shù)據(jù)中心ID(0~31) */
private long datacenterId;

/** 毫秒內(nèi)序列(0~4095) */
private long sequence = 0L;

/** 上次生成ID的時(shí)間截 */
private long lastTimestamp = -1L;

//==============================Constructors=====================================
/**
 * 構(gòu)造函數(shù)
 * @param workerId 工作ID (0~31)
 * @param datacenterId 數(shù)據(jù)中心ID (0~31)
 */
public IdWorker(long workerId, long datacenterId) {
    if (workerId > maxWorkerId || workerId < 0) {
        throw new IllegalArgumentException(String.format("worker Id can&#39;t be greater than %d or less than 0", maxWorkerId));
    }
    if (datacenterId > maxDatacenterId || datacenterId < 0) {
        throw new IllegalArgumentException(String.format("datacenter Id can&#39;t be greater than %d or less than 0", maxDatacenterId));
    }
    this.workerId = workerId;
    this.datacenterId = datacenterId;
}

// ==============================Methods==========================================
/**
 * 獲得下一個(gè)ID (該方法是線程安全的)
 * @return SnowflakeId
 */
public synchronized long nextId() {
    long timestamp = timeGen();

    //如果當(dāng)前時(shí)間小于上一次ID生成的時(shí)間戳,說明系統(tǒng)時(shí)鐘回退過這個(gè)時(shí)候應(yīng)當(dāng)拋出異常
    if (timestamp < lastTimestamp) {
        throw new RuntimeException(
                String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
    }

    //如果是同一時(shí)間生成的,則進(jìn)行毫秒內(nèi)序列
    if (lastTimestamp == timestamp) {
        sequence = (sequence + 1) & sequenceMask;
        //毫秒內(nèi)序列溢出
        if (sequence == 0) {
            //阻塞到下一個(gè)毫秒,獲得新的時(shí)間戳
            timestamp = tilNextMillis(lastTimestamp);
        }
    }
    //時(shí)間戳改變,毫秒內(nèi)序列重置
    else {
        sequence = 0L;
    }

    //上次生成ID的時(shí)間截
    lastTimestamp = timestamp;

    //移位并通過或運(yùn)算拼到一起組成64位的ID
    return ((timestamp - twepoch) << timestampLeftShift) //
            | (datacenterId << datacenterIdShift) //
            | (workerId << workerIdShift) //
            | sequence;
}

/**
 * 阻塞到下一個(gè)毫秒,直到獲得新的時(shí)間戳
 * @param lastTimestamp 上次生成ID的時(shí)間截
 * @return 當(dāng)前時(shí)間戳
 */
protected long tilNextMillis(long lastTimestamp) {
    long timestamp = timeGen();
    while (timestamp <= lastTimestamp) {
        timestamp = timeGen();
    }
    return timestamp;
}

/**
 * 返回以毫秒為單位的當(dāng)前時(shí)間
 * @return 當(dāng)前時(shí)間(毫秒)
 */
protected long timeGen() {
    return System.currentTimeMillis();
}

//==============================Test=============================================
/** 測試 */
public static void main(String[] args) {
    IdWorker idWorker = new IdWorker(0, 0);
    for (int i = 0; i < 1000; i++) {
        long id = idWorker.nextId();
        System.out.println(Long.toBinaryString(id));
        System.out.println(id);
    }
}}

L'algorithme du flocon de neige peut être modifié en fonction des besoins de votre propre projet. Par exemple, estimez le nombre de futurs centres de données, le nombre de machines dans chaque centre de données et le nombre de simultanéités possibles en une milliseconde unifiée pour ajuster le nombre de bits requis dans l'algorithme.

Avantages?:

  1. Ne dépend pas de la base de données, est flexible et pratique, et offre de meilleures performances que la base de données.

  2. L'ID augmente sur une seule machine au fil du temps.

Inconvénients?:

  1. est incrémental sur une seule machine, mais comme il s'agit d'un environnement distribué, chaque machine Les horloges sur l'horloge ne peuvent pas être complètement synchronisées et il peut parfois y avoir des situations où l'incrément global n'est pas atteint.

5. Utilisez zookeeper pour générer un identifiant unique

zookeeper génère principalement des numéros de série via sa version de données znode, qui peut générer des numéros de version de données 32 bits et 64 bits. . Clients Le client peut utiliser ce numéro de version comme numéro de série unique.

Zookeeper est rarement utilisé pour générer des identifiants uniques. Principalement parce qu'il s'appuie sur zookeeper et appelle l'API en plusieurs étapes. Si la concurrence est importante, vous devez envisager d'utiliser des verrous distribués. Par conséquent, les performances ne sont pas idéales dans un environnement distribué hautement concurrent.

6. L'ObjectId de MongoDB

L'ObjectId de MongoDB est similaire à l'algorithme du flocon de neige. Il est con?u pour être léger et différentes machines peuvent facilement le générer en utilisant la même méthode unique au monde. MongoDB a été con?u dès le départ comme une base de données distribuée, et la gestion de plusieurs n?uds est une exigence fondamentale. Ce qui rend la génération beaucoup plus facile dans un environnement fragmenté. Le format est le suivant?: [src/main/resources/objectId.png] écrivez la description de l'image ici?:

Résumé des solutions de génération dID uniques pour les systèmes distribués

Les 4 premiers octets sont l'horodatage à partir de l'époque standard , l'unité est la seconde. L'horodatage, combiné aux 5 octets suivants, fournit une unicité de deuxième niveau. Puisque l'horodatage vient en premier, cela signifie que les ObjectIds seront triés approximativement dans l'ordre dans lequel ils ont été insérés. Ceci est utile pour des choses comme l'utiliser comme index pour améliorer l'efficacité. Ces 4 octets impliquent également l'heure à laquelle le document a été créé. La plupart des bibliothèques clientes exposeront une méthode pour obtenir ces informations à partir de l'ObjectId. Les 3 octets suivants sont l'identifiant unique de l'h?te. Généralement un hachage du nom d'h?te de la machine. Cela garantit que différents h?tes génèrent différents ObjectIds sans conflit. Pour garantir que l'ObjectId généré par plusieurs processus simultanés sur la même machine est unique, les deux octets suivants proviennent de l'identifiant de processus (PID) qui a généré l'ObjectId. Les 9 premiers octets garantissent que l'ObjectId généré par différents processus sur différentes machines au cours de la même seconde est unique. Les 3 derniers octets constituent un compteur qui augmente automatiquement pour garantir que l'ObjectId généré par le même processus dans la même seconde est également différent. Chaque processus est autorisé à avoir jusqu'à 2 563 (16 777 216) ObjectIds différents dans la même seconde.

Recommandations associées?:

Exemple de développement d'un système de gestion des communiqués de presse PHP

Tutoriel de développement d'un système de communiqués de presse simple en PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Comment utiliser Redis pour réaliser une synchronisation distribuée des données Comment utiliser Redis pour réaliser une synchronisation distribuée des données Nov 07, 2023 pm 03:55 PM

Comment utiliser Redis pour réaliser une synchronisation de données distribuées Avec le développement de la technologie Internet et des scénarios d'application de plus en plus complexes, le concept de systèmes distribués est de plus en plus largement adopté. Dans les systèmes distribués, la synchronisation des données est un problème important. En tant que base de données en mémoire hautes performances, Redis peut non seulement être utilisé pour stocker des données, mais peut également être utilisé pour réaliser une synchronisation distribuée des données. Pour la synchronisation distribuée des données, il existe généralement deux modes courants?: le mode publication/abonnement (Publish/Subscribe) et la réplication ma?tre-esclave (Master-slave).

Comment Redis implémente la gestion distribuée des sessions Comment Redis implémente la gestion distribuée des sessions Nov 07, 2023 am 11:10 AM

La fa?on dont Redis implémente la gestion de session distribuée nécessite des exemples de code spécifiques. La gestion de session distribuée est aujourd'hui l'un des sujets br?lants sur Internet. Face à une concurrence élevée et à de gros volumes de données, les méthodes traditionnelles de gestion de session deviennent progressivement inadéquates. En tant que base de données clé-valeur hautes performances, Redis fournit une solution de gestion de session distribuée. Cet article expliquera comment utiliser Redis pour implémenter la gestion de session distribuée et donnera des exemples de code spécifiques. 1. Introduction à Redis en tant que stockage de session distribué La méthode traditionnelle de gestion de session consiste à stocker les informations de session.

Comment utiliser Swoole pour mettre en ?uvre la planification distribuée des taches planifiées Comment utiliser Swoole pour mettre en ?uvre la planification distribuée des taches planifiées Nov 07, 2023 am 11:04 AM

Comment utiliser Swoole pour implémenter la planification distribuée des taches planifiées Introduction : Dans le développement PHP traditionnel, nous utilisons souvent cron pour implémenter la planification des taches planifiées, mais cron ne peut exécuter des taches que sur un seul serveur et ne peut pas faire face aux scénarios de concurrence élevée. Swoole est un framework de concurrence asynchrone hautes performances basé sur PHP. Il fournit des capacités de communication réseau complètes et une prise en charge multi-processus, nous permettant de mettre en ?uvre facilement une planification distribuée des taches planifiées. Cet article explique comment utiliser Swoole pour mettre en ?uvre la planification distribuée des taches planifiées.

Utiliser Redis pour obtenir la cohérence du cache distribué Utiliser Redis pour obtenir la cohérence du cache distribué Nov 07, 2023 pm 12:05 PM

Utiliser Redis pour assurer la cohérence du cache distribué Dans les systèmes distribués modernes, le cache joue un r?le très important. Cela peut réduire considérablement la fréquence d’accès du système à la base de données et améliorer les performances et le débit du système. Dans un système distribué, afin de garantir la cohérence du cache, nous devons résoudre le problème de la synchronisation des données entre plusieurs n?uds. Dans cet article, nous présenterons comment utiliser Redis pour obtenir la cohérence du cache distribué et donnerons des exemples de code spécifiques. Redis est une base de données clé-valeur hautes performances qui prend en charge la persistance, la réplication et la collecte

Partage d'expérience dans l'utilisation de MongoDB pour mettre en ?uvre la planification et l'exécution de taches distribuées Partage d'expérience dans l'utilisation de MongoDB pour mettre en ?uvre la planification et l'exécution de taches distribuées Nov 02, 2023 am 09:39 AM

MongoDB est une base de données NoSQL open source offrant des performances, une évolutivité et une flexibilité élevées. Dans les systèmes distribués, la planification et l'exécution des taches sont un problème clé. En utilisant les caractéristiques de MongoDB, des solutions de planification et d'exécution des taches distribuées peuvent être réalisées. 1. Analyse des exigences pour la planification distribuée des taches Dans un système distribué, la planification des taches est le processus d'attribution de taches à différents n?uds pour exécution. Les exigences courantes en matière de planification des taches incluent?: 1. Distribution des demandes de taches?: envoyer les demandes de taches aux n?uds d'exécution disponibles.

Méthodes et techniques pour développer et mettre en ?uvre des systèmes d'analyse de journaux distribués à l'aide du langage Go Méthodes et techniques pour développer et mettre en ?uvre des systèmes d'analyse de journaux distribués à l'aide du langage Go Nov 20, 2023 am 10:23 AM

Méthodes et techniques pour développer et mettre en ?uvre des systèmes d'analyse de journaux distribués à l'aide du langage Go Résumé : Avec l'avènement de l'ère du Big Data, l'analyse des journaux est devenue une tache essentielle pour les entreprises. Cet article présente les méthodes et techniques de développement et de mise en ?uvre d'un système d'analyse de journaux distribué basé sur le langage Go. L'article fournit une analyse détaillée des aspects de la conception de l'architecture du système, de la collecte de données, du traitement distribué, du stockage et des requêtes de données, etc., et fournit aux lecteurs un ensemble de directives pratiques. Mots-clés?: langage Go?; système distribué?; analyse de journaux 1. Introduction Avec le développement rapide d'Internet et des appareils intelligents

Utiliser Redis pour implémenter la planification de taches distribuées Utiliser Redis pour implémenter la planification de taches distribuées Nov 07, 2023 am 08:15 AM

Utiliser Redis pour mettre en ?uvre la planification distribuée des taches Avec l'expansion de l'activité et le développement du système, de nombreuses entreprises doivent mettre en ?uvre la planification distribuée des taches pour garantir que les taches peuvent être exécutées sur plusieurs n?uds en même temps, améliorant ainsi la stabilité et la disponibilité du système. système. En tant que produit de stockage de données en mémoire hautes performances, Redis présente les caractéristiques de distribution, de haute disponibilité et de hautes performances, et est très approprié pour la mise en ?uvre de la planification distribuée des taches. Cet article explique comment utiliser Redis pour implémenter la planification distribuée des taches et fournit des exemples de code correspondants. 1. Base Redis

Détails, techniques et bonnes pratiques pour la mise en ?uvre de la collecte et de l'analyse distribuées des journaux avec Golang et RabbitMQ Détails, techniques et bonnes pratiques pour la mise en ?uvre de la collecte et de l'analyse distribuées des journaux avec Golang et RabbitMQ Sep 27, 2023 pm 12:31 PM

Détails, techniques et bonnes pratiques pour la mise en ?uvre de la collecte et de l'analyse distribuées des journaux avec Golang et RabbitMQ Ces dernières années, avec la popularité de l'architecture des microservices et la complexité des systèmes à grande échelle, la collecte et l'analyse des journaux sont devenues de plus en plus importantes. Dans un système distribué, les journaux de chaque microservice sont souvent dispersés à différents endroits. Comment collecter et analyser efficacement ces journaux devient un défi. Cet article présentera les détails, les techniques et les meilleures pratiques sur la fa?on d'utiliser Golang et RabbitMQ pour implémenter la collecte et l'analyse distribuées des journaux. Ra

See all articles