[ Giải pháp đồng bộ hóa cho năm 2021 ]
Tôi biết câu hỏi được hỏi là dành riêng cho MongoDB, nhưng vì đây là một chủ đề cũ nên tôi nghĩ người đọc có thể đang tìm kiếm các giải pháp khác cho các ứng dụng mới hoặc bản dựng lại. Tôi thực sự có thể khuyên bạn nên xem AceBase bởi vì nó thực hiện chính xác những gì bạn đang tìm kiếm hồi đó.
AceBase là cơ sở dữ liệu thời gian thực mã nguồn mở miễn phí cho phép dễ dàng lưu trữ và đồng bộ hóa giữa cơ sở dữ liệu trình duyệt và máy chủ. Nó sử dụng IndexedDB trong trình duyệt, bộ lưu trữ db / SQL Server / SQLite nhị phân của riêng nó trên máy chủ. Các chỉnh sửa ngoại tuyến được đồng bộ hóa khi kết nối lại và khách hàng được thông báo về các thay đổi cơ sở dữ liệu từ xa trong thời gian thực thông qua websocket (FAST!).
Trên hết, AceBase có một tính năng độc đáo được gọi là "proxy dữ liệu trực tiếp" cho phép bạn duy trì và đồng bộ hóa tất cả các thay đổi đối với các đối tượng trong bộ nhớ với cơ sở dữ liệu cục bộ và máy chủ cũng như các thay đổi từ xa để tự động cập nhật các đối tượng trong bộ nhớ của bạn . Điều này có nghĩa là bạn có thể quên hoàn toàn việc mã hóa cơ sở dữ liệu và viết mã như thể bạn chỉ sử dụng các đối tượng cục bộ. Bất kể bạn đang trực tuyến hay ngoại tuyến.
Ví dụ sau đây cho thấy cách tạo cơ sở dữ liệu IndexedDB cục bộ trong trình duyệt, cách kết nối với máy chủ cơ sở dữ liệu từ xa đồng bộ với cơ sở dữ liệu cục bộ và cách tạo proxy dữ liệu trực tiếp giúp loại bỏ thêm mã hóa cơ sở dữ liệu. AceBase cũng hỗ trợ xác thực và ủy quyền, nhưng tôi đã bỏ qua nó để đơn giản hóa.
const { AceBaseClient } = require('acebase-client');
const { AceBase } = require('acebase');
// Create local database with IndexedDB storage:
const cacheDb = AceBase.WithIndexedDB('mydb-local');
// Connect to server database, use local db for offline storage:
const db = new AceBaseClient({ dbname: 'mydb', host: 'db.myproject.com', port: 443, https: true, cache: { db: cacheDb } });
// Wait for remote database to be connected, or ready to use when offline:
db.ready(async () => {
// Create live data proxy for a chat:
const emptyChat = { title: 'New chat', messages: {} };
const proxy = await db.ref('chats/chatid1').proxy(emptyChat); // Use emptyChat if chat node doesn't exist
// Get object reference containing live data:
const chat = proxy.value;
// Update chat's properties to save to local database,
// sync to server AND all other clients monitoring this chat in realtime:
chat.title = `Changing the title`;
chat.messages.push({
from: 'ewout',
sent: new Date(),
text: `Sending a message that is stored in the database and synced automatically was never this easy!` +
`This message might have been sent while we were offline. Who knows!`
});
// To monitor and handle realtime changes to the chat:
chat.onChanged((val, prev, isRemoteChange, context) => {
if (val.title !== prev.title) {
alert(`Chat title changed to ${val.title} by ${isRemoteChange ? 'us' : 'someone else'}`);
}
});
});
Để biết thêm các ví dụ và tài liệu, hãy xem Công cụ cơ sở dữ liệu thời gian thực AceBase tại npmjs.com