Traitement des opérations lentes
Parfois, nous avons besoin de traiter des opérations lentes afin d'éviter qu'elles n'impactent le traitement d'autres requêtes dans webman. Selon les circonstances, ces opérations peuvent être traitées de différentes manières.
Utilisation de files d'attente de messages
Voir file d'attente Redis et file d'attente Stomp
Avantages
Capacité à gérer des demandes de traitement soudaines et massives
Inconvénients
Impossible de retourner directement les résultats au client. Si la diffusion des résultats est nécessaire, elle doit être associée à d'autres services, tels que l'utilisation de webman/push pour diffuser les résultats du traitement.
Ajout d'un port HTTP
Remarque
Cette fonctionnalité nécessite webman-framework>=1.4
Ajoute un port HTTP pour le traitement des requêtes lentes. Ces requêtes lentes sont dirigées vers un ensemble spécifique de processus via l'accès à ce port, et les résultats du traitement sont renvoyés directement au client.
Avantages
Capacité à renvoyer directement les données au client
Inconvénients
Impossible de gérer des demandes soudaines et massives
Étapes de mise en œuvre
Ajoutez la configuration suivante dans config/process.php
.
return [
// ... autres configurations omises ...
'task' => [
'handler' => \Webman\App::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // nombre de processus
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'request_class' => \support\Request::class, // configuration de la classe de demande
'logger' => \support\Log::channel('default'), // instance de journal
'app_path' => app_path(), // emplacement du répertoire d'application
'public_path' => public_path() // emplacement du répertoire public
]
]
];
De cette manière, les requêtes lentes peuvent être routées vers ce groupe de processus via http://127.0.0.1:8686/
, sans affecter le traitement des autres processus.
Pour que le client ne perçoive pas la différence de port, vous pouvez ajouter une directive de proxy vers le port 8686 dans nginx. Supposons que les chemins des requêtes lentes commencent tous par /tast
, la configuration nginx complète serait similaire à ce qui suit :
upstream webman {
server 127.0.0.1:8787;
keepalive 10240;
}
# Ajouter un upstream 8686
upstream task {
server 127.0.0.1:8686;
keepalive 10240;
}
server {
server_name webman.com;
listen 80;
access_log off;
root /path/webman/public;
# Les requêtes commençant par /tast sont dirigées vers le port 8686, veuillez remplacer /tast par le préfixe nécessaire selon la situation
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;
}
# Les autres requêtes passent par le port 8787 d'origine
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;
}
}
}
Ainsi, lorsque le client accède à domaine.com/tast/xxx
, la requête est dirigée vers le port 8686 distinct, sans affecter le traitement des requêtes sur le port 8787.