Maison  >  Article  >  développement back-end  >  Planification de tâches distribuées et méthode de génération d'ID unique distribuée dans le système de vente flash PHP

Planification de tâches distribuées et méthode de génération d'ID unique distribuée dans le système de vente flash PHP

WBOY
WBOYoriginal
2023-09-20 10:36:111244parcourir

Planification de tâches distribuées et méthode de génération dID unique distribuée dans le système de vente flash PHP

Planification distribuée des tâches et méthodes de génération d'identifiants uniques distribués dans le système de vente flash PHP

Dans le système de vente flash PHP, la planification distribuée des tâches et la génération d'identifiants uniques distribués sont deux fonctions très critiques. Cet article présentera comment implémenter ces deux fonctions et fournira des exemples de code spécifiques.

1. Planification distribuée des tâches

Dans le système de vente flash, un grand nombre d'opérations simultanées et de tâches planifiées sont nécessaires. Dans un environnement autonome, ces opérations et tâches mettront beaucoup de pression sur le serveur. Afin d'améliorer les capacités de traitement simultané du système et l'efficacité de la planification des tâches, nous pouvons adopter une solution de planification des tâches distribuée.

Ce qui suit est un exemple de code qui utilise Redis comme file d'attente de messages pour implémenter la planification distribuée des tâches :

<?php
// 生产者代码
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$taskData = [
    'task_id' => uniqid(), // 任务ID
    'task_data' => 'some data' // 任务数据
];

$redis->lPush('task_queue', json_encode($taskData));

// 消费者代码
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

while (true) {
    $taskDataJson = $redis->rPop('task_queue');
    if ($taskDataJson) {
        $taskData = json_decode($taskDataJson, true);
        // 执行任务代码
        echo "Task ID: {$taskData['task_id']} 
";
        echo "Task Data: {$taskData['task_data']} 
";
    }
}

Dans l'exemple de code ci-dessus, le producteur stocke les données de tâche dans la file d'attente Redis, tandis que le consommateur retire les tâches de la file d'attente via une boucle et exécuter.

2. Méthode de génération d'identifiant unique distribué

Dans le système de vente flash, un identifiant unique doit être généré pour enregistrer les commandes, les utilisateurs et d'autres informations. La méthode traditionnelle de génération d'ID à auto-augmentation rencontrera des problèmes de conflit dans un environnement distribué. Pour résoudre ce problème, nous pouvons utiliser l'algorithme Snowflake pour générer des identifiants uniques distribués.

Ce qui suit est un exemple de code qui utilise l'algorithme Snowflake pour générer une génération d'identifiants uniques distribués :

<?php
class Snowflake
{
    private $dataCenterId; // 数据中心ID
    private $workerId; // 工作节点ID
    private $sequence = 0; // 序列号

    const EPOCH = 1590000000; // 起始时间戳,2020-05-21 00:00:00

    public function __construct($dataCenterId, $workerId)
    {
        // 检查工作节点ID和数据中心ID是否合法
        if ($dataCenterId > 31 || $dataCenterId < 0) {
            throw new InvalidArgumentException("Data Center ID can't be greater than 31 or less than 0");
        }
        if ($workerId > 31 || $workerId < 0) {
            throw new InvalidArgumentException("Worker ID can't be greater than 31 or less than 0");
        }

        $this->dataCenterId = $dataCenterId;
        $this->workerId = $workerId;
    }

    public function nextId()
    {
        $timestamp = $this->getTimestamp();
        if ($timestamp < self::EPOCH) {
            throw new Exception("Clock moved backwards. Refusing to generate ID");
        }

        if ($timestamp === $this->lastTimestamp) {
            $this->sequence = ($this->sequence + 1) & 4095; // 4095是12位二进制
            if ($this->sequence === 0) {
                $timestamp = $this->tilNextMillis();
            }
        } else {
            $this->sequence = 0;
        }

        $this->lastTimestamp = $timestamp;

        return (($timestamp - self::EPOCH) << 22) | ($this->dataCenterId << 17) | ($this->workerId << 12) | $this->sequence;
    }

    public function tilNextMillis()
    {
        $timestamp = $this->getTimestamp();
        while ($timestamp <= $this->lastTimestamp) {
            $timestamp = $this->getTimestamp();
        }
        return $timestamp;
    }

    public function getTimestamp()
    {
        return floor(microtime(true) * 1000);
    }
}

// 测试代码
$snowflake = new Snowflake(1, 1); // 数据中心ID为1,工作节点ID为1

for ($i = 0; $i < 10; $i++) {
    echo $snowflake->nextId() . PHP_EOL;
}

Dans l'exemple de code ci-dessus, nous utilisons l'algorithme Snowflake pour générer des identifiants uniques. Parmi eux, l'ID du centre de données et l'ID du nœud de travail doivent être déterminés en fonction de la situation réelle. En appelant la méthode nextId, un identifiant unique peut être généré.

Conclusion

Grâce à la planification distribuée des tâches et aux méthodes distribuées de génération d'identifiants uniques, nous pouvons améliorer les capacités de traitement simultané et l'efficacité de la planification des tâches du système de vente flash et assurer la génération d'identifiants uniques. J'espère que l'introduction ci-dessus vous aidera à comprendre la planification distribuée des tâches et la génération distribuée d'ID uniques.

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:
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