ทรัพยากรอยู่ที่ไหนและอะไร
REST เป็นข้อมูลเกี่ยวกับการจัดการทรัพยากรในลักษณะไร้รัฐและสามารถค้นพบได้ ไม่จำเป็นต้องดำเนินการผ่าน HTTP และไม่จำเป็นต้องพึ่งพา JSON หรือ XML แม้ว่าจะแนะนำเป็นอย่างยิ่งว่ารูปแบบข้อมูลไฮเปอร์มีเดียใช้ (ดูหลักการHATEOAS ) เนื่องจากลิงค์และรหัสเป็นที่ต้องการ
ดังนั้นคำถามจะกลายเป็น: เราคิดอย่างไรเกี่ยวกับการซิงโครไนซ์ในแง่ของทรัพยากร?
การซิงค์แบบสองทิศทางคืออะไร **
การทำข้อมูลให้ตรงกันแบบสองทิศทางเป็นกระบวนการของการอัปเดตทรัพยากรที่มีอยู่บนกราฟของโหนดดังนั้นในตอนท้ายของกระบวนการโหนดทั้งหมดได้อัปเดตทรัพยากรของพวกเขาตามกฎที่ควบคุมทรัพยากรเหล่านั้น โดยทั่วไปสิ่งนี้เป็นที่เข้าใจกันว่าโหนดทั้งหมดจะมีทรัพยากรรุ่นล่าสุดตามที่ปรากฏในกราฟ ในกรณีที่ง่ายที่สุดกราฟประกอบด้วยสองโหนด: โลคัลและรีโมต ท้องถิ่นเริ่มการซิงค์
ดังนั้นทรัพยากรหลักที่ต้องแก้ไขคือบันทึกธุรกรรมดังนั้นกระบวนการซิงค์อาจมีลักษณะเช่นนี้สำหรับคอลเลกชัน "items" ภายใต้ HTTP:
ขั้นตอนที่ 1 - ท้องถิ่นดึงบันทึกการทำธุรกรรม
ท้องถิ่น: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
ระยะไกล: 200 OKพร้อมเนื้อหาที่มีบันทึกธุรกรรมที่มีฟิลด์คล้ายกับนี้
itemId
- UUID เพื่อระบุคีย์หลักที่แชร์
updatedAt
- การประทับเวลาเพื่อให้จุดประสานเมื่อข้อมูลได้รับการปรับปรุงล่าสุด (สมมติว่าไม่จำเป็นต้องมีประวัติการแก้ไข)
fingerprint
- แฮช SHA1 ของเนื้อหาของข้อมูลเพื่อการเปรียบเทียบอย่างรวดเร็วหากupdateAt
ไม่กี่วินาที
itemURI
- URI แบบเต็มของรายการเพื่ออนุญาตให้เรียกใช้ได้ในภายหลัง
ขั้นตอนที่ 2 - ท้องถิ่นเปรียบเทียบบันทึกธุรกรรมระยะไกลกับของตัวเอง
นี่เป็นแอปพลิเคชันของกฎทางธุรกิจของวิธีการซิงค์ โดยทั่วไปแล้วitemId
จะระบุทรัพยากรในท้องถิ่นแล้วเปรียบเทียบลายนิ้วมือ หากมีความแตกต่างแล้วเปรียบเทียบการupdatedAt
ทำ หากสิ่งเหล่านี้ใกล้เกินไปที่จะเรียกการตัดสินใจจะต้องทำการดึงตามโหนดอื่น (อาจจะสำคัญกว่า) หรือกดไปที่โหนดอื่น (โหนดนี้สำคัญกว่า) หากทรัพยากรระยะไกลไม่ได้อยู่ภายในเครื่องจะมีการส่งรายการพุช (ซึ่งมีข้อมูลจริงสำหรับการแทรก / อัพเดท) ทรัพยากรท้องถิ่นใด ๆ ที่ไม่ปรากฏในบันทึกธุรกรรมระยะไกลจะถือว่าไม่มีการเปลี่ยนแปลง
itemURI
ขอดึงที่ทำกับโหนดระยะไกลเพื่อให้ข้อมูลที่มีอยู่ในท้องถิ่นโดยใช้ พวกเขาจะไม่นำไปใช้ในท้องถิ่นจนกระทั่งในภายหลัง
ขั้นตอนที่ 3 - ผลักดันบันทึกการทำธุรกรรมการซิงค์ท้องถิ่นไปยังระยะไกล
Local: PUT /remotehost/items/transactions
กับเนื้อหาที่มีบันทึกธุรกรรมการซิงค์ในเครื่อง
รีโมตโหนดอาจประมวลผลแบบซิงโครนัสนี้ (ถ้ามันเล็กและเร็ว) หรือแบบอะซิงโครนัส (คิดว่า202 ยอมรับ ) หากมีโอกาสที่จะเกิดโอเวอร์เฮดจำนวนมาก สมมติว่าการดำเนินการแบบซิงโครนัสแล้วผลลัพธ์จะเป็น200 ตกลงหรือ409 ความขัดแย้งขึ้นอยู่กับความสำเร็จหรือความล้มเหลว ในกรณีของความขัดแย้ง 409ดังนั้นกระบวนการจะต้องเริ่มต้นอีกครั้งเนื่องจากมีความล้มเหลวในการล็อคในแง่ดีที่โหนดระยะไกล (มีคนเปลี่ยนข้อมูลในระหว่างการซิงค์) การอัปเดตระยะไกลจะดำเนินการภายใต้ธุรกรรมแอปพลิเคชันของตนเอง
ขั้นตอนที่ 4 - อัปเดตภายในเครื่อง
ข้อมูลที่ดึงในขั้นตอนที่ 2 จะถูกนำไปใช้ภายในเครื่องภายใต้ธุรกรรมแอปพลิเคชัน
ในขณะที่ข้างต้นไม่สมบูรณ์ (มีหลายสถานการณ์ที่ท้องถิ่นและระยะไกลอาจมีปัญหาและการดึงข้อมูลระยะไกลจากท้องถิ่นอาจมีประสิทธิภาพมากกว่าการบรรจุลงใน PUT ขนาดใหญ่) มันแสดงให้เห็นว่าสามารถใช้ REST ในระหว่างสองอย่างไร กระบวนการซิงโครไนซ์ทิศทาง