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 örnekte workerman/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.