Rumah > Artikel > rangka kerja php > Cara melaksanakan kunci teragih dalam Swoole
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:
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:
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.
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 ZookeeperProses 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.
RingkasanAtas ialah kandungan terperinci Cara melaksanakan kunci teragih dalam Swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!