Avatar
1
Duy Linh Beginner
Duy Linh Beginner
Sync offline data với BE
  • E đang làm 1 app desktop sử dụng tauri. App của e cần lưu data offline để khi mất mạng thì app vẫn hoạt động bình thường và khi có mạng thì cần sync với data mới nhất của BE đồng thời gửi lên những dữ liệu offline đã tạo ở phía App desktop. Data offline e lưu ở indexDb (dexie.js)
  • Điều này em cần xử lí sync data trên 1 worker riêng và e tìm được đó là sử dụng web worker. Tuy nhiên e nên sử dụng design pattern nào, cũng như e nên sync data như nào để việc sync data dễ dàng và hợp lí nhất ạ.
  • Answer
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
The Best Answer
Để giải quyết vấn đề này em có thể sử dụng bridge design pattern với mã nguồn ví dụ như sau:
class DataRepository {
	
	async function getDataById(id) {
		const connect = await checkConnection();
		if (connect) {
		   return await serverRepository.getDataByIdFromServer(id);
		}
		return localRepository.getDataByIdFromCache(data);
	}

	async function saveData(data) {
		const connect = await checkConnection();
		if (connect) {
		   return await serverRepository.saveDataToServer(data);
		}
		return localRepository.saveDataToCache(data);
	}

	async function checkConnection() {
		// call ping API if difference code 200 return false
	}

	function syncDataToServer() {
		const dataList = getDataListFromCache(size);
		if (dataList.length) {
			const connect = await checkConnection();
			if (connect) {
				syncDataToServer(dataList);
			}
		}
	}
    

    startInterval(syncDataToServer, time);
}

Có một số điểm cần chú ý ở đây:

  1. Bởi vì client không phải là nơi phù hợp để lưu một số lượng lớn dữ liệu (ví dụ từ 2MB trở lên được coi là lớn) nên cần kiểm tra trạng thái của server để có thể lưu hoặc lấy ở server nếu có thể thay vì client.
  2. Cần phải có một API tên là ping để gọi kiểm tra tình trạng kết nối vì:
  • Giữa client và server không thể biết được tình trạng có kết nối hay không nên cần để gọi và kiểm tra, API này cũng đủ nhẹ nhàng để không quá mất thời gian ảnh hưởng đến hiệu năng.
  • Nếu sử dụng các API tính năng (khác ping) và sử dụng mã lỗi hoặc lỗi (ví dụ hàm failederror của fetch) để kiểm tra thì không hợp lý, vì các API thường có mã lỗi đa dạng (ví dụ 400, 500) và lỗi cũng đa dạng (ví không thể parse json) nên giả sử coi đó là không có kết nói có thể dẫn đến tình trạng lặp vô hạn kiểm tra hoặc connection sẽ luôn là false.
  1. Thời gian để kiểm tra việc có dữ liệu cần sync lên server (interval) đừng để quá ngắn, ví dụ tầm 15 giây trở lên là ổn, vì client cũng không phát sinh dữ liệu quá nhanh, gọi nhiều quá dẫn đến client tiêu thụ nhiều năng lượng không cần thiết.
  2. Em đang dùng js, nó có hỗ trợ sẵn bất đồng bộ và đơn rồi nên không cần lo đến vấn đề worker riêng. Tuy nhiên nếu là các ngôn ngữ như Java chẳng hạn, em cũng cần chú ý đến vấn đề đa luồng, cần thiết phải sử dụng các kỹ thuật đồng bộ, lock để tránh vấn đề dữ liệu không nhất quán.
  • 0
  • Reply