Rumah  >  Artikel  >  rangka kerja php  >  Cara melaksanakan kunci teragih dalam Swoole

Cara melaksanakan kunci teragih dalam Swoole

PHPz
PHPzasal
2023-06-25 16:45:21985semak imbas

Dengan pembangunan Internet dan Internet mudah alih, sistem konkurensi dan pengedaran yang tinggi telah menjadi masalah yang tidak dapat dielakkan dalam pembangunan harian. Dalam kes ini, kunci yang diedarkan menjadi alat yang sangat diperlukan yang boleh membantu kami mengelakkan masalah seperti persaingan sumber dan ketidakkonsistenan data. Artikel ini akan memperkenalkan cara melaksanakan kunci teragih dalam Swoole untuk membantu anda menyelesaikan masalah konkurensi dengan lebih baik dalam sistem teragih.

1. Apakah kunci yang diedarkan?

Dalam sistem yang diedarkan, terdapat berbilang proses mengakses sumber yang dikongsi pada masa yang sama Untuk memastikan data tidak dimusnahkan atau konflik serentak berlaku, sumber yang dikongsi ini perlu dikunci. Kunci teragih ialah mekanisme kunci yang direka untuk mencapai penggunaan sumber kongsi yang betul dalam sistem teragih.

Pelaksanaan kunci teragih agak rumit, dan secara amnya aspek berikut perlu dipertimbangkan:

  1. Keeksklusifan bersama: hanya satu proses atau benang boleh menduduki kunci pada masa yang sama
  2. Reentrancy: proses atau benang yang sama boleh mempunyai berbilang Mohon kunci beberapa kali, tetapi bilangan operasi buka kunci yang sama perlu dilakukan semasa membuka kunci
  3. Cegah kebuntuan: Anda perlu menetapkan masa tamat tempoh apabila memperoleh kunci untuk mengelakkan menunggu tanpa had disebabkan pengecualian atau sebab lain; ;
  4. Ketersediaan tinggi: perlu dipertimbangkan Masalah seperti kegagalan nod dan sekatan rangkaian
  5. Prestasi: Ia adalah perlu untuk mencapai ciri konkurensi tinggi dan kependaman rendah.

2. Pengenalan kepada Swoole

Swoole ialah enjin komunikasi rangkaian tak segerak dan selari berprestasi tinggi untuk bahasa PHP Ia boleh melaksanakan pelayan dan klien pelbagai protokol seperti TCP/UDP/HTTP/WebSocket. Ciri-ciri Swoole termasuk:

  1. Prestasi tinggi: menggunakan model IO tidak menyekat asynchronous, yang boleh meningkatkan keupayaan concurrency pelayan dengan banyak
  2. Coroutine terbina dalam: pengaturcaraan tak segerak boleh dilaksanakan dengan mudah tanpa perlu secara manual; cipta benang atau proses;
  3. Pelayan HTTP /WebSocket terbina dalam: Pembangunan aplikasi web boleh direalisasikan dengan mudah
  4. menyokong pengkapsulan MySQL, Redis, ElasticSearch dan alatan biasa yang lain.

Oleh itu, Swoole mempunyai kebolehsuaian yang sangat baik dan boleh digunakan untuk membina sistem teragih berkonkurensi tinggi dan berprestasi tinggi.

3. Bagaimana untuk melaksanakan kunci yang diedarkan dalam Swoole?

Di bawah ini kami akan memperkenalkan cara melaksanakan kunci teragih dalam Swoole.

  1. Melaksanakan kunci teragih berdasarkan Redis

Redis ialah pangkalan data nilai kunci berasaskan memori dan salah satu alatan yang paling biasa digunakan dalam sistem teragih. Ia menyokong pelbagai struktur data, termasuk rentetan, senarai, set, set tersusun, dll. Antaranya, jenis rentetan boleh digunakan untuk melaksanakan kunci teragih.

Proses umum menggunakan Redis untuk melaksanakan kunci teragih adalah seperti berikut:

(1) Dapatkan objek sambungan Redis melalui kumpulan sambungan Redis
(2) Gunakan perintah SETNX untuk mencapai pengecualian bersama kunci, yang bermaksud apabila nilai pulangan adalah 1 Pekerjaan berjaya;

Berikut ialah kod pelaksanaan khusus:

class RedisLock
{
    private $redis;

    public function __construct($config)
    {
        $this->redis = new Redis();
        $this->redis->connect($config['host'], $config['port'], $config['timeout']);
        if (!empty($config['auth'])) {
            $this->redis->auth($config['auth']);
        }
    }

    public function lock($key, $timeout = 10)
    {
        $startTime = time();
        do {
            $result = $this->redis->setnx($key, time() + $timeout);
            if ($result) {
                return true;
            }
            $lockTime = $this->redis->get($key);
            if ($lockTime && $lockTime < time()) {
                $oldTime = $this->redis->getset($key, time() + $timeout);
                if ($oldTime == $lockTime) {
                    return true;
                }
            }
            usleep(100); // 100毫秒等待
        } while (time() - $startTime < $timeout);
        return false;
    }

    public function unlock($key)
    {
        $this->redis->del($key);
    }
}

Dalam kod di atas, gelung do-while digunakan dalam fungsi kunci untuk menunggu kunci dilepaskan Apabila masa menunggu melebihi tamat masa yang diberikan, false dikembalikan ; DEL digunakan dalam arahan fungsi buka kunci untuk melepaskan kunci. Walaupun kaedah ini mudah dilaksanakan dan mempunyai overhed yang rendah, kaedah ini juga mempunyai kebarangkalian kebuntuan tertentu.

Melaksanakan kunci teragih berdasarkan Zookeeper
  1. Zookeeper ialah sistem penyelarasan sumber terbuka teragih yang boleh digunakan untuk melaksanakan satu siri fungsi seperti penyegerakan data dan pengurusan konfigurasi dalam sistem teragih. Nod jujukan sementara (EPHEMERAL_SEQUENTIAL) yang disediakannya boleh melaksanakan kunci teragih dengan mudah.

Proses umum menggunakan Zookeeper untuk melaksanakan kunci yang diedarkan adalah seperti berikut:

(1) Buat klien Zookeeper dan sambung ke pelayan Zookeeper

(2) Gunakan fungsi createSequential untuk mencipta nod jujukan sementara

(3 ) Dapatkan Zookeeper Semua nod diisih mengikut nombor siri nod
(4) Bandingkan nombor siri nod anda sendiri dengan nombor siri nod terkecil semasa, ini bermakna kunci telah diperolehi, jika tidak, dengarkan nod terkini yang lebih kecil daripada nombor siri anda sendiri
(5) Apabila Apabila nod dengan nombor urutan yang lebih kecil daripada nod sendiri dipadamkan, nod semasa menerima pemberitahuan acara dan kemudian mengulangi langkah 4.

Berikut ialah kod pelaksanaan khusus:

class ZookeeperLock
{
    private $zk;
    private $basePath = '/lock';
    private $myNode;

    public function __construct($config)
    {
        $this->zk = new Zookeeper();
        $this->zk->connect($config['host'] . ':' . $config['port']);
        if (isset($config['auth'])) {
            $this->zk->addAuth('digest', $config['auth']);
        }
        if (!$this->zk->exists($this->basePath)) {
            $this->zk->create($this->basePath, null, array(array('perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone')), null);
        }
    }

    public function lock()
    {
        $this->myNode = $this->zk->create($this->basePath . '/node_', null, array(array('perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone')), Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE);
        while (true) {
            $children = $this->zk->getChildren($this->basePath);
            sort($children);
            $pos = array_search(basename($this->myNode), $children);
            if ($pos === 0) {
                return true;
            } else {
                $this->zk->exists($this->basePath . '/' . $children[$pos - 1], function ($event_type, $s, $event_data) {
                    $this->unlock();
                });
                usleep(100); // 100毫秒等待
            }
        }
    }

    public function unlock()
    {
        if ($this->myNode) {
            $this->zk->delete($this->myNode);
            $this->myNode = null;
        }
    }
}

Dalam kod di atas, fungsi kunci menggunakan gelung sementara untuk memantau nod terbaharu dengan nombor siri yang lebih kecil daripada nod sendiri Apabila nod dipadamkan, ia bermakna ia telah memperoleh kunci; fungsi buka kunci menggunakan padam Fungsi memadamkan nod semasa.

Ringkasan
  1. Artikel ini memperkenalkan cara melaksanakan kunci teragih dalam Swoole Kami memperkenalkan dua kaedah pelaksanaan biasa berdasarkan Redis dan Zookeeper, dan memberikan kod pelaksanaan. Sebagai cara teknikal yang penting untuk memastikan konsistensi data dalam sistem yang diedarkan, kunci yang diedarkan boleh membantu kami mengelakkan masalah seperti konflik konkurensi dan ketidakkonsistenan data. Apabila melaksanakan kunci teragih, anda perlu mempertimbangkan isu seperti eksklusiviti bersama, kemasukan semula, pencegahan kebuntuan, ketersediaan tinggi dan prestasi serta memilih kaedah pelaksanaan yang berbeza berdasarkan senario aplikasi sebenar.

Atas ialah kandungan terperinci Cara melaksanakan kunci teragih dalam Swoole. 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