REST एपीआई में आप द्वि-दिशात्मक सिंक का सबसे अच्छा प्रतिनिधित्व कैसे करते हैं?


23

एक सिस्टम को मानते हुए जहां एक संसाधन के साथ एक वेब अनुप्रयोग है, और एक अन्य समान संसाधन के साथ एक दूरस्थ अनुप्रयोग का संदर्भ है, आप एक द्वि-दिशात्मक सिंक कार्रवाई का प्रतिनिधित्व कैसे करते हैं जो 'स्थानीय' संसाधन को 'दूरस्थ' संसाधन के साथ सिंक्रनाइज़ करता है?

उदाहरण:

मेरे पास एक एपीआई है जो एक टूडू सूची का प्रतिनिधित्व करता है।

GET / POST / PUT / DELETE / todos /, आदि।

यह एपीआई दूरस्थ TODO सेवाओं को संदर्भित कर सकता है।

GET / POST / PUT / DELETE / todo_services /, आदि।

मैं अपने एपीआई के माध्यम से दूरस्थ सेवा से एक प्रॉक्सी के रूप में todos में हेरफेर कर सकता हूं

GET / POST / PUT / DELETE / todo_services / abc123 /, आदि।

मैं एक स्थानीय सेट todos और TODOS के दूरस्थ सेट के बीच द्वि-दिशात्मक सिंक करने की क्षमता चाहता हूं।

Rpc तरह से, एक कर सकता था

पोस्ट / todo_services / abc123 / सिंक /

लेकिन, "क्रिया खराब हैं" विचार में, क्या इस क्रिया का प्रतिनिधित्व करने का एक बेहतर तरीका है?


4
मुझे लगता है कि एक अच्छा एपीआई डिज़ाइन पूरी तरह से सिंक के द्वारा आपके लिए बहुत ठोस समझ पर निर्भर है दो डेटा स्रोतों का "सिंक" आमतौर पर एक बहुत ही जटिल समस्या है जो अपने सभी निहितार्थों के माध्यम से विचार करना बहुत आसान है, लेकिन बहुत मुश्किल है। इसे "द्वि-दिशात्मक" सिंक बनाएं, और अचानक कठिनाई बहुत अधिक है। बहुत कठिन प्रश्नों के माध्यम से सोचकर शुरू करें।
एडम क्रॉसलैंड

सही - मान लें कि सिंक एल्गोरिथ्म "कोड-स्तर" एपीआई में डिज़ाइन और कार्यात्मक है - मैं इसे रीस्ट के माध्यम से कैसे उजागर करता हूं। एक तरह से सिंक को व्यक्त करना बहुत आसान लगता है: मैं GET /todo/1/और POSTयह /todo_services/abc123/ लेकिन, 2 तरह से - मैं कोई डेटासेट नहीं ले रहा हूं और इसे एक संसाधन में डाल रहा हूं, मैं जो कार्रवाई कर रहा हूं वह वास्तव में दो संसाधनों के संभावित संशोधन का परिणाम है। मुझे लगता है कि मैं "टूडू सिंक्रोनोनाइजेशन" होने के कारण खुद को संसाधनों के रूप में वापस पा सकता हूं POST /todo_synchronizations/ {"todos":["/todo/1/","/todo_services/abc123/1"],"schedule":"now"}
एडवर्ड एम स्मिथ

हमारे पास अभी भी कार्ट-से-घोड़े का मुद्दा है। मेरा कहना यह था कि आप सिंक को काम नहीं कर सकते और एपीआई को डिजाइन कर सकते हैं। एपीआई का डिज़ाइन वास्तव में सिंक एल्गोरिथ्म कैसे काम करता है के कई चिंताओं से प्रेरित होगा।
एडम क्रॉसलैंड

यह संभावित रूप से उपयोगी परिणामों को उजागर करता है: GET /todo_synchronizations/1=>{"todos":["/todo/1/","/todo_services/abc123/1"],"schedule":"now","ran_at":"datetime","result":"success"}
एडवर्ड एम स्मिथ

2
मैं @ अदम से सहमत हूं। क्या आप जानते हैं कि आप अपने सिंक को कैसे लागू करने जा रहे हैं? आप परिवर्तनों को कैसे संभाल रहे हैं? क्या आपके पास केवल दो सेट आइटम हैं जिन्हें आप समेटना चाहते हैं या क्या आपके पास उन कार्यों का एक लॉग है जो दो सेटों को अंतिम सिंक से अलग करने का कारण बने? मैं जो कारण पूछ रहा हूं, वह जोड़ता है और हटाता है (बाकी की परवाह किए बिना) का पता लगाने के लिए मुश्किल हो सकता है। यदि आपके पास ऑब्जेक्ट सर्वर-साइड है और इसके पास क्लाइंट-साइड नहीं है, तो आपको खुद से पूछना होगा, "क्या क्लाइंट ने इसे डिलीट किया या सर्वर ने इसे बनाया?" केवल जब आप ठीक से जानते हैं कि "संसाधन" कैसे व्यवहार करता है, तो आप इसे REST में सही ढंग से दर्शा सकते हैं।
रेमंड सॉल्टरी

जवाबों:


17

कहाँ और क्या संसाधन हैं?

REST संसाधनों के बारे में सभी को एक सांविधिक, खोजनीय तरीके से संबोधित करता है। इसे HTTP पर लागू नहीं किया जाना है, न ही इसे JSON या XML पर निर्भर करना है, हालांकि यह दृढ़ता से अनुशंसा की जाती है कि लिंक और आईडी वांछनीय होने के बाद से एक हाइपरमीडिया डेटा प्रारूप ( HATEOAS सिद्धांत देखें ) का उपयोग किया जाता है।

तो, यह सवाल बनता है: संसाधनों के संदर्भ में सिंक्रनाइज़ेशन के बारे में कोई कैसे सोचता है?

द्वि-दिशात्मक सिंक क्या है? **

द्वि-दिशात्मक सिंक नोड्स के ग्राफ पर मौजूद संसाधनों को अपडेट करने की प्रक्रिया है ताकि, प्रक्रिया के अंत में, सभी नोड्स ने उन संसाधनों को नियंत्रित करने वाले नियमों के अनुसार अपने संसाधनों को अपडेट किया हो। आमतौर पर, यह समझा जाता है कि सभी नोड्स में ग्राफ के भीतर मौजूद संसाधनों का नवीनतम संस्करण होगा। सरलतम मामले में ग्राफ में दो नोड होते हैं: स्थानीय और दूरस्थ। स्थानीय सिंक को आरंभ करता है।

इसलिए जिस प्रमुख संसाधन की आवश्यकता है, वह एक लेन-देन लॉग है और इसलिए, एक सिंक प्रक्रिया इस तरह दिख सकती है: "नीचे दिए गए" आइटम ":

चरण 1 - स्थानीय लेन-देन लॉग को पुनर्प्राप्त करता है

स्थानीय: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z

रिमोट: 200 ओके बॉडी वाले ट्रांजेक्शन लॉग वाले फ़ील्ड इसी तरह के होते हैं।

  • itemId - एक साझा प्राथमिक कुंजी प्रदान करने के लिए एक UUID

  • updatedAt - डेटा को अंतिम बार अपडेट किए जाने पर एक समन्वित बिंदु प्रदान करने के लिए टाइमस्टैम्प (यह मानते हुए कि संशोधन इतिहास की आवश्यकता नहीं है)

  • fingerprint- updateAtकुछ सेकंड बाहर है तो तेजी से तुलना के लिए डेटा की सामग्री का एक SHA1 हैश

  • itemURI - बाद में पुनर्प्राप्ति की अनुमति देने के लिए आइटम के लिए एक पूर्ण यूआरआई

चरण 2 - स्थानीय दूरस्थ लेनदेन लॉग की अपनी तुलना करता है

यह सिंक करने के तरीके के व्यापार नियमों का अनुप्रयोग है। आमतौर पर, itemIdस्थानीय संसाधन की पहचान करेगा, फिर फिंगरप्रिंट की तुलना करें। यदि अंतर है तो तुलना की updatedAtजाती है। यदि ये कॉल करने के बहुत करीब हैं, तो दूसरे नोड के आधार पर खींचने के लिए एक निर्णय लेने की आवश्यकता होगी (शायद यह अधिक महत्वपूर्ण है), या दूसरे नोड पर पुश करने के लिए (यह नोड अधिक महत्वपूर्ण है)। यदि दूरस्थ संसाधन स्थानीय रूप से मौजूद नहीं है, तो एक पुश प्रविष्टि की जाती है (इसमें सम्मिलित / अद्यतन के लिए वास्तविक डेटा होता है)। दूरस्थ लेन-देन लॉग में मौजूद कोई भी स्थानीय संसाधन अपरिवर्तित नहीं माने जाते हैं।

दूरस्थ नोड के खिलाफ पुल अनुरोध किए जाते हैं ताकि डेटा स्थानीय रूप से मौजूद हो itemURI। उन्हें स्थानीय स्तर पर बाद में लागू नहीं किया जाता है।

चरण 3 - दूरस्थ में स्थानीय सिंक लेनदेन लॉग पुश करें

स्थानीय: PUT /remotehost/items/transactions शरीर के साथ स्थानीय सिंक लेनदेन लॉग युक्त।

दूरस्थ नोड इस प्रक्रिया को सिंक्रोनाइज़ कर सकता है (यदि यह छोटा और त्वरित है) या एसिंक्रोनस रूप से (सोचें 202 स्वीकृत ) यदि यह बहुत अधिक ओवरहेड होने की संभावना है। एक समकालिक ऑपरेशन की मानें, तो परिणाम सफलता या असफलता के आधार पर या तो 200 ठीक या 409 CONFLICT होगा409 CONFLICT के मामले में , फिर प्रक्रिया को फिर से शुरू करना होगा क्योंकि दूरस्थ नोड पर एक आशावादी लॉकिंग विफलता हुई है (किसी ने सिंक के दौरान डेटा बदल दिया है)। रिमोट अपडेट को अपने स्वयं के एप्लिकेशन लेनदेन के तहत संसाधित किया जाता है।

चरण 4 - स्थानीय रूप से अपडेट करें

चरण 2 में खींचा गया डेटा स्थानीय रूप से एक एप्लिकेशन लेनदेन के तहत लागू किया जाता है।

जबकि ऊपर सही नहीं है (ऐसी कई स्थितियाँ हैं जहाँ स्थानीय और दूरस्थ परेशानी में पड़ सकते हैं और स्थानीय से दूरस्थ पुल डेटा संभवतः इसे एक बड़े PUT में भरने से अधिक कुशल है) यह प्रदर्शित करता है कि एक द्वि के दौरान REST का उपयोग कैसे किया जा सकता है। दिशात्मक तुल्यकालन प्रक्रिया।


6

मैं एक सिंक्रनाइज़ेशन ऑपरेशन को एक संसाधन के रूप में मानता हूं जिसे एक्सेस (GET) या बनाया (POST) किया जा सकता है। इसे ध्यान में रखते हुए, एपीआई URL हो सकता है:

/todo_services/abc123/synchronization

(इसे "सिंक्रोनाइज़ेशन" कहना, "सिंक" नहीं, यह स्पष्ट करने के लिए कि यह क्रिया नहीं है)

फिर करो:

POST /todo_services/abc123/synchronization

एक सिंक्रनाइज़ेशन आरंभ करने के लिए। चूंकि एक सिंक्रनाइज़ेशन ऑपरेशन एक संसाधन है, यह कॉल संभावित रूप से एक आईडी लौटा सकती है जिसका उपयोग ऑपरेशन की स्थिति की जांच करने के लिए किया जा सकता है:

GET /todo_services/abc123/synchronization?id=12345

3
यह सरल उत्तर है उत्तर। अपनी क्रियाओं को संज्ञा में
बदलिए

5

यह एक कठिन समस्या है। मुझे विश्वास नहीं है कि सिंक को लागू करने के लिए REST एक उपयुक्त स्तर है। एक मजबूत सिंक अनिवार्य रूप से एक वितरित लेनदेन की आवश्यकता होगी। REST उस कार्य के लिए उपकरण नहीं है।

(मान लें: "सिंक" द्वारा आप यह अनुमान लगा रहे हैं कि या तो संसाधन किसी भी समय दूसरे के स्वतंत्र रूप से बदल सकता है, और आप अपडेट खोए बिना उन्हें पुनः प्राप्त करने की क्षमता चाहते हैं।)

आप एक को "मास्टर" और दूसरे को "गुलाम" बनाने पर विचार कर सकते हैं, ताकि आप स्वामी के डेटा के साथ समय-समय पर विश्वास कर सकें।

आप Microsoft सिंक फ्रेमवर्क पर विचार करना चाह सकते हैं यदि आपको स्वतंत्र रूप से बदलते डेटा स्टोर का समर्थन करने की आवश्यकता है। यह REST के माध्यम से नहीं, बल्कि दृश्यों के पीछे काम करेगा।


5
"कठिन समस्या" के लिए +1। द्वि-दिशात्मक सिंकिंग उन चीजों में से एक है जो आपको एहसास नहीं है कि जब तक आप कीचड़ में गहरे नहीं हैं तब तक कितना मुश्किल है।
डैन रे

2

Apache CouchDB एक डेटाबेस है जो REST, HTTP और JSON पर आधारित है। डेवलपर्स HTTP पर मूल CRUD ऑपरेशन करते हैं। यह एक प्रतिकृति तंत्र भी प्रदान करता है जो केवल HTTP विधियों का उपयोग करके सहकर्मी से सहकर्मी है।

इस प्रतिकृति को प्रदान करने के लिए, CouchDB को कुछ CouchDB- विशिष्ट सम्मेलनों की आवश्यकता है। इनमें से कोई भी REST के विरोध में नहीं है। यह एक संशोधन संख्या के साथ प्रत्येक दस्तावेज़ (जो डेटाबेस के भीतर एक अन्य संसाधन है) प्रदान करता है । यह उस दस्तावेज़ के JSON प्रतिनिधित्व का हिस्सा है, लेकिन ETag HTTP हेडर में भी है। प्रत्येक डेटाबेस में एक अनुक्रम संख्या भी होती है, जो समग्र रूप से डेटाबेस में परिवर्तन पर नज़र रखने की अनुमति देती है ।

के लिए संघर्ष समाधान , वे बस ध्यान दें कि एक दस्तावेज विरोध हुआ है और विरोध हुआ संस्करणों को बनाए रखने, डेटाबेस का उपयोग कर एक संघर्ष समाधान एल्गोरिथ्म प्रदान करने के लिए डेवलपर्स के लिए इसे छोड़ने।

आप या तो अपने REST API के रूप में CouchDB का उपयोग कर सकते हैं, जो आपको बॉक्स से बाहर सिंक्रोनाइज़ेशन देगा, या इस बात पर एक नज़र रखेगा कि यह कैसे अपने स्वयं के एल्गोरिथ्म बनाने के लिए एक प्रारंभिक बिंदु प्रदान करने के लिए प्रतिकृति प्रदान करता है।


मैं CouchDB प्यार करता हूँ, और यह उत्तराधिकारी CouchBase + SyncGateway है। +1
लियोनिद उसोव

-1

आप एक सरल नाम बदलने के साथ "क्रिया खराब हैं" समस्या को हल कर सकते हैं - "सिंक" के बजाय "अपडेट" का उपयोग करें।

सिंक प्रक्रिया वास्तव में पिछले सिंक के बाद से किए गए स्थानीय अपडेट की एक सूची भेज रही है, और उसी समय सर्वर पर किए गए अपडेट की एक सूची प्राप्त कर रही है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.