Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro PHP

Bagaimana untuk melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro PHP

WBOY
WBOYasal
2023-09-25 10:33:431293semak imbas

Bagaimana untuk melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro PHP

Cara melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro PHP

Pengenalan:
Dengan perkembangan pesat dan pembangunan Internet Dengan peningkatan pesat dalam bilangan pengguna, keperluan untuk kawalan konkurensi dan fungsi mengehadkan semasa pelayan semakin tinggi. Artikel ini akan memperkenalkan cara melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro PHP dan menyediakan contoh kod khusus.

1. Keperluan untuk kawalan serentak

Dalam aplikasi tunggal tradisional, permintaan untuk kawalan serentak tidak begitu tinggi. Walau bagaimanapun, dalam seni bina perkhidmatan mikro, setiap perkhidmatan digunakan dan dijalankan secara bebas dan mungkin menghadapi sejumlah besar permintaan serentak. Jika dibiarkan, ia boleh mengakibatkan beban pelayan yang berlebihan, masa respons yang lama, atau malah ranap sistem. Oleh itu, adalah penting untuk melaksanakan fungsi kawalan konkurensi dalam perkhidmatan mikro.

2. Kaedah untuk mencapai kawalan konkurensi

  1. Gunakan semaphore (Semaphore)
#🎜🎜 ialah #Semaphore biasa mekanisme kawalan konkurensi yang boleh mengawal bilangan utas serentak yang mengakses sumber pada masa yang sama. Dalam PHP, semaphore boleh dilaksanakan menggunakan sambungan Semaphore.

Pertama, kita perlu memasang sambungan Semaphore. Ia boleh dipasang melalui baris arahan berikut:

$ pecl install sem

Selepas memasang sambungan, kita boleh menggunakan kelas Semaphore untuk melaksanakan kawalan konkurensi. Berikut ialah contoh kod mudah:

// 初始化信号量,参数1表示资源的数量
$sem = new Semaphore(10);

// 等待可用资源
$sem->acquire();

// 执行需要控制并发的代码

// 释放资源
$sem->release();

Dalam contoh di atas, kami memulakan semaphore dengan 10 sumber. Setiap kali anda melaksanakan kod yang memerlukan kawalan serentak, gunakan kaedah perolehan untuk menunggu sumber yang tersedia dan gunakan kaedah keluaran untuk melepaskan sumber selepas pelaksanaan.

    Menggunakan baris gilir
Baris gilir ialah mekanisme kawalan serentak yang boleh memproses permintaan serentak mengikut susunan. Dalam PHP, anda boleh menggunakan baris gilir mesej untuk mencapai kawalan serentak.

Terdapat banyak pelaksanaan baris gilir mesej dalam PHP, seperti RabbitMQ, Redis, dll. Di sini kami mengambil Redis sebagai contoh untuk memperkenalkan cara menggunakan Redis untuk melaksanakan kawalan serentak.

Pertama, kita perlu memasang sambungan Redis dan perpustakaan Predis. Ia boleh dipasang melalui baris arahan berikut:

$ pecl install redis
$ composer require predis/predis

Selepas memasang sambungan dan perpustakaan, kita boleh menggunakan jenis Senarai Redis untuk melaksanakan baris gilir. Berikut ialah kod sampel:

// 连接Redis
$redis = new PredisClient();

// 将请求添加到队列
$redis->rpush('request_queue', time());

// 从队列中取出请求
$request = $redis->lpop('request_queue');

// 执行需要控制并发的代码

// 删除已处理的请求
$redis->lrem('request_queue', 0, $request);

Dalam contoh di atas, kami menambah permintaan pada baris gilir melalui kaedah rpush dan mengalih keluar permintaan daripada baris gilir melalui kaedah lpop untuk pemprosesan. Selepas pemprosesan, padamkan permintaan yang diproses melalui kaedah lrem.

3. Keperluan untuk mengehadkan semasa

Penghadan semasa ialah kaedah sisi pelayan biasa untuk mengawal permintaan serentak, yang boleh mengehadkan bilangan permintaan setiap unit masa. Menggunakan pendikitan dalam perkhidmatan mikro boleh melindungi perkhidmatan hujung belakang daripada tekanan permintaan yang berlebihan.

4. Kaedah untuk melaksanakan pengehadan semasa

    Gunakan algoritma baldi token
Algoritma baldi token biasa Salah satu algoritma pengehad semasa, ia mengekalkan baldi token kapasiti tetap, dan setiap permintaan memerlukan satu token untuk diproses. Apabila token tidak mencukupi dalam baldi, permintaan akan ditolak.

Berikut ialah contoh kod untuk algoritma baldi token yang dilaksanakan menggunakan Redis:

// 连接Redis
$redis = new PredisClient();

// 每秒生成10个令牌
$rate = 10;

// 桶的容量为20个令牌
$capacity = 20;

// 获取当前时间
$time = microtime(true);

// 计算当前桶中的令牌数量
$tokens = $redis->get('tokens');

// 重新计算桶中的令牌数量
if ($tokens === null) {
    $tokens = $capacity;
    $redis->set('tokens', $tokens);
    $redis->set('last_time', $time);
} else {
    $interval = $time - $redis->get('last_time');
    $newTokens = $interval * $rate;

    $tokens = min($tokens + $newTokens, $capacity);
    $redis->set('tokens', $tokens);
    $redis->set('last_time', $time);
}

// 判断是否有足够的令牌
$allow = $redis->get('tokens') >= 1;

if ($allow) {
    // 消耗一个令牌
    $redis->decr('tokens');

    // 执行请求处理代码
} else {
    // 拒绝请求
}

Dalam contoh di atas, kami menggunakan Redis untuk menyimpan bilangan token dalam baldi dan Terakhir dikemas kini. Setiap kali permintaan tiba, bilangan token baharu dikira dengan membandingkan selang masa antara masa semasa dan masa kemas kini terakhir, dan kemudian bilangan token dikemas kini kepada Redis.

Sekiranya terdapat cukup token dalam baldi, permintaan dibenarkan untuk lulus dan bilangan token dikurangkan sebanyak 1; jika tidak cukup token dalam baldi, permintaan ditolak.

Ringkasan:

Melaksanakan kawalan serentak dan fungsi pengehadan semasa dalam perkhidmatan mikro PHP adalah sangat penting untuk memastikan kestabilan dan pengoptimuman prestasi perkhidmatan. Artikel ini memperkenalkan cara menggunakan Semaphore dan baris gilir untuk melaksanakan kawalan konkurensi dan cara menggunakan algoritma baldi token untuk melaksanakan pengehadan semasa dan menyediakan contoh kod khusus. Dengan menggunakan fungsi ini secara rasional, permintaan serentak dapat dikawal dengan lebih baik dan kestabilan serta prestasi perkhidmatan dapat dipertingkatkan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kawalan konkurensi dan fungsi mengehadkan semasa dalam perkhidmatan mikro 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