Yavaş İşlem İşleme
Bazen yavaş işlemleri ele almamız gerekir, webman’ın diğer istek işleme süreçlerini etkilememesi için, bu işlemler duruma göre farklı işleme planları kullanabilir.
Plan 1 Mesaj Kuyruğu Kullanımı
Referans redis kuyruğu stomp kuyruğu
Avantajlar
Ani büyük iş yükü talepleri ile başa çıkabilir.
Dezavantajlar
Sonuçları doğrudan istemciye döndüremez. Sonuçları iletmek gerekiyorsa, diğer hizmetlerle birlikte kullanılması gerekir, örneğin webman/push ile işleme sonuçlarını göndermek.
Plan 2 Yeni HTTP Portu Ekleme
Yavaş istekleri işlemek için yeni bir HTTP portu ekleyin, bu yavaş istekler bu port aracılığıyla belirli bir süreç grubuna girer ve işlem tamamlandığında sonuçları doğrudan istemciye döner.
Avantajlar
Verileri doğrudan istemciye döndürebilir.
Dezavantajlar
Ani büyük taleplerle başa çıkamaz.
Uygulama Adımları
config/process.php
dosyasına aşağıdaki yapılandırmayı ekleyin.
return [
// ... Diğer yapılandırmalar burada atlanmıştır ...
'task' => [
'handler' => \Webman\App::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Proses sayısı
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // request sınıfı ayarı
'logger' => \support\Log::channel('default'), // Log örneği
'appPath' => app_path(), // app dizini konumu
'publicPath' => public_path() // public dizini konumu
]
]
];
Böylece yavaş arayüz http://127.0.0.1:8686/
üzerinden bu grup süreçler tarafından işlenebilir, diğer süreçlerin işleme sürecini etkilemez.
Ön uç için portların ayrımını hissettirmemek için, nginx'de 8686 portuna bir proxy ekleyebilirsiniz. Yavaş arayüz istem taleplerinin hepsinin /tast
ile başladığını varsayalım, tüm nginx yapılandırması şu şekilde olabilir:
upstream webman {
server 127.0.0.1:8787;
keepalive 10240;
}
# Yeni bir 8686 upstream ekleyin
upstream task {
server 127.0.0.1:8686;
keepalive 10240;
}
server {
server_name webman.com;
listen 80;
access_log off;
root /path/webman/public;
# /tast ile başlayan istekler 8686 portuna yönlendirilir, lütfen gerekli duruma göre /tast'ı ihtiyaç duyduğunuz ön ek ile değiştirin
location /tast {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://task;
}
# Diğer istekler orijinal 8787 portundan geçer
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
if (!-f $request_filename){
proxy_pass http://webman;
}
}
}
Böylece istemci domain.com/tast/xxx
adresini ziyaret ettiğinde, ayrı 8686 portu üzerinden işlenecek ve 8787 portunun istek işleme sürecini etkilemeyecektir.
Plan 3 HTTP Chunked Kullanarak Asenkron Parça Parça Veri Gönderimi
Avantajlar
Verileri doğrudan istemciye döndürebilir.
workerman/http-client yükleyin
composer require workerman/http-client
app/controller/IndexController.php
<?php
namespace app\controller;
use support\Request;
use support\Response;
use Workerman\Protocols\Http\Chunk;
class IndexController
{
public function index(Request $request)
{
$connection = $request->connection;
$http = new \Workerman\Http\Client();
$http->get('https://example.com/', function ($response) use ($connection) {
$connection->send(new Chunk($response->getBody()));
$connection->send(new Chunk('')); // Boş bir chunk göndererek yanıtın sonlandığını belirtir
});
// Önce bir http başlığı gönderilir, sonraki veriler asenkron olarak gönderilir
return response()->withHeaders([
"Transfer-Encoding" => "chunked",
]);
}
}
İpucu
Bu örnekteworkerman/http-client
istemcisi kullanılarak asenkron olarak http sonuçları alınmakta ve veriler döndürülmektedir, ayrıca diğer asenkron istemciler de kullanılabilir, örneğin AsyncTcpConnection.