Xử lý công việc chậm
Đôi khi chúng ta cần xử lý các công việc chậm, để tránh ảnh hưởng đến việc xử lý các yêu cầu khác của webman, các công việc này có thể sử dụng các phương pháp xử lý khác nhau tùy thuộc vào tình hình cụ thể.
Sử dụng hàng đợi tin nhắn
Xem thêm hàng đợi redis hàng đợi stomp
Ưu điểm
Có thể xử lý các yêu cầu xử lý công việc lớn đột ngột
Nhược điểm
Không thể trả kết quả trực tiếp cho người dùng. Nếu cần thông báo kết quả, cần kết hợp với dịch vụ khác, ví dụ như sử dụng webman/push để đẩy kết quả xử lý.
Thêm cổng HTTP mới
Lưu ý
Tính năng này yêu cầu webman-framework >= 1.4
Thêm cổng HTTP để xử lý các yêu cầu chậm, những yêu cầu này sẽ được xử lý bởi một nhóm quá trình cụ thể thông qua việc truy cập vào cổng này, sau đó sẽ trả kết quả trực tiếp cho người dùng.
Ưu điểm
Có thể trực tiếp trả kết quả về cho người dùng
Nhược điểm
Không thể gần gũi với các yêu cầu lớn đột ngột
Bước thực hiện
Thêm cấu hình sau vào config/process.php
.
return [
// ... Bỏ qua các cấu hình khác ở đây ...
'task' => [
'handler' => \Webman\App::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Số lượng quá trình
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'request_class' => \support\Request::class, // Cài đặt lớp request
'logger' => \support\Log::channel('default'), // Thực thể nhật ký
'app_path' => app_path(), // Vị trí thư mục app
'public_path' => public_path() // Vị trí thư mục public
]
]
];
Như vậy, các giao diện chậm có thể truy cập vào nhóm quá trình này thông qua http://127.0.0.1:8686/
, không ảnh hưởng đến việc xử lý công việc của các quá trình khác.
Để người dùng không cảm nhận được sự khác biệt về cổng, bạn có thể thêm một đoạn mã proxy vào nginx để trỏ đến cổng 8686. Giả sử đường dẫn yêu cầu giao diện chậm đều bắt đầu bằng /tast
, cấu hình nginx sẽ như sau:
upstream webman {
server 127.0.0.1:8787;
keepalive 10240;
}
# Thêm một upstream 8686 mới
upstream task {
server 127.0.0.1:8686;
keepalive 10240;
}
server {
server_name webman.com;
listen 80;
access_log off;
root /path/webman/public;
# Các yêu cầu bắt đầu bằng /tast sẽ đi qua cổng 8686, vui lòng thay đổi /tast thành tiền tố thích hợp theo tình hình cụ thể
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;
}
# Các yêu cầu khác sẽ đi qua cổng 8787 ban đầu
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;
}
}
}
Như vậy, khi người dùng truy cập domain.com/tast/xxx
sẽ đi qua cổng 8686 riêng biệt để xử lý, không ảnh hưởng đến việc xử lý yêu cầu qua cổng 8787.