لماذا أولاً عن بعد؟
يحتاج مستخدمو الهواتف إلى تطبيق يعمل في كل مكان — تحت الأرض، في المناطق الريفية، على الطائرات. يضمن التصميم الأولي عن بعد أن تتحول التطبيقات بشكل لطيف عندما يفقد الاتصال.
مكونات التصميم
1. قاعدة البيانات المحلية
نستخدم Realm لقاعدة البيانات المحلية بسبب دعمها للبحث التفاعلي والتحليل للنزاعات.
const realm = await Realm.open({ schema: [TaskSchema, UserSchema] });
// الكتابة المحلية — فوري، لا يتطلب شبكة
realm.write(() => {
realm.create("Task", { id: uuid(), title: "Task جديد", synced: false });
});
// القراءة المحلية — فوري، لا يوجد ظهور حالة تحميل
const tasks = realm.objects("Task").filtered("synced == false");2. محرك التزامن
محرك التزامن في الخلفية يقوم بتزويد التغييرات المحلية بالخادم وتزويدها بالتغييرات البعيدة عندما يعود الاتصال.
class SyncEngine {
async syncPendingChanges() {
const pending = await this.localDb.getUnsynced();
for (const item of pending) {
try {
await this.api.push(item);
await this.localDb.markSynced(item.id);
} catch (error) {
this.queueForRetry(item);
}
}
}
}3. حل النزاعات
| استراتيجية | إذا ما تستخدم |
|---|---|
| آخر كتابة يفوز | البيانات البسيطة، الخطر المنخفض للنزاعات |
| التوحيد | التغييرات المتنافسة في حقول مختلفة |
| الحل اليدوي | البيانات المهمة، النزاعات التي تتطلب تفاصيل الأعمال |
اختبار سلوك التزامن عن بعد
- اختبار وضع الطائرة على أجهزة حقيقية
- تثبيت سرعة الشبكة
- اختبار سيناريوهات نزاعات التزامن
- تأكيد صحة البيانات بعد التزامن