Heim  >  Artikel  >  Backend-Entwicklung  >  Verteilte Aufgabenplanung und verteilte Methode zur eindeutigen ID-Generierung im PHP-Flash-Sale-System

Verteilte Aufgabenplanung und verteilte Methode zur eindeutigen ID-Generierung im PHP-Flash-Sale-System

WBOY
WBOYOriginal
2023-09-20 10:36:111259Durchsuche

Verteilte Aufgabenplanung und verteilte Methode zur eindeutigen ID-Generierung im PHP-Flash-Sale-System

Verteilte Aufgabenplanung und verteilte Methoden zur eindeutigen ID-Generierung im PHP-Flash-Sale-System

Im PHP-Flash-Sale-System sind verteilte Aufgabenplanung und verteilte eindeutige ID-Generierung zwei sehr wichtige Funktionen. In diesem Artikel wird erläutert, wie diese beiden Funktionen implementiert werden, und es werden spezifische Codebeispiele bereitgestellt.

1. Verteilte Aufgabenplanung

Im Flash-Sale-System ist eine große Anzahl gleichzeitiger Vorgänge und geplanter Aufgaben erforderlich. In einer eigenständigen Umgebung belasten diese Vorgänge und Aufgaben den Server stark. Um die gleichzeitigen Verarbeitungsfähigkeiten und die Effizienz der Aufgabenplanung des Systems zu verbessern, können wir eine verteilte Aufgabenplanungslösung übernehmen.

Das Folgende ist ein Beispielcode, der Redis als Nachrichtenwarteschlange verwendet, um die verteilte Aufgabenplanung zu implementieren:

<?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']} 
";
    }
}

Im obigen Beispielcode speichert der Produzent Aufgabendaten in der Redis-Warteschlange, während der Verbraucher Aufgaben aus der Warteschlange herausnimmt eine Schleife und ausführen.

2. Verteilte Methode zur eindeutigen ID-Generierung

Im Flash-Sale-System muss eine eindeutige ID generiert werden, um Bestellungen, Benutzer und andere Informationen aufzuzeichnen. Bei der herkömmlichen Methode zur selbsterhöhenden ID-Generierung treten in einer verteilten Umgebung Konfliktprobleme auf. Um dieses Problem zu lösen, können wir den Snowflake-Algorithmus verwenden, um verteilte eindeutige IDs zu generieren.

Das Folgende ist ein Beispielcode, der den Snowflake-Algorithmus verwendet, um eine verteilte eindeutige ID-Generierung zu erreichen:

<?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;
}

Im obigen Beispielcode verwenden wir den Snowflake-Algorithmus, um eindeutige IDs zu generieren. Unter anderem müssen die Rechenzentrums-ID und die Arbeitsknoten-ID basierend auf der tatsächlichen Situation ermittelt werden. Durch den Aufruf der nextId-Methode kann eine eindeutige ID generiert werden.

Fazit

Durch verteilte Aufgabenplanung und verteilte Methoden zur Generierung eindeutiger IDs können wir die gleichzeitigen Verarbeitungsfähigkeiten und die Effizienz der Aufgabenplanung des Flash-Sale-Systems verbessern und die Generierung eindeutiger IDs sicherstellen. Ich hoffe, dass die obige Einführung Ihnen hilft, die verteilte Aufgabenplanung und die verteilte eindeutige ID-Generierung zu verstehen.

Das obige ist der detaillierte Inhalt vonVerteilte Aufgabenplanung und verteilte Methode zur eindeutigen ID-Generierung im PHP-Flash-Sale-System. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn