Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjadualan tugas yang diedarkan dan kaedah penjanaan ID unik yang diedarkan dalam sistem jualan kilat PHP

Penjadualan tugas yang diedarkan dan kaedah penjanaan ID unik yang diedarkan dalam sistem jualan kilat PHP

WBOY
WBOYasal
2023-09-20 10:36:111244semak imbas

Penjadualan tugas yang diedarkan dan kaedah penjanaan ID unik yang diedarkan dalam sistem jualan kilat PHP

Penjadualan tugas teragih dan kaedah penjanaan ID unik yang diedarkan dalam sistem jualan kilat PHP

Dalam sistem jualan kilat PHP, penjadualan tugas yang diedarkan dan pengagihan unik Penjanaan ID adalah dua fungsi yang sangat kritikal. Artikel ini akan memperkenalkan cara melaksanakan kedua-dua fungsi ini dan menyediakan contoh kod khusus.

1. Penjadualan tugas teragih

Dalam sistem jualan kilat, sejumlah besar operasi serentak dan tugas berjadual diperlukan. Dalam persekitaran yang berdiri sendiri, operasi dan tugasan ini akan memberi banyak tekanan kepada pelayan. Untuk meningkatkan keupayaan pemprosesan serentak sistem dan kecekapan penjadualan tugas, kami boleh menggunakan penyelesaian penjadualan tugas teragih.

Berikut ialah kod sampel yang menggunakan Redis sebagai baris gilir mesej untuk melaksanakan penjadualan tugas teragih:

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

Dalam kod sampel di atas, pengeluar menyimpan data tugas dalam Redis queue , manakala pengguna mengeluarkan tugasan daripada baris gilir dan melaksanakannya melalui gelung.

2. Kaedah penjanaan ID unik yang diedarkan

Dalam sistem jualan kilat, ID unik perlu dijana untuk merekodkan pesanan, pengguna dan maklumat lain. Kaedah penjanaan ID meningkat sendiri tradisional akan menghadapi masalah konflik dalam persekitaran yang diedarkan. Untuk menyelesaikan masalah ini, kami boleh menggunakan algoritma Snowflake untuk menjana ID unik yang diedarkan.

Berikut ialah kod sampel yang menggunakan algoritma Snowflake untuk mencapai penjanaan ID unik yang diedarkan:

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

Dalam kod sampel di atas, kami menggunakan algoritma Snowflake untuk menjana unik ID. Antaranya, ID pusat data dan ID nod kerja perlu ditentukan berdasarkan situasi sebenar. Dengan memanggil kaedah nextId, ID unik boleh dijana.

Kesimpulan

Melalui penjadualan tugas teragih dan kaedah penjanaan ID unik yang diedarkan, kami boleh meningkatkan keupayaan pemprosesan serentak dan kecekapan penjadualan tugas sistem jualan kilat dan memastikan penjanaan unik ID . Saya harap pengenalan di atas akan membantu anda memahami penjadualan tugas teragih dan penjanaan ID unik yang diedarkan.

Atas ialah kandungan terperinci Penjadualan tugas yang diedarkan dan kaedah penjanaan ID unik yang diedarkan dalam sistem jualan kilat PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn