Trạng thái hiện tại: chế độ một máy vẫn dùng SQLite. Đã có adapter PostgreSQL, phiên/thông báo giữa các app, đồng bộ workspace theo tài khoản và kho file có bản sao, cùng bộ cấu hình ba máy. Xem hướng dẫn cụm và các giới hạn hiện tại. Chưa triển khai trên máy thật hoặc đo tải triệu người dùng. Các bước mở rộng dưới đây là thiết kế đích.
Một mã nguồn, nhiều máy phục vụ
Web · Desktop · Android · iOS
Cloudflare · HTTPS · giới hạn lưu lượng · cân bằng tải
API máy A
Cùng bản phát hành
API máy B
Cùng bản phát hành
PostgreSQL
Nguồn dữ liệu chính + replica
Pub/sub & hàng đợi
Sự kiện, tác vụ nền, realtime
Kho object riêng
File mã hóa + URL có hạn
Giai đoạn đầu: hai máy chạy ứng dụng dùng chung một cơ sở dữ liệu chính được quản lý. Một giao dịch được ghi vào nguồn dữ liệu chính rồi chuyển sự kiện cho máy đang giữ kết nối của người nhận. Không đồng bộ bằng cách chép file SQLite khi hai nơi đang ghi. Adapter và lớp thông báo dùng PostgreSQL đã có; vẫn cần nghiệm thu cụm database dự phòng, mạng riêng, fencing, outbox trong cùng giao dịch và chuyển adapter sang async khi tăng tải.
Đồng bộ giữa hai địa điểm
Ưu tiên một chủ ghi theo nhóm và cơ chế replica/failover được quản lý. Nếu cần ghi độc lập khi mất mạng giữa hai nơi, phải thiết kế nhật ký sự kiện và xử lý xung đột; đây là một giai đoạn riêng, không thể đạt được chỉ bằng sao chép mã nguồn. Tài chính, phân quyền, trạng thái khóa và tài khoản cần giao dịch có thứ tự và tính nhất quán; không dùng thời gian đồng hồ của máy người dùng để tự chọn bản thắng.
| Loại dữ liệu | Hợp đồng đồng bộ cần xây |
|---|
| Tin nhắn | ID thao tác từ client, unique theo người gửi, xác nhận sau khi lưu bền, cursor riêng theo hội thoại; hàng đợi outbox cùng giao dịch, phát lại an toàn khi consumer nhận lặp. |
| Công việc / checklist | ID ổn định, phiên bản revision và lịch sử thay đổi; từ chối ghi đè bản mới, trả dữ liệu cần hòa giải; tombstone cho xóa, đồng bộ phần thay đổi theo cursor. |
| Tài chính / phân quyền | Kiểm quyền trên máy chủ cho từng yêu cầu, giao dịch nguyên tử, audit, không gửi trường tài chính cho người thiếu quyền. |
| File | Upload trực tiếp qua URL ký có hạn, giới hạn dung lượng, checksum và quét theo chính sách; chia sẻ E2EE/P2P chỉ sau khi thiết kế khóa và đường chuyển tiếp dự phòng. |
| Phiên / khóa tài khoản | Kho phiên dùng chung và sự kiện thu hồi tới mọi node; rate limit phân tán. Mỗi node kiểm trạng thái tài khoản trước thao tác nhạy cảm. |
Cập nhật cùng phiên bản ở mọi máy
- CI chạy kiểm thử, tạo một image bất biến, gắn số phiên bản/digest và ký bản phát hành.
- Kho triển khai cho hai địa điểm kéo đúng digest đã được phê duyệt; dữ liệu và cấu hình bí mật nằm ngoài image.
- Migration cơ sở dữ liệu dùng kiểu mở rộng trước, thu gọn sau; phiên bản ứng dụng cũ và mới phải cùng hoạt động trong lúc cập nhật.
- Rolling update từng node sau health check, theo dõi lỗi và tự dừng/quay lui image nếu vượt ngưỡng. Không tự tải và chạy mã tùy ý từ một máy PaanChat khác.
- Kiểm thử phục hồi backup riêng: quay lui mã nguồn không tự quay lui thay đổi dữ liệu.
Các giai đoạn cần triển khai
- Hoàn thiện nền dữ liệu: task API, quyền phía máy chủ, phiên bản đồng bộ, repository PostgreSQL, migration có số phiên bản.
- Hai máy chủ: realtime pub/sub, outbox, worker, object storage, session/rate limit dùng chung, theo dõi request ID và health/readiness.
- Đo tải: xác định người dùng đồng thời, kết nối realtime, tin nhắn/giây, kích thước file, P95 độ trễ và tỷ lệ lỗi. Một triệu tài khoản không đồng nghĩa một triệu kết nối đồng thời.
- Mở rộng theo số đo: phân vùng theo tổ chức/nhóm, index và cursor, cache có phạm vi quyền, quota và backpressure, replica đọc khi phù hợp.
- Hai địa điểm & cập nhật tự động: kiểm thử failover/mất mạng, chọn RPO/RTO và cơ chế triển khai cùng image, diễn tập khôi phục trước khi dùng dữ liệu thật.
Cloudflare và bảo mật nội dung
Cache tài nguyên tĩnh theo phiên bản; bypass cache API có phiên, avatar riêng, cấu hình quản trị và dữ liệu người dùng. Giữ Cache-Control: no-store cho JSON và dữ liệu nhạy cảm, kiểm tra Cache Rules không ghi đè chính sách này. HTTPS/CDN không thay thế mã hóa đầu cuối. Khi triển khai E2EE, máy chủ không đọc được chat để lọc từ; cần thiết kế kiểm tra phía thiết bị hoặc báo cáo tự nguyện có giới hạn.
Tài liệu chính thức: PostgreSQL: replication và nhất quán, Cloudflare: chính sách cache, Docker: rolling update.