Nguyên lý khởi động lại mượt mà
Khởi động lại mượt mà là gì?
Khởi động lại mượt mà khác với khởi động lại thông thường, khởi động lại mượt mà có thể thực hiện khởi động lại dịch vụ (thường chỉ áp dụng cho các dịch vụ kết nối ngắn) mà không ảnh hưởng đến người dùng, để tải lại chương trình PHP, hoàn thành việc cập nhật mã nguồn cho doanh nghiệp.
Khởi động lại mượt mà thường được áp dụng trong quá trình cập nhật doanh nghiệp hoặc phát hành phiên bản, có thể tránh ảnh hưởng tạm thời đến dịch vụ không khả dụng do việc phát hành mã nguồn gây ra.
Chú ý
Hệ thống Windows không hỗ trợ reload.Chú ý
Đối với các dịch vụ kết nối dài (chẳng hạn như websocket), khi tiến trình khởi động lại mượt mà, kết nối sẽ bị ngắt. Giải pháp là sử dụng kiến trúc tương tự như gatewayWorker, một nhóm tiến trình chuyên duy trì kết nối, và đặt thuộc tính reloadable của nhóm tiến trình này thành false. Logic doanh nghiệp khởi động một nhóm tiến trình worker khác để xử lý, gateway và các tiến trình worker gọi nhau thông qua giao thức tcp. Khi doanh nghiệp cần thay đổi, chỉ cần khởi động lại các tiến trình worker.
Giới hạn
Chú ý: chỉ những tệp được tải trong callback on{...} mới tự động cập nhật sau khi khởi động lại mượt mà, các tệp được tải trực tiếp trong script khởi động hoặc mã viết cứng sẽ không tự động cập nhật khi chạy reload.
Đoạn mã sau sẽ không tự động cập nhật sau khi reload
$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
$connection->send('hi'); // Mã viết cứng không hỗ trợ hot update
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // Tệp được tải trực tiếp trong script khởi động không hỗ trợ hot update
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // Giả sử trong lớp MessageHandler có một phương thức onMessage
Đoạn mã sau sẽ tự động cập nhật sau khi reload
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart là callback được kích hoạt sau khi tiến trình khởi động
require_once __DIR__ . '/your/path/MessageHandler.php'; // Tệp được tải sau khi tiến trình khởi động hỗ trợ hot update
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage'];
};
Sau khi thay đổi MessageHandler.php thực hiện php start.php reload, MessageHandler.php sẽ được tải lại vào bộ nhớ để cập nhật logic doanh nghiệp.
Ghi chú
Đoạn mã trên chỉ để thuận tiện minh họa, sử dụng câu lệnhrequire_once, nếu dự án của bạn hỗ trợ tự động tải psr4, thì không cần gọi câu lệnhrequire_once.
Nguyên lý khởi động lại mượt mà
Workerman được chia thành tiến trình chính và tiến trình con, tiến trình chính chịu trách nhiệm giám sát tiến trình con, tiến trình con chịu trách nhiệm nhận kết nối từ máy khách và dữ liệu yêu cầu gửi lên, thực hiện xử lý tương ứng và trả dữ liệu lại cho máy khách. Khi mã nguồn doanh nghiệp được cập nhật, thực chất chúng ta chỉ cần cập nhật tiến trình con, thì có thể đạt được mục đích cập nhật mã nguồn.
Khi tiến trình chính của Workerman nhận được tín hiệu khởi động lại mượt mà, tiến trình chính sẽ gửi tín hiệu thoát an toàn đến một trong các tiến trình con (cho phép tiến trình tương ứng hoàn tất yêu cầu hiện tại trước khi thoát), khi tiến trình này thoát, tiến trình chính sẽ tạo ra một tiến trình con mới (tiến trình con này đã tải mã PHP mới), sau đó tiến trình chính lại gửi lệnh dừng đến một tiến trình cũ khác, thế là từng tiến trình một được khởi động lại, cho đến khi tất cả các tiến trình cũ được thay thế hoàn toàn.
Chúng ta thấy rằng khởi động lại mượt mà thực ra là cho phép từng tiến trình cũ thoát ra và sau đó tạo ra các tiến trình mới. Để không ảnh hưởng đến người dùng trong quá trình khởi động lại mượt mà, điều này yêu cầu trong tiến trình không lưu giữ thông tin trạng thái liên quan đến người dùng, tức là các tiến trình doanh nghiệp tốt nhất nên không có trạng thái, nhằm tránh mất thông tin do tiến trình thoát.