Workerman ialah rangka kerja rangkaian berprestasi tinggi yang dibangunkan berdasarkan PHP, yang digunakan secara meluas untuk membina sistem komunikasi masa nyata dan perkhidmatan konkurensi tinggi. Dalam senario aplikasi sebenar, kita sering perlu meningkatkan kebolehpercayaan dan prestasi sistem melalui pengimbangan beban. Artikel ini akan memperkenalkan cara melaksanakan pengimbangan beban dalam Workerman dan memberikan contoh kod khusus.
Pengimbangan beban merujuk kepada memperuntukkan trafik rangkaian kepada berbilang pelayan bahagian belakang untuk meningkatkan kapasiti beban sistem, mengurangkan masa tindak balas dan meningkatkan ketersediaan dan kebolehskalaan sistem. Dalam Workerman, kita boleh mencapai pengimbangan beban dalam pelbagai cara Dua kaedah biasa akan diperkenalkan di bawah: pengimbangan beban berasaskan undian dan pengimbangan beban berasaskan berat.
$backends = array( '127.0.0.1:8081', '127.0.0.1:8082', '127.0.0.1:8083' ); $backendIndex = 0; $worker = new Worker('tcp://0.0.0.0:8080'); $worker->onConnect = function($connection) use ($backends, &$backendIndex) { $remoteAddress = $backends[$backendIndex]; $backendIndex = ($backendIndex + 1) % count($backends); $backendConnection = new AsyncTcpConnection('tcp://' . $remoteAddress); $backendConnection->onConnect = function($backendConnection) use ($connection) { // 连接后端服务器成功,将后端服务器连接的数据回传给客户端连接 $backendConnection->pipe($connection); $connection->pipe($backendConnection); }; $connection->backendConnection = $backendConnection; $backendConnection->connect(); }; $worker->onMessage = function($connection, $data) { // 将客户端发送的数据传递给后端服务器 $connection->backendConnection->send($data); };
Dalam kod di atas, tatasusunan $backends menyimpan alamat IP dan nombor port pelayan bahagian belakang, dan pembolehubah $backendIndex digunakan untuk merekodkan lokasi pelayan bahagian belakang yang diperuntukkan pada masa ini. Apabila sambungan baharu diwujudkan pada klien, permintaan itu diperuntukkan kepada pelayan bahagian belakang dengan cara pengundian, dan selepas sambungan berjaya diwujudkan, data sambungan pelayan bahagian belakang dihantar semula ke sambungan klien. Apabila pelanggan menghantar data, data dihantar ke pelayan bahagian belakang.
$backends = array( array('address' => '127.0.0.1:8081', 'weight' => 1), array('address' => '127.0.0.1:8082', 'weight' => 2), array('address' => '127.0.0.1:8083', 'weight' => 3) ); $worker = new Worker('tcp://0.0.0.0:8080'); $worker->onConnect = function($connection) use ($backends) { $totalWeight = array_sum(array_column($backends, 'weight')); $random = rand(1, $totalWeight); foreach ($backends as $backend) { $random -= $backend['weight']; if ($random <= 0) { $remoteAddress = $backend['address']; break; } } $backendConnection = new AsyncTcpConnection('tcp://' . $remoteAddress); $backendConnection->onConnect = function($backendConnection) use ($connection) { // 连接后端服务器成功,将后端服务器连接的数据回传给客户端连接 $backendConnection->pipe($connection); $connection->pipe($backendConnection); }; $connection->backendConnection = $backendConnection; $backendConnection->connect(); }; $worker->onMessage = function($connection, $data) { // 将客户端发送的数据传递给后端服务器 $connection->backendConnection->send($data); };
Dalam kod di atas, tatasusunan $backends menyimpan alamat IP dan nombor port pelayan bahagian belakang dan nilai berat yang sepadan. Apabila sambungan baharu diwujudkan pada klien, pelayan hujung belakang dipilih berdasarkan nilai berat pelayan hujung belakang, dan selepas sambungan berjaya diwujudkan, data sambungan pelayan hujung belakang dihantar semula kepada klien sambungan. Apabila pelanggan menghantar data, data dihantar ke pelayan bahagian belakang.
Melalui dua kaedah pelaksanaan pengimbangan beban di atas, kami boleh membina aplikasi rangkaian yang sangat tersedia dan berprestasi tinggi dengan mudah dalam Workerman. Dalam aplikasi praktikal, kita boleh memilih algoritma pengimbangan beban yang sesuai mengikut keperluan dan menggunakannya secara fleksibel mengikut senario sebenar.
Atas ialah kandungan terperinci Kaedah pelaksanaan pengimbangan beban dalam dokumentasi Workerman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!