Tài liệu này được dịch bởi AI. Đối với bất kỳ thông tin không chính xác nào, vui lòng tham khảo phiên bản tiếng Anh
Trong môi trường đơn nút, các plugin thường có thể đáp ứng yêu cầu thông qua trạng thái, sự kiện hoặc tác vụ trong tiến trình. Tuy nhiên, trong chế độ cụm, cùng một plugin có thể chạy đồng thời trên nhiều phiên bản, đối mặt với các vấn đề điển hình sau:
NocoBase core đã tích hợp sẵn nhiều giao diện middleware ở tầng ứng dụng, giúp các plugin tái sử dụng các khả năng thống nhất trong môi trường cụm. Dưới đây, chúng ta sẽ tìm hiểu cách sử dụng và các phương pháp hay nhất cho bộ nhớ đệm (cache), tin nhắn đồng bộ, hàng đợi tin nhắn và khóa phân tán, cùng với các tham chiếu mã nguồn.
Đối với dữ liệu cần lưu trữ trong bộ nhớ, bạn nên sử dụng thành phần bộ nhớ đệm tích hợp sẵn của hệ thống để quản lý.
app.cache.Cache cung cấp các thao tác cơ bản như set/get/del/reset, đồng thời hỗ trợ wrap và wrapWithCondition để đóng gói logic bộ nhớ đệm, cũng như các phương thức hàng loạt như mset/mget/mdel.ttl hợp lý để tránh mất bộ nhớ đệm khi phiên bản khởi động lại.Ví dụ: Khởi tạo và sử dụng bộ nhớ đệm trong plugin-auth
Nếu trạng thái trong bộ nhớ không thể được quản lý bằng bộ nhớ đệm phân tán (ví dụ: không thể tuần tự hóa), thì khi trạng thái thay đổi do hành động của người dùng, cần thông báo sự thay đổi đó đến các phiên bản khác thông qua tín hiệu đồng bộ để duy trì tính nhất quán của trạng thái.
sendSyncMessage, bên trong gọi app.syncMessageManager.publish và tự động thêm tiền tố cấp ứng dụng vào kênh để tránh xung đột kênh.publish có thể chỉ định transaction, tin nhắn sẽ được gửi sau khi giao dịch cơ sở dữ liệu được cam kết, đảm bảo đồng bộ hóa trạng thái và tin nhắn.handleSyncMessage, có thể đăng ký trong giai đoạn beforeLoad, rất phù hợp cho các kịch bản như thay đổi cấu hình, đồng bộ hóa Schema.Ví dụ: plugin-data-source-main sử dụng tin nhắn đồng bộ để duy trì tính nhất quán của schema trên nhiều nút
Phát sóng tin nhắn là thành phần cơ bản của tín hiệu đồng bộ và cũng hỗ trợ sử dụng trực tiếp. Khi cần phát sóng tin nhắn giữa các phiên bản, bạn có thể thực hiện thông qua thành phần này.
app.pubSubManager.subscribe(channel, handler, { debounce }) có thể được sử dụng để đăng ký kênh giữa các phiên bản; tùy chọn debounce dùng để khử nhiễu, tránh các cuộc gọi lại thường xuyên do phát sóng lặp lại.publish hỗ trợ skipSelf (mặc định là true) và onlySelf, dùng để kiểm soát xem tin nhắn có được gửi lại cho phiên bản hiện tại hay không.Ví dụ: plugin-async-task-manager sử dụng PubSub để phát sóng sự kiện hủy tác vụ
Hàng đợi tin nhắn được sử dụng để lập lịch các tác vụ bất đồng bộ, phù hợp để xử lý các thao tác tốn nhiều thời gian hoặc có thể thử lại.
app.eventQueue.subscribe(channel, { idle, process, concurrency }). process trả về một Promise, và bạn có thể sử dụng AbortSignal.timeout để kiểm soát thời gian chờ.publish tự động thêm tiền tố tên ứng dụng và hỗ trợ các tùy chọn như timeout, maxRetries. Mặc định nó sử dụng bộ điều hợp hàng đợi trong bộ nhớ, nhưng có thể chuyển sang các bộ điều hợp mở rộng như RabbitMQ khi cần.Ví dụ: plugin-async-task-manager sử dụng EventQueue để lập lịch tác vụ
Khi cần tránh các thao tác tranh chấp, bạn có thể sử dụng khóa phân tán để tuần tự hóa việc truy cập tài nguyên.
local dựa trên tiến trình, có thể đăng ký các triển khai phân tán như Redis; kiểm soát đồng thời thông qua app.lockManager.runExclusive(key, fn, ttl) hoặc acquire/tryAcquire.ttl được sử dụng để giải phóng khóa dự phòng, ngăn khóa bị giữ vĩnh viễn trong các trường hợp ngoại lệ.Ví dụ: plugin-data-source-main sử dụng khóa phân tán để bảo vệ quy trình xóa trường
app.cache, app.syncMessageManager, v.v., để tránh triển khai lại logic giao tiếp giữa các nút trong plugin.transaction.afterCommit (syncMessageManager.publish đã tích hợp sẵn) để đảm bảo tính nhất quán của dữ liệu và tin nhắn.timeout, maxRetries, debounce hợp lý để ngăn chặn các đợt tăng đột biến lưu lượng truy cập mới trong các tình huống ngoại lệ.Với các khả năng trên, các plugin có thể an toàn chia sẻ trạng thái, đồng bộ hóa cấu hình và lập lịch tác vụ giữa các phiên bản khác nhau, đáp ứng các yêu cầu về tính ổn định và nhất quán trong các kịch bản triển khai cụm.