ฉันทำงานกับวิธีการซิงค์ข้อมูลหลักที่จัดเก็บในแอปพลิเคชัน iPhone ระหว่างอุปกรณ์หลายชนิดเช่น iPad หรือ Mac เฟรมเวิร์กการซิงค์มีไม่มาก (ถ้ามี) สำหรับใช้กับ Core Data บน iOS อย่างไรก็ตามฉันได้คิดถึงแนวคิดต่อไปนี้:
- ทำการเปลี่ยนแปลงกับที่เก็บข้อมูลหลักโลคัลและการเปลี่ยนแปลงถูกบันทึก (a) หากอุปกรณ์ออนไลน์นั้นจะพยายามส่งเซ็ตการแก้ไขไปยังเซิร์ฟเวอร์รวมถึง ID อุปกรณ์ของอุปกรณ์ที่ส่งเซ็ตการแก้ไขนั้น (b) หากเซ็ตการแก้ไขไม่ถึงเซิร์ฟเวอร์หรือหากอุปกรณ์ไม่ได้ออนไลน์แอพจะเพิ่มการเปลี่ยนแปลงที่กำหนดไว้ในคิวเพื่อส่งเมื่อมันมาออนไลน์
- เซิร์ฟเวอร์ซึ่งนั่งอยู่ในคลาวด์ผสานการเปลี่ยนแปลงเฉพาะที่ได้รับกับฐานข้อมูลหลัก
- หลังจากชุดการเปลี่ยนแปลง (หรือชุดของคิวการเปลี่ยนแปลง) ถูกผสานบนเซิร์ฟเวอร์คลาวด์เซิร์ฟเวอร์จะผลักดันชุดการเปลี่ยนแปลงเหล่านั้นทั้งหมดไปยังอุปกรณ์อื่นที่ลงทะเบียนกับเซิร์ฟเวอร์โดยใช้ระบบการสำรวจบางประเภท (ฉันคิดว่าจะใช้บริการ Push ของ Apple แต่เห็นได้ชัดว่าตามความคิดเห็นนี้ไม่ใช่ระบบที่ใช้การได้)
มีอะไรแฟนซีที่ฉันต้องคิดเกี่ยวกับ? ผมมองที่กรอบ REST เช่นObjectiveResource , แกนทรัพยากรและRestfulCoreData แน่นอนว่าทั้งหมดนี้ทำงานร่วมกับ Ruby on Rails ซึ่งฉันไม่ได้ผูกติดอยู่ แต่เป็นจุดเริ่มต้น ข้อกำหนดหลักที่ฉันมีสำหรับวิธีแก้ไขปัญหาของฉันคือ:
- ควรทำการเปลี่ยนแปลงใด ๆ ในพื้นหลังโดยไม่หยุดเธรดหลักชั่วคราว
- ควรใช้แบนด์วิดท์ให้น้อยที่สุด
ฉันคิดถึงความท้าทายหลายประการ:
- ตรวจสอบให้แน่ใจว่า ID วัตถุสำหรับที่เก็บข้อมูลที่แตกต่างกันในอุปกรณ์ต่าง ๆ นั้นเชื่อมต่อกับเซิร์ฟเวอร์ กล่าวคือฉันจะมีตาราง ID วัตถุและรหัสอุปกรณ์ซึ่งเชื่อมโยงผ่านการอ้างอิงถึงวัตถุที่เก็บไว้ในฐานข้อมูล ฉันจะมีบันทึก (DatabaseId [ไม่ซ้ำกับตารางนี้], ObjectId [ไม่ซ้ำกับรายการในฐานข้อมูลทั้งหมด], Datafield1, Datafield2), ฟิลด์ ObjectId จะอ้างอิงตารางอื่น, AllObjects: (ObjectId, DeviceId, DeviceObjectId) จากนั้นเมื่ออุปกรณ์ผลักชุดการเปลี่ยนแปลงอุปกรณ์จะส่งรหัสอุปกรณ์และ objectId จากวัตถุข้อมูลหลักในที่เก็บข้อมูลภายในเครื่อง จากนั้นคลาวด์เซิร์ฟเวอร์ของฉันจะตรวจสอบกับ objectId และรหัสอุปกรณ์ในตาราง AllObjects และค้นหาระเบียนที่จะเปลี่ยนแปลงในตารางเริ่มต้น
- การเปลี่ยนแปลงทั้งหมดควรประทับเวลาเพื่อให้สามารถผสานได้
- อุปกรณ์จะต้องสำรวจเซิร์ฟเวอร์โดยไม่ต้องใช้แบตเตอรี่มากเกินไป
- อุปกรณ์ในท้องถิ่นจะต้องอัปเดตทุกอย่างที่อยู่ในหน่วยความจำหาก / เมื่อได้รับการเปลี่ยนแปลงจากเซิร์ฟเวอร์
มีอะไรอีกที่ฉันหายไปที่นี่ กรอบการทำงานแบบไหนที่ฉันควรจะมองให้เป็นไปได้?