Z-CMS load plugin mà không restart server như thế nào
Lifecycle-oriented approach cho zero-downtime plugin activation và update
Vì sao plugin management dựa trên restart không thể scale
Restart server sau mỗi lần cài plugin có thể chấp nhận với website cá nhân, nhưng gây gián đoạn khi CMS phục vụ nhiều tenant, active session, background job và real-time connection. Z-CMS xem plugin như một managed runtime có thể install, activate, drain, replace và remove độc lập.
Dynamic import chỉ là bước đầu
Dynamic import có thể load code nhưng không cung cấp safe unloading. Module cache vẫn tồn tại, event listener cũ có thể còn hoạt động, cron job có thể tiếp tục chạy và database connection có thể leak. Vì vậy hot plugin management là bài toán lifecycle, không phải một mẹo module loading.
Plugin lifecycle
Lifecycle cơ bản gồm Downloaded → Verified → Installed → Initialized → Activated → Running → Deactivated → Uninstalled.
Update bổ sung chuỗi bước: download version mới, verify signature, validate compatibility, check migration, start runtime mới, run health check, switch active version và cuối cùng drain runtime cũ.
Downloaded → Verified → Installed → Initialized
→ Activated → Running → Deactivated → UninstalledManifest-driven initialization
Manifest cho Core biết entry point, CMS version được hỗ trợ, permission cần thiết, hook phải register và migration liên quan. Runtime chỉ được nhận production event sau khi activation và health check thành công.
Hook registry thay vì hard-coded call
Core service dispatch event vào registry. Registry resolve active plugin và route execution đến isolate đúng. Khi disable plugin, registration bị remove ngay lập tức mà không restart application.
Current Runtime A (Active)
New Runtime B (Starting)
↓
Load → Activate → Health Check
↓
Registry Switch A → B
↓
Runtime A DrainingManaged resource và deactivation
Plugin có thể tạo listener, schedule, subscription và temporary resource. SDK route các registration qua managed API để Z-CMS biết resource nào thuộc plugin nào và tự cleanup khi deactivate.
Một deactivate method tốt vẫn được khuyến khích, nhưng Core cleanup không phụ thuộc hoàn toàn vào kỷ luật của plugin developer.
Blue-green plugin update
Version mới được start song song với version hiện tại. Nó phải load, activate và vượt smoke test trước khi registry pointer thay đổi. Nếu health check fail, version cũ tiếp tục active.
Draining active execution
Runtime cũ dừng nhận execution mới nhưng tiếp tục xử lý công việc đang chạy. Active execution counter và maximum drain timeout giúp tránh ngắt request không cần thiết.
Migration, rollback và versioned storage
Plugin update có thể kèm data migration. Z-CMS ghi migration ID, tạo recovery point, chạy compatibility check và start runtime mới trước khi commit switch. Migration có thể đảo ngược sẽ được rollback tự động nếu activation fail.
Giữ các verified bundle trước đó cho phép rollback nhanh và điều tra incident có thể tái hiện.
Circuit breaker và development mode
Plugin lỗi lặp lại có thể chuyển từ Active sang Degraded rồi Suspended. Trong development, file watcher rebuild bundle, tạo isolate mới, run activation và swap runtime, tạo trải nghiệm hot reload mà không restart toàn backend.
Kết luận
Load plugin không restart server đòi hỏi lifecycle hoàn chỉnh: validation, runtime creation, registry switching, managed cleanup, draining, migration handling, rollback và health monitoring. Z-CMS coi mỗi plugin version là một runtime unit có thể thay thế để CMS vẫn available khi ecosystem liên tục phát triển.
Key takeaways
- Security boundary phải được enforce trong Core, không dựa vào thiện chí của plugin.
- Lifecycle, permission, tenant context và observability là các phần của cùng một platform contract.
- Developer experience tốt chỉ bền vững khi runtime và supply chain được thiết kế an toàn từ đầu.
GitHub: https://github.com/zscontributor/z-cms
Website: https://z-cms.org