Giới thiệu
Trong bài viết này, chúng ta sẽ tìm hiểu về shutdownManager.ts trong mã nguồn mcp-mermaid. Đây là một phần quan trọng trong việc quản lý tắt hệ thống, giúp thực hiện các thao tác dọn dẹp và tắt hệ thống một cách nhẹ nhàng và hiệu quả. Chúng ta sẽ khám phá các chức năng của nó, cách thức hoạt động và những ví dụ thực tế từ mã nguồn.
Mục lục
- shutdownManager.ts là gì?
- Các chức năng được định nghĩa trong ShutdownManager
- Thực tiễn tốt nhất
- Cạm bẫy thường gặp
- Mẹo hiệu suất
- Khắc phục sự cố
- Kết luận
shutdownManager.ts là gì?
shutdownManager.ts là một module quản lý tắt hệ thống tập trung, chịu trách nhiệm cho việc thực hiện dọn dẹp và tắt hệ thống một cách trơn tru. Như mô tả trong mã nguồn:
typescript
/**
* Quản lý tắt tập trung cho việc dọn dẹp và tắt hệ thống một cách nhẹ nhàng
*/
Module này sẽ giúp đảm bảo rằng tất cả các tài nguyên và kết nối được giải phóng trước khi ứng dụng tắt, tránh tình trạng dữ liệu bị mất hoặc tài nguyên không được giải phóng đúng cách.
Các chức năng được định nghĩa trong ShutdownManager
registerCleanup
typescript
export class ShutdownManager {
private cleanupHandlers: Array<() => void | Promise<void>> = [];
private isShuttingDown = false;
/**
* Đăng ký một handler dọn dẹp
*/
registerCleanup(handler: () => void | Promise<void>): void {
this.cleanupHandlers.push(handler);
}
}
Phương thức registerCleanup cho phép chúng ta thêm các hàm dọn dẹp vào danh sách. Khi hệ thống cần tắt, tất cả các hàm này sẽ được gọi để thực hiện các tác vụ dọn dẹp cần thiết.
cleanup
typescript
async cleanup(): Promise<void> {
if (this.isShuttingDown) {
Logger.warn("Đang trong quá trình tắt, buộc thoát...");
process.exit(1);
}
this.isShuttingDown = true;
Logger.info("🔄 Đang tắt hệ thống một cách nhẹ nhàng...");
// Thực hiện tất cả các handler dọn dẹp với timeout
const cleanupPromises = this.cleanupHandlers.map(async (handler) => {
try {
await Promise.race([
handler(),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("Thời gian dọn dẹp hết hạn")), 3000),
),
]);
} catch (error) {
Logger.error("Lỗi trong quá trình dọn dẹp", error);
}
});
await Promise.all(cleanupPromises);
Logger.success("Dọn dẹp hoàn tất");
process.exit(0);
}
Hàm cleanup sẽ được gọi khi có tín hiệu tắt hệ thống. Nó kiểm tra xem quá trình tắt đã bắt đầu chưa và thực hiện tất cả các hàm dọn dẹp đã được đăng ký.
setupSignalHandlers
typescript
/**
* Thiết lập các handler tín hiệu cho việc tắt nhẹ nhàng
*/
setupSignalHandlers(): void {
// Xóa tất cả listener hiện có để tránh trùng lặp
process.removeAllListeners("SIGINT");
process.removeAllListeners("SIGTERM");
process.once("SIGINT", this.cleanup.bind(this));
process.once("SIGTERM", this.cleanup.bind(this));
}
Hàm setupSignalHandlers thiết lập các listener cho tín hiệu SIGINT và SIGTERM, thường được sử dụng để yêu cầu tắt hệ thống. Khi các tín hiệu này được nhận, hàm cleanup sẽ được gọi để thực hiện các tác vụ dọn dẹp.
Thực tiễn tốt nhất
- Đăng ký tất cả các handler dọn dẹp cần thiết: Đảm bảo rằng mọi tài nguyên như kết nối cơ sở dữ liệu, file mở, hoặc các dịch vụ bên ngoài đều có handler dọn dẹp riêng.
- Kiểm tra lỗi trong handler: Sử dụng
try-catchđể xử lý các lỗi có thể xảy ra trong quá trình dọn dẹp để đảm bảo rằng ứng dụng không bị crash trong quá trình tắt. - Thiết lập timeout hợp lý: Chọn một khoảng thời gian timeout hợp lý cho các tác vụ dọn dẹp để tránh tình trạng treo hệ thống.
Cạm bẫy thường gặp
- Bỏ sót handler dọn dẹp: Nhiều nhà phát triển quên đăng ký các hàm dọn dẹp, dẫn đến việc không giải phóng tài nguyên.
- Lỗi trong hàm dọn dẹp: Nếu không xử lý lỗi trong các hàm dọn dẹp, ứng dụng có thể gặp sự cố trong quá trình tắt.
Mẹo hiệu suất
- Tối ưu hóa các hàm dọn dẹp: Đảm bảo rằng các tác vụ trong hàm dọn dẹp được tối ưu hóa để giảm thiểu thời gian tắt hệ thống.
- Sử dụng Promise.race: Sử dụng
Promise.raceđể giới hạn thời gian cho các tác vụ dọn dẹp, tránh tình trạng treo lâu.
Khắc phục sự cố
- Kiểm tra ghi log: Theo dõi các ghi log để xác định xem có lỗi nào xảy ra trong quá trình tắt hay không.
- Kiểm tra các tín hiệu: Đảm bảo rằng các tín hiệu
SIGINTvàSIGTERMđược thiết lập đúng cách và không bị xóa trước khi tắt hệ thống.
Kết luận
shutdownManager.ts là một phần quan trọng trong việc quản lý tắt hệ thống trong mã nguồn mcp-mermaid. Việc hiểu rõ cách hoạt động của nó sẽ giúp các nhà phát triển đảm bảo rằng ứng dụng của họ tắt một cách an toàn và hiệu quả. Nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm thông tin, hãy liên hệ với tôi qua email: ramu.narasinga@gmail.com. Hãy tham gia cộng đồng mã nguồn mở và học hỏi từ những thách thức thực tế!