कमांड / एक्शन आधारित डोमेन के लिए REST API कैसे फिट होता है?


24

इस लेख में लेखक का दावा है कि

कभी-कभी, एपीआई में एक ऑपरेशन को उजागर करना आवश्यक होता है जो स्वाभाविक रूप से गैर रेस्टफुल है।

और वह

यदि किसी API में बहुत अधिक क्रियाएँ होती हैं, तो यह एक संकेत है कि या तो इसे RPC के दृष्टिकोण से डिज़ाइन किया गया था बजाय Restful सिद्धांतों का उपयोग करने के, या यह कि प्रश्न में API स्वाभाविक रूप से RPC प्रकार के मॉडल के लिए एक बेहतर फिट है।

यह दर्शाता है कि मैंने कहीं और क्या पढ़ा और सुना है।

हालांकि मुझे यह काफी उलझन भरा लगता है और मैं इस मामले की बेहतर समझ हासिल करना चाहूंगा।

उदाहरण I: शस्ट इंटरफेस के माध्यम से एक वीएम को बंद करना

मुझे लगता है कि, वीएम के शटडाउन को मॉडल करने के दो मूल रूप से अलग-अलग तरीके हैं। प्रत्येक तरीके में कुछ बदलाव हो सकते हैं, लेकिन आइए अब के लिए सबसे बुनियादी अंतरों पर ध्यान केंद्रित करें।

1. संसाधन की राज्य संपत्ति को पैच करें

PATCH /api/virtualmachines/42
Content-Type:application/json  

{ "state": "shutting down" }

(वैकल्पिक रूप से, PUTउप-संसाधन पर /api/virtualmachines/42/state)

VM बैकग्राउंड में बंद हो जाएगा और कुछ समय के बाद में समय के साथ-साथ वेदर शट डाउन करना सफल हो जाएगा या नहीं राज्य को "पावर ऑफ" के साथ आंतरिक रूप से अपडेट किया जा सकता है।

2. संसाधन की कार्रवाई संपत्ति पर PUT या POST

PUT /api/virtualmachines/42/actions
Content-Type:application/json  

{ "type": "shutdown" }

परिणाम पहले उदाहरण के समान ही है। राज्य को तुरंत "शट डाउन" करने के लिए अपडेट किया जाएगा और शायद "पावर ऑफ" करने के लिए।

क्या दोनों डिजाइन रेस्टफुल हैं?

कौन सा डिज़ाइन बेहतर है?

उदाहरण II: CQRS

क्या होगा यदि हमारे पास कई ऐसे "कार्यों" (उर्फ कमांड) के साथ एक CQRS डोमेन है जो संभावित रूप से कई एग्रीगेट्स के अपडेट का कारण बन सकता है या कंक्रीट संसाधनों और उप-संसाधनों पर सीआरयूडी संचालन के लिए मैप नहीं किया जा सकता है?

क्या हमें कंक्रीट के संसाधनों पर कंक्रीट बनाने या अपडेट के रूप में कई कमांडों को मॉडल करने की कोशिश करनी चाहिए, जहां कभी भी संभव हो (उदाहरण के लिए पहले दृष्टिकोण का अनुसरण करते हुए) और बाकी के लिए "एक्शन एंडपॉइंट्स" का उपयोग करें?

या क्या हमें सभी कमांड को एक्शन एंडपॉइंट्स के रूप में मैप करना चाहिए (उदाहरण के दूसरे दृष्टिकोण में)?

हमें कहां रेखा खींचनी चाहिए? डिज़ाइन कम RESTful कब बनता है?

क्या CQRS मॉडल एक RPC जैसे API के लिए बेहतर फिट है?

ऊपर दिए गए उद्धृत पाठ के अनुसार, जैसा कि मैं इसे समझता हूं।

जैसा कि आप मेरे कई सवालों से देख सकते हैं, मैं इस विषय को लेकर थोड़ा भ्रमित हूं। क्या आप इसकी बेहतर समझ पाने में मेरी मदद कर सकते हैं?


"एक्शन क्रिएट करना" रेस्टफुल नहीं लगता है, सिवाय इसके कि निष्पादित एक्शन का अपना संसाधन पहचानकर्ता है। अन्यथा PATCH या PUT के माध्यम से "राज्य" संपत्ति को बदलना अधिक समझ में आता है। CQRS भाग के लिए, मेरे पास अभी तक एक अच्छा जवाब नहीं है।
फाबियन शेंगलर 12

3
@Laiv इसमें कुछ भी गलत नहीं है। यह एक अकादमिक प्रश्न है, मैं इस मामले की गहन समझ प्राप्त करना चाहता हूं।
leifbattermann

जवाबों:


19

पहले मामले में (VM का शट-डाउन), मैं OP विकल्पों में से कोई नहीं पर विचार करूंगा। दी, यदि आप रिचर्डसन परिपक्वता मॉडल का उपयोग एक यार्डस्टिक के रूप में करते हैं, तो वे दोनों 2 एपीआई हैं क्योंकि वे संसाधनों और क्रियाओं का उपयोग करते हैं।

हालांकि, उनमें से कोई भी, हाइपरमीडिया नियंत्रण का उपयोग नहीं करता है, और मेरी राय में, यह एकमात्र प्रकार का REST है जो RPC से RESTful API डिज़ाइन को अलग करता है । दूसरे शब्दों में, स्तर 1 और 2 के साथ रहना और आप ज्यादातर मामलों में RPC- शैली API रखना चाहते हैं।

VM को बंद करने के दो अलग-अलग तरीकों को मॉडल करने के लिए, मैं VM को एक ऐसे संसाधन के रूप में उजागर करूंगा जिसमें (अन्य बातों के अलावा) निम्नलिखित हैं:

{
    "links": [{
        "rel": "shut-down",
        "href": "/vms/1234/fdaIX"
    }, {
        "rel": "power-off",
        "href": "/vms/1234/CHTY91"
    }],
    "name": "Ploeh",
    "started": "2016-08-21T12:34:23Z"
}

एक ग्राहक को शट डाउन करना चाहता है Ploehवी एम, यह चाहिए लिंक का पालन के साथ shut-downसंबंध प्रकार। (सामान्यतः, जैसा कि Restful Web Services Cookbook में उल्लिखित है , आप संबंध प्रकारों के लिए IRI या अधिक विस्तृत पहचान योजना का उपयोग करेंगे, लेकिन मैंने उदाहरण को यथासंभव सरल रखने के लिए चुना।)

इस मामले में, कार्रवाई के साथ प्रदान करने के लिए बहुत कम अन्य जानकारी है, इसलिए ग्राहक को सरल URL में URL के खिलाफ एक खाली POST बनाना चाहिए href:

POST /vms/1234/fdaIX HTTP/1.1

(चूंकि इस अनुरोध का कोई निकाय नहीं है, इसलिए इसे GET अनुरोध के रूप में मॉडल करना होगा, लेकिन GET अनुरोधों का कोई भी दुष्प्रभाव नहीं होना चाहिए, इसलिए POST अधिक सही है।)

इसी तरह, यदि कोई ग्राहक VM को बंद करना चाहता है, तो वह power-offइसके बजाय लिंक का अनुसरण करेगा ।

दूसरे शब्दों में, लिंक के संबंध प्रकार उन खर्चों को प्रदान करते हैं जो इरादे का संकेत देते हैं। प्रत्येक संबंध प्रकार का एक विशिष्ट अर्थ महत्व है। यही कारण है कि हम कभी-कभी शब्दार्थ वेब के बारे में बात करते हैं ।

उदाहरण को यथासंभव स्पष्ट रखने के लिए, मैंने जानबूझकर प्रत्येक लिंक में URL को अस्पष्ट किया है। जब होस्टिंग सर्वर को इनकमिंग रिक्वेस्ट मिलती है, तो उसे पता चलेगा कि fdaIXइसका मतलब शट डाउन है , और पावर ऑफ काCHTY91 मतलब है

आम तौर पर, मैं केवल URL में ही कार्रवाई को सांकेतिक शब्दों में बदलना चाहता हूं, ताकि URL /vms/1234/shut-downऔर हो /vms/1234/power-off, लेकिन जब पढ़ाते हैं, तो रिश्ते प्रकारों (शब्दार्थ) और URL (कार्यान्वयन विवरण) के बीच अंतर को धुंधला करता है।

आपके पास कौन से क्लाइंट हैं, इसके आधार पर, आप RESTful URL को नॉन-हैक करने योग्य बनाने पर विचार कर सकते हैं ।

CQRS

जब यह CQRS की बात आती है, तो ग्रेग यंग और उदी दहन की कुछ चीजों में से एक इस बात से सहमत है कि CQRS एक शीर्ष-स्तरीय वास्तुकला नहीं है । इस प्रकार, मैं रैस्टफुल एपीआई को भी CQRS की तरह बनाने के बारे में सतर्क रहूंगा, क्योंकि इसका मतलब यह होगा कि ग्राहक आपकी वास्तुकला का हिस्सा बनेंगे।

अक्सर, एक असली (स्तर 3) रेस्टफुल एपीआई के पीछे ड्राइविंग बल यह है कि आप अपने एपीआई को ग्राहकों को तोड़ने के बिना, और ग्राहकों के नियंत्रण के बिना विकसित करने में सक्षम होना चाहते हैं। यदि वह आपकी प्रेरणा है, तो CQRS मेरी पहली पसंद नहीं होगी।


क्या आपका मतलब यह है कि पहले उदाहरण दोनों ही रैस्टफुल नहीं हैं क्योंकि वे हाइपरमीडिया नियंत्रण का उपयोग नहीं करते हैं? लेकिन मैंने कोई भी प्रतिक्रिया पोस्ट नहीं की, केवल अनुरोध URL और निकाय।
लीफबैटरमैन 12

4
@leifbattermann वे रेस्टफुल नहीं हैं क्योंकि वे इरादे का संचार करने के लिए संदेश निकाय का उपयोग करते हैं; यह स्पष्ट रूप से RPC है। यदि आप उन संसाधनों पर पहुंचने के लिए लिंक का उपयोग करते हैं, तो आपको शरीर के माध्यम से इरादे से संवाद करने की आवश्यकता क्यों होगी?
मार्क सेमैन

यह समझ आता है। आप एक POST क्यों सुझाते हैं? क्या कार्रवाई बेकार नहीं है? किसी भी स्थिति में, आप अपने क्लाइंट को किस HTTP विधि का उपयोग करने के लिए कहते हैं?
leifbattermann

2
@ guillaume31 DELETEमुझे अजीब लगता है क्योंकि शट डाउन करने के बाद भी vm अभी भी मौजूद रहेगा, केवल राज्य में "पावर ऑफ" (या sth। जैसा है)।
लीफबैटरमैन 14

1
संसाधन को वीएम पर प्रतिबिंबित नहीं करना पड़ता है, यह इसके निष्पादन उदाहरण का प्रतिनिधित्व कर सकता है।
गुइलूम

6

REST इंटरफ़ेस के माध्यम से VM को बंद करना

यह वास्तव में एक प्रसिद्ध उदाहरण है, 2009 में टिम ब्रे द्वारा सामने रखा गया ।

रॉय फील्डिंग, समस्या पर चर्चा करते हुए, इस अवलोकन को साझा किया :

मैं व्यक्तिगत रूप से उन प्रणालियों को प्राथमिकता देता हूं जो निगरानी की स्थिति (जैसे बिजली की स्थिति) को गैर-संपादन योग्य मानते हैं।

संक्षेप में, आपके पास एक सूचना संसाधन है जो मॉनिटर किए गए राज्य का एक वर्तमान प्रतिनिधित्व लौटाता है; कि प्रतिनिधित्व एक करने के लिए एक हाइपरमीडिया लिंक शामिल हो सकता है प्रपत्र कि कि राज्य में परिवर्तन का अनुरोध करने के लिए, और प्रपत्र हैंडल (प्रत्येक) परिवर्तन अनुरोध करने के लिए एक संसाधन के लिए एक और कड़ी है।

सेठ लड्डू की समस्या में प्रमुख अंतर्दृष्टि थी

हमने एक व्यक्ति की एक सरल अवस्था से एक सच्चे संज्ञा की ओर भाग रहे हैं, जिसे बनाया जा सकता है, अद्यतन किया जा सकता है और इसके बारे में बात की जा सकती है।

इसे रीबूटिंग मशीनों पर वापस ले जाना। मेरा तर्क है कि आप पोस्ट / vdc / 434 / क्लस्टर / 4894 / सर्वर / 4343 / रिबूट करने के बाद एक बार पोस्ट करने के बाद आपके पास एक यूआरआई होगा जो इस रिबूट का प्रतिनिधित्व करता है , और आप इसे स्टेटस अपडेट के लिए प्राप्त कर सकते हैं। हाइपरलिंकिंग के जादू के माध्यम से, रिबूट का प्रतिनिधित्व रिबूट किए गए सर्वर से जुड़ा हुआ है।

मुझे लगता है कि मिंटिंग यूआरआई स्पेस सस्ता है, और यूआरआई भी सस्ता है। गतिविधियों का एक संग्रह बनाएँ, जो Nouns और POST, PUT, और DELETE के रूप में निर्मित हैं!

रैस्टफुल प्रोग्रामिंग वेब पैमाने पर वोगन नौकरशाही है। आप कुछ भी कैसे करते हैं ? इसके लिए नई कागजी कार्रवाई का आविष्कार करें, और कागजी कार्रवाई को डिजिटल करें।

कुछ हद तक कट्टर भाषा में, आप जो कर रहे हैं, वह "वीएम को बंद करने" के लिए डोमेन एप्लिकेशन प्रोटोकॉल को परिभाषित कर रहा है , और उस प्रोटोकॉल को उजागर करने / लागू करने के लिए आवश्यक संसाधनों की पहचान करना है।

अपने स्वयं के उदाहरणों को देखते हुए

PATCH /api/virtualmachines/42
Content-Type:application/json  

{ "state": "shutting down" }

ठीक है; आप वास्तव में अनुरोध को अपने स्वयं के अलग सूचना संसाधन के रूप में नहीं मान रहे हैं, लेकिन आप अभी भी प्रबंधित कर सकते हैं।

आप परिवर्तन के अपने प्रतिनिधित्व में थोड़ा चूक गए हैं।

PATCH के साथ, हालांकि, संलग्न इकाई में निर्देशों का एक सेट होता है, जो बताता है कि वर्तमान में मूल सर्वर पर रहने वाले संसाधन को एक नया संस्करण बनाने के लिए कैसे संशोधित किया जाना चाहिए।

उदाहरण के लिए, JSON पैच मीडिया प्रकार के प्रारूप निर्देश जैसे कि आप सीधे JSON दस्तावेज़ को संशोधित कर रहे थे

[
    { "op": "replace", "path": "state", "value": "shutting down" }
]

आपके विकल्प में, विचार करीब है, लेकिन स्पष्ट रूप से सही नहीं है। लक्ष्य URL परPUT संसाधन की स्थिति का पूर्ण प्रतिस्थापन है , इसलिए आप संभवतः एक वर्तनी का चयन नहीं करेंगे जो किसी एकल इकाई के प्रतिनिधित्व के लक्ष्य के रूप में एक संग्रह की तरह दिखता है ।

POST /api/virtualmachines/42/actions

कथा के अनुरूप है कि हम एक कतार में एक कार्रवाई जोड़ रहे हैं

PUT /api/virtualmachines/42/latestAction

कथा के अनुरूप है कि हम कतार में पूंछ आइटम के लिए एक अद्यतन कर रहे हैं; यह इस तरह से करना थोड़ा अजीब है। कम से कम आश्चर्य का सिद्धांत प्रत्येक पीयूटी को देने की सिफारिश करता है, यह एक अद्वितीय पहचानकर्ता है, न कि उन सभी को एक ही स्थान पर रखना और एक ही समय में कई संसाधनों को संशोधित करना।

ध्यान दें, जहाँ तक हम URI की वर्तनी पर चर्चा कर रहे हैं - REST परवाह नहीं करता है; /cc719e3a-c772-48ee-b0e6-09b4e7abbf8bजहाँ तक REST का सवाल है, एक पूरी तरह से cromulent URI है। चर नामों के साथ पठनीयता एक अलग चिंता का विषय है। RFC 3986 के साथ संगत वर्तनी का उपयोग करना लोगों को बहुत खुश कर देगा।

CQRS

क्या होगा यदि हमारे पास कई ऐसे "कार्यों" (उर्फ कमांड) के साथ एक CQRS डोमेन है जो संभावित रूप से कई एग्रीगेट्स के अपडेट का कारण बन सकता है या कंक्रीट संसाधनों और उप-संसाधनों पर सीआरयूडी संचालन के लिए मैप नहीं किया जा सकता है?

CQRS पर ग्रेग यंग

CQRS एक बहुत ही सरल पैटर्न है जो वास्तुकला के कई अवसरों को सक्षम करता है जो अन्यथा मौजूद नहीं हो सकते हैं। CQRS अंततः सुसंगतता नहीं है, यह ईवेंट नहीं है, यह मैसेजिंग नहीं है, यह पढ़ने और लिखने के लिए अलग मॉडल नहीं है, और न ही यह इवेंट सोर्सिंग का उपयोग कर रहा है।

जब अधिकांश लोग CQRS के बारे में बात करते हैं तो वे वास्तव में CQRS पैटर्न को उस वस्तु पर लागू करने के बारे में बोल रहे हैं जो अनुप्रयोग की सेवा सीमा का प्रतिनिधित्व करता है।

यह देखते हुए कि आप HTTP / REST के संदर्भ में CQRS के बारे में बात कर रहे हैं, यह मानना ​​उचित है कि आप इस बाद के संदर्भ में काम कर रहे हैं, तो चलिए उसी के साथ चलते हैं।

यह आश्चर्यजनक रूप से, आपके पिछले उदाहरण की तुलना में अधिक आसान है। इसका कारण सरल है: आदेश संदेश हैं

जिम वेबर HTTP को 1950 के दशक के कार्यालय के अनुप्रयोग प्रोटोकॉल के रूप में वर्णित करता है; संदेश लेकर और उन्हें इनबॉक्स में डालकर काम हो जाता है। एक ही विचार रखता है - हमें एक फॉर्म की एक खाली प्रति मिलती है, इसे उन बारीकियों के साथ भरें जिन्हें हम जानते हैं, इसे वितरित करें। ता दा

क्या हमें कंक्रीट के संसाधनों पर कंक्रीट बनाने या अपडेट के रूप में कई कमांडों को मॉडल करने की कोशिश करनी चाहिए, जहां कभी भी संभव हो (उदाहरण के लिए पहले दृष्टिकोण का अनुसरण करते हुए) और बाकी के लिए "एक्शन एंडपॉइंट्स" का उपयोग करें?

हां, डोमेन मॉडल में संस्थाओं के बजाय "ठोस संसाधन" के रूप में इंसोफर संदेश हैं।

मुख्य विचार: आपका REST API अभी भी एक इंटरफ़ेस है ; आपको संदेशों को बदलने की आवश्यकता वाले क्लाइंट के बिना अंतर्निहित मॉडल को बदलने में सक्षम होना चाहिए। जब आप एक नया मॉडल जारी करते हैं, तो आप अपने वेब एंडपॉइंट्स का एक नया संस्करण जारी करते हैं, जो आपके डोमेन प्रोटोकॉल को लेना और नए मॉडल पर लागू करना जानता है।

क्या CQRS मॉडल एक RPC जैसे API के लिए बेहतर फिट है?

वास्तव में नहीं - विशेष रूप से, वेब कैश एक "अंततः सुसंगत रीड मॉडल" का एक शानदार उदाहरण है। अपने प्रत्येक विचार को स्वतंत्र रूप से संबोधित करते हुए, प्रत्येक अपने स्वयं के कैशिंग नियमों के साथ, आपको मुफ्त में स्केलिंग का एक गुच्छा देता है। पढ़ने के लिए विशेष रूप से RPC दृष्टिकोण के लिए अपेक्षाकृत कम अपील है।

लिखने के लिए, यह एक पेचीदा प्रश्न है: सभी कमांड को एक सिंगल हैंडपॉइंट पर एक ही हैंडलर या एंडपॉइंट के एकल परिवार को भेजना, निश्चित रूप से आसान है । REST वास्तव में इस बारे में अधिक है कि आप यह कैसे पाते हैं कि क्लाइंट के लिए समापन बिंदु कहां है।

एक संदेश को अपने स्वयं के अनूठे संसाधन के रूप में मानने से यह फायदा होता है कि आप PUT का उपयोग कर सकते हैं, मध्यस्थ घटकों को इस तथ्य से सचेत कर सकते हैं कि संदेश को संभालना बेकार है, ताकि वे त्रुटि से निपटने के कुछ मामलों में भाग ले सकें, यह एक अच्छा है । (नोट: कि ग्राहकों के दृष्टिकोण से, यदि संसाधनों में अलग-अलग यूआरआई हैं, तो वे अलग-अलग संसाधन हैं। तथ्य यह है कि उनके पास मूल सर्वर पर एक ही अनुरोध हैंडलर कोड हो सकता है, जो वर्दी द्वारा छिपाए गए कार्यान्वयन विवरण है। इंटरफेस)।

क्षेत्ररक्षण (2008)

मुझे यह भी ध्यान देना चाहिए कि उपरोक्त अभी तक पूरी तरह से Restful नहीं है, कम से कम मैं कैसे शब्द का उपयोग करता हूं। मेरे द्वारा किए गए सभी सेवा इंटरफेस को वर्णित किया गया है, जो किसी भी आरपीसी से अधिक नहीं है। इसे RESTful बनाने के लिए, मुझे सेवा शुरू करने और परिभाषित करने के लिए हाइपरटेक्स्ट जोड़ने की आवश्यकता होगी, वर्णन करें कि फॉर्म और / या लिंक टेम्प्लेट का उपयोग करके मैपिंग कैसे करें, और विज़ुअलाइज़ेशन को उपयोगी तरीकों से संयोजित करने के लिए कोड प्रदान करें।


2

आप अनुरोध के सामग्री-प्रकार हेडर फ़ील्ड में कमांड निर्दिष्ट करने के लिए मीडिया प्रकार के 5 स्तरों का लाभ उठा सकते हैं।

वीएम उदाहरण में, यह इन पंक्तियों के साथ कुछ होगा

PUT /api/virtualmachines/42
Content-Type:application/json;domain-model=PowerOnVm

> HTTP/1.1 201 Created
Location: /api/virtualmachines/42/instance

फिर

DELETE /api/virtualmachines/42/instance
Content-Type:application/json;domain-model=ShutDownVm

या

DELETE /api/virtualmachines/42/instance
Content-Type:application/json;domain-model=PowerOffVm

Https://www.infoq.com/articles/rest-api-on-cqrs देखें


सलाह दी जाए, 5LMT एक प्रस्तावित समाधान था और मानकों द्वारा समर्थित नहीं है । मैं पहले CQRS लेख में आया था और इससे बहुत कुछ सीखा।
पीटर एल

1

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

मेरी डेस्क पर कंप्यूटर की शक्ति स्थिति को नियंत्रित करने के दो तरीके हैं:

  • पावर स्विच: तुरंत बिजली की आपूर्ति में बिजली के प्रवाह में कटौती करता है, जिससे पूरे कंप्यूटर को अचानक, अव्यवस्थित रूप से रोक दिया जाता है।
  • चालू / बंद बटन: सॉफ़्टवेयर को सूचित करने के लिए हार्डवेयर को बताता है कि बाहर की तरफ कुछ चाहता है कि सब कुछ बंद हो जाए। सॉफ्टवेयर एक व्यवस्थित रूप से शटडाउन करता है, उस हार्डवेयर को सूचित करता है जो उसने किया है और हार्डवेयर बिजली की आपूर्ति को इंगित करता है कि वह अपने स्टैंडबाय राज्य में जा सकता है। यदि पावर स्विच चालू है, तो मशीन चल रही है और सॉफ्टवेयर एक ऐसी स्थिति में है जहां यह शटडाउन सिग्नल का जवाब नहीं दे सकता है, जब तक मैं पावर स्विच बंद नहीं करता, सिस्टम बंद नहीं होगा। (एक वीएम बिल्कुल उसी तरह से व्यवहार करेगा; यदि शटडाउन सिग्नल को सॉफ्टवेयर द्वारा अनदेखा किया जाता है, तो मशीन चालू रहेगी मुझे इसे बंद करने के लिए मजबूर करना होगा।) यदि मैं मशीन को फिर से शुरू करने में सक्षम होना चाहता हूं, तो मेरे पास है। पावर स्विच को वापस चालू करें और फिर ऑन / ऑफ बटन दबाएं। (कई कंप्यूटरों में सीधे स्टैंडबाय स्थिति में जाने के लिए पावर बटन के लंबे प्रेस का उपयोग करने का विकल्प होता है) लेकिन इस मॉडल को वास्तव में इसकी आवश्यकता नहीं है।) इस बटन को टॉगल स्विच की तरह माना जा सकता है क्योंकि इसे दबाने पर राज्य के आधार पर अलग-अलग व्यवहार होता है जब इसे दबाया जाता है। यदि पावर स्विच बंद है, तो इस बटन को दबाने से कुछ भी नहीं होता है।

VM के लिए, इन दोनों को बुलियन मानों को पढ़ने / लिखने के रूप में तैयार किया जा सकता है:

  • power- जब इसे बदल दिया जाता है true, तो नोट के अलावा कुछ नहीं होता है कि स्विच को इस स्थिति में रखा गया है। जब परिवर्तित किया जाता है false, तो VM को तत्काल पावर-ऑफ स्थिति में कमांड किया जाता है। पूर्णता की खातिर, यदि मूल्य एक लेखन के बाद अपरिवर्तित है, तो कुछ भी नहीं होता है।

  • onoff- जब इसे बदल दिया जाता है true, तो कुछ भी नहीं होता powerहै false, अन्यथा वीएम को शुरू करने की आज्ञा है। जब इसे बदल दिया जाता है false, तो कुछ भी नहीं होता powerहै false, अन्यथा, VM को एक व्यवस्थित शटडाउन करने के लिए सॉफ़्टवेयर को सूचित करने की आज्ञा दी जाती है, जो यह करेगा और फिर VM को सूचित करेगा कि यह पावर-ऑफ स्थिति में जा सकता है। फिर से, पूर्णता के लिए, कोई परिवर्तन नहीं लिखता है।

इस सब के साथ यह अहसास होता है कि एक स्थिति है जब मशीन की स्थिति स्विच की स्थिति को प्रतिबिंबित नहीं करती है, और यह शटडाउन के दौरान है। powerअभी भी होगा trueऔर onoffहोगा false, लेकिन प्रोसेसर अभी भी अपना शटडाउन चला रहा है, और इसके लिए हमें एक और संसाधन जोड़ने की आवश्यकता है ताकि हम बता सकें कि मशीन वास्तव में क्या कर रही है:

  • running- केवल पढ़ने के लिए मान trueजब VM चल रहा हो और falseजब वह न हो, तो अपने राज्य के लिए हाइपरविजर से पूछकर निर्धारित किया जाता है।

इसका अपडाउन यह है कि यदि आप वीएम शुरू करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि संसाधन powerऔर onoffसंसाधन निर्धारित किए गए हैं true। (आप powerइसे स्वयं-रीसेट करके चरण को छोड़ देने की अनुमति दे सकते हैं , ताकि यदि सेट किया जाए, तो falseयह trueVM के सख्ती से रोक दिए जाने के बाद हो जाता है । क्या ऐसा करने के लिए एक अन्य शुद्ध चीज़ एक और चर्चा के लिए चारा है।) आप इसे एक व्यवस्थित बंद करना चाहते हैं, तो आप सेट onoffकरने के लिए falseस्थापित करने और देखने के लिए अगर मशीन वास्तव में बंद कर दिया बाद में वापस आ, powerकरने के लिए falseकरता है, तो ऐसा नहीं किया।

वास्तविक दुनिया की तरह, आपके पास अभी भी वीएम को शुरू करने के लिए निर्देशित होने की समस्या है क्योंकि यह onoffबदल गया है, falseलेकिन अभी भी है runningक्योंकि यह बंद के बीच में है। आप उससे कैसे निपटते हैं यह एक नीतिगत निर्णय है।


0

क्या दोनों डिजाइन रेस्टफुल हैं?

इसलिए अगर आप आराम से सोचना चाहते हैं तो आज्ञाओं को भूल जाइए। क्लाइंट VM को बंद करने के लिए सर्वर को नहीं बताता है। क्लाइंट "शट्स डॉव" (रूपक रूप से बोलना) अपनी स्थिति को अपडेट करके संसाधन प्रतिनिधित्व की अपनी प्रतिलिपि बनाता है और फिर सर्वर पर उस प्रतिनिधित्व को वापस करता है। सर्वर उस नए राज्य प्रतिनिधित्व को स्वीकार करता है और इसके साइड-इफेक्ट के रूप में, वास्तव में VM को बंद कर देता है। साइड-इफेक्ट पहलू सर्वर पर छोड़ दिया जाता है।

यह कम है

अरे सर्वर, यहाँ क्लाइंट, क्या आप VM को बंद करने का मन बना लेंगे

और अधिक

अरे सर्वर, यहाँ ग्राहक, मैंने शटडाउन में संसाधन वीएम 42 की स्थिति को अपडेट किया, इस संसाधन की अपनी प्रति को अपडेट किया और फिर आपको जो उचित लगे, वह करें

इस नए राज्य को स्वीकार करने वाले सर्वर के साइड इफेक्ट के रूप में यह जांच सकता है कि वास्तव में इसे क्या कार्य करना है (जैसे कि शारीरिक रूप से VM 42 को बंद करना), लेकिन यह क्लाइंट के लिए पारदर्शी है। क्लाइंट इस नई स्थिति के अनुरूप होने के लिए सर्वर द्वारा की जाने वाली किसी भी कार्रवाई से असंबद्ध है

इसलिए आज्ञाओं को भूल जाओ। राज्य स्थानांतरण के लिए HTTP में केवल कमांड ही क्रिया हैं। क्लाइंट को पता नहीं है, और न ही यह परवाह करता है कि सर्वर भौतिक वीएम को बंद करने की स्थिति में कैसे ले जाएगा। क्लाइंट इसे प्राप्त करने के लिए सर्वर को आदेश जारी नहीं कर रहा है, यह सिर्फ यह कह रहा है कि यह नया राज्य है, इसे समझें

इस की शक्ति यह है कि यह प्रवाह नियंत्रण के संदर्भ में सर्वर से क्लाइंट को डिकॉय करता है। यदि बाद में सर्वर बदलता है कि यह वीएम के साथ कैसे काम करता है, तो क्लाइंट को कोई परवाह नहीं है अपडेट करने के लिए कोई कमांड एंडपॉइंट नहीं हैं। RPC में यदि आप API अंत बिंदु shutdownको shut-downआप से बदलते हैं, तो आपने अपने सभी क्लाइंट को तोड़ दिया है क्योंकि वे अब सर्वर पर कॉल करने की कमांड नहीं जानते हैं।

REST घोषणात्मक प्रोग्रामिंग के समान है, जहाँ आप केवल कुछ बदलने के लिए निर्देशों के एक सेट को सूचीबद्ध करने के बजाय यह बताते हैं कि आप कैसे चाहते हैं कि यह हो और प्रोग्रामिंग वातावरण इसे चित्रित करे।


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

संसाधनों, HTTP विधियों आदि का उपयोग करने के साथ कोई समस्या नहीं है। HTTP एक प्रतिष्ठित प्रोटोकॉल है। जहां एक समस्या बन जाती है, जिसे आप "एक्शन एंडपॉइंट" कहते हैं। REST में ऐसे संसाधन हैं, जो अवधारणाओं या चीज़ों (जैसे कि वर्चुअल मशीन 42, या मेरा बैंक खाता) का प्रतिनिधित्व करते हैं और HTTP क्रियाएं क्लाइंट और सर्वर के बीच इन संसाधनों की स्थिति को स्थानांतरित करने के लिए उपयोग करती हैं। बस इतना ही। आपको जो नहीं करना चाहिए, वह कोशिश करें और गैर-संसाधन समापन बिंदुओं को HTTP क्रियाओं के साथ जोड़कर नई कमांड बनाएं। तो 'virtualmachines / 42 / क्रियाएँ' एक संसाधन नहीं है और एक अस्तित्व प्रणाली में मौजूद नहीं होना चाहिए।
कॉर्मैक मुलहाल

या इसे दूसरे तरीके से रखने के लिए, क्लाइंट को सर्वर पर कमांड चलाने की कोशिश नहीं करनी चाहिए (केवल सीमित HTTP क्रियाओं से परे संसाधनों के राज्य हस्तांतरण के साथ)। क्लाइंट को संसाधन की अपनी प्रति अपडेट करनी चाहिए और फिर सर्वर से इस नए राज्य को स्वीकार करने के लिए कहना चाहिए। इस नए राज्य की स्वीकृति के दुष्प्रभाव हो सकते हैं (VM 42 शारीरिक रूप से बंद है) लेकिन यह ग्राहक की चिंता से परे है। यदि क्लाइंट सर्वर पर कमांड चलाने का प्रयास नहीं कर रहा है, तो क्लाइंट और सर्वर के बीच उन कमांड के माध्यम से कोई युग्मन नहीं है।
कॉर्मैक मुलहाल

आप संसाधन पर कमांड चला सकते हैं ... आप बैंक खाते पर "जमा" और "निकासी" कैसे कहेंगे? यह कुछ है कि CRUD नहीं है के लिए CRUD का उपयोग किया जाएगा।
कोनराड

POST /api/virtualmachines/42/shutdownकिसी भी "दुष्प्रभाव" के बजाय इसका उपयोग करना बेहतर है । एपीआई को उपयोगकर्ता के लिए समझना चाहिए, मुझे कैसे पता चलेगा कि उदाहरण के DELETE /api/virtualmachines/42लिए वीएम को बंद कर दिया जाएगा? मेरे लिए एक साइड इफेक्ट एक बग है, हमें अपने एपीआई को समझने और आत्म-वर्णनात्मक होने के लिए डिज़ाइन करना चाहिए
कोनराड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.