2008-10-07 7 views
7

मेरी स्थिति निम्नानुसार है:एक साबुन सेवा (जेनेरिक बनाम विशिष्ट ऑपरेशन) को परिभाषित करने में सबसे अच्छा अभ्यास क्या है?

मेरे पास एक सामान्य डेटाबेस है, जिसमें मुझे हवाई अड्डे के बारे में भौगोलिक जानकारी है। संरचना है:

airport --is in--> city --is in--> country --is in--> continent 

अब मैं उपयोगकर्ताओं को डेटाबेस तक सीधे पहुंच प्रदान किए बिना इस डेटा को प्रशासित करने देना चाहता हूं। हमें एक वेब सेवा के माध्यम से इस प्रशासन इंटरफ़ेस की पेशकश करने की आवश्यकता है।

अब, जब सेवा को डिजाइन करने की बात आती है, तो हम संचालन को परिभाषित करने के तरीके के बारे में चर्चा में भाग गए।

समाधान एक:: हम विभिन्न समाधान के साथ आया था विशिष्ट कार्यों

चार टेबल के प्रत्येक (हवाई अड्डे, शहर, देश, महाद्वीप) के लिए हम 3 आपरेशनों को परिभाषित:

  • डालने
  • मिल
  • अद्यतन

इससे 12 अनुरोधों के साथ 2 अनुरोध/प्रतिक्रिया ऑब्जेक्ट्स = 24 ऑब्जेक्ट्स

सभी निर्भरताओं के साथ एक नया हवाई अड्डा बनाने के लिए, कम से कम 4 अनुरोध आवश्यक होंगे।

समाधान बी: ​​सामान्य

केवल एक ऑपरेशन है, जो मानकों के माध्यम से नियंत्रित किया जाता है नहीं है। यह ऑपरेशन डेटाबेस को प्रशासित करने के लिए आवश्यक सब कुछ बनाने में सक्षम है।

ऑपरेशन यह तय करेगा कि क्या करने की आवश्यकता है और इसे निष्पादित किया जाना चाहिए। अगर कोई त्रुटि आती है, तो यह सबकुछ वापस ले जाएगी।

==> 1 ऑपरेशन = 2 अत्यधिक जटिल अनुरोध/प्रतिक्रिया-वस्तुओं

समाधान सी: तालिका के अनुसार मध्य 1

एक सामान्य ऑपरेशन है, जो मिल को क्रियान्वित करने में सक्षम है, डालने में मिलो , समाधान बी की तरह अद्यतन करें, लेकिन प्रत्येक एक टेबल पर केंद्रित है।

==> 4 संचालन = 8 जटिल अनुरोध/प्रतिक्रिया-वस्तुओं

समाधान डी: कार्रवाई प्रति बीच 2

एक सामान्य ऑपरेशन में मिलो (मिल, सम्मिलित करने, हटाने) है, जो कर सकते हैं प्रत्येक तालिका पर काम करें और निर्भरताओं को हल करें।

==> 3 संचालन = 6 से थोड़ा अधिक जटिल अनुरोध/प्रतिक्रिया-वस्तुओं

उदाहरण

के बाद से इस बल्कि सार, था hier बनाने (जेएफके/नई के लिए अनुरोध-वस्तुओं के लिए एक सरल उदाहरण न्यूयॉर्क/अमरीका/उत्तर अमेरिका):

समाधान एक:

अनुरोध 1/4:

+०१२३५१६४१०६१
<insertContinent>North America</insertContinent> 

अनुरोध 2/4:

<insertCountry continent="North America">USA</insertCountry> 

अनुरोध 3/4:

<insertCity country="USA">New York</insertCity> 

अनुरोध 4/4:

<insertAirport city="New York">JFK</insertAirport> 

समाधान बी: ​​

अनुरोध 1/1:

<action type="insertCountry" parent="North America">USA</action> 
<action type="insertAirport" parent="New York">JFK</action> 
<action type="insertContinent" parent="">North America</action> 
<action type="insertCity" parent="USA">New York</action> 

समाधान सी:

अनुरोध 1/4:

<countryAction type="insert" parent="North America">USA</countryAction> 

अनुरोध 2/4:

<airportAction type="insert" parent="New York">JFK</airportAction> 

अनुरोध 3/4:

<continentAction type="insert" parent="">North America</continentAction > 

अनुरोध 4/4:

<cityAction type="insert" parent="USA">New York</cityAction > 

समाधान डी: अनुरोध 1/1:

<insert airport="JFK" city="New York" country="USA" continent="North America" /> 

समाधान डी बल्कि मेरे लिए सुरुचिपूर्ण लगता है, इसलिए मैं इस डालने की कोशिश की एक्सएसडी में:

कोड:

<complexType name="NewContinent"> 
    <sequence> 
     <element name="NAME" type="string"></element> 
    </sequence> 
</complexType> 

<complexType name="NewCountry"> 
    <sequence> 
     <element name="ISOCODE" type="string"></element> 
     <element name="NAME" type="string"></element> 
     <choice> 
      <element name="newCONTINENT" type="tns:NewContinent"></element> 
      <element name="CONTINENT" type="string"></element> 
     </choice> 
    </sequence> 
</complexType> 

<complexType name="NewCity"> 
    <sequence> 
     <element name="IATA" type="string"></element> 
     <element name="NAME" type="string"></element> 
     <choice> 
      <element name="COUNTRY" type="string"></element> 
      <element name="newCOUNTRY" type="tns:NewCountry"></element> 
     </choice> 
    </sequence> 

</complexType> 

<complexType name="NewAirport"> 
    <sequence> 
     <element name="IATA" type="string"></element> 
     <element name="NAME" type="string"></element> 
     <choice> 
      <element name="CITY" type="string"></element> 
      <element name="newCITY" type="tns:NewCity"></element> 
     </choice> 
    </sequence> 

</complexType> 

एक इसी अनुरोध तो कैसा लगेगा इस प्रकार है:

<complexType name="Request"> 
    <choice> 
     <element name="AIRPORT" type="tns:NewAirport"></element> 
     <element name="CITY" type="tns:NewCity"></element> 
     <element name="COUNTRY" type="tns:NewCountry"></element> 
     <element name="CONTINENT" type="tns:NewContinent"></element> 
    </choice> 
</complexType> 

अब मेरे सवाल: यह वास्तव में सबसे अच्छा समाधान उपलब्ध है? क्या एक्सएसडी समझने के लिए पर्याप्त है, क्या चल रहा है?

उत्तर

5

संभवतः आप एक प्रोटोकॉल परत लिख रहे हैं जो आपके अलग-अलग संदेश प्रकारों को समझ पाएगा। संदेश की सामग्री को पार्स करने के लिए आपको एक एप्लिकेशन लेयर की भी आवश्यकता होगी। आपके द्वारा बताए गए विभिन्न दृष्टिकोण इन दो परतों के बीच पार्सिंग के बोझ को बदल देंगे।तो उदाहरण के लिए:

समाधान ए: प्रोटोकॉल परत सभी पार्सिंग करता है और डेटा और कमांड देता है। एप्लिकेशन परत डेटा का उपयोग कर सकते हैं। इसे आरपीसी पैटर्न के रूप में भी जाना जाता है।

पेशेवर: आप अपने संदेशों को प्रमाणित कर सकते हैं। आप सीधे संदेश कॉल पर संदेशों को मैप कर सकते हैं।

विपक्ष: यदि आपको इंटरफ़ेस में बदलाव करने की आवश्यकता है, तो आपका प्रोटोकॉल बदल जाता है।

समाधान बी: प्रोटोकॉल परत दो मान और एक कमांड देता है। अनुप्रयोग परत को मानों को प्रकारों में पार्स करने के लिए कमांड का उपयोग करना चाहिए।

पेशेवर: प्रोटोकॉल कभी नहीं बदलता है।

विपक्ष: आप संदेशों को मान्य नहीं कर सकते हैं। आपका आवेदन कोड अधिक जटिल है।

समाधान सी: प्रोटोकॉल परत दो ज्ञात प्रकार और एक आदेश को पारित किया जाना चाहिए जिसे पार्स किया जाना चाहिए। एप्लिकेशन लेयर केवल कमांड को पार्स कर सकता है और डेटा का उपयोग कर सकता है।

पेशेवर: मैं किसी के बारे में नहीं सोच सकता, ऐसा लगता है कि यह बहुत अच्छा समझौता नहीं है।

विपक्ष: पार्सिंग केवल आंशिक रूप से किया जाता है।

समाधान डी: प्रोटोकॉल परत ज्ञात प्रकार (जिस तरह से आपने इसे कार्यान्वित किया) और एक सामान्य आदेश देता है। एप्लिकेशन लेयर को प्राप्त होने वाले डेटा को देखना चाहिए और जेनेरिक कमांड को एक विशिष्ट कमांड में कनवर्ट करना चाहिए। यह आरईएसटी वास्तुकला के समान है।

पेशेवर: कॉल अलग-अलग ऑपरेशन होते हैं ताकि आप उदाहरण के लिए कैश प्रतिक्रिया प्राप्त कर सकें।

विपक्ष: अनुप्रयोग परत

बाकी मॉडल में जटिलता आम तौर पर अलग ढंग से कार्यान्वित किया जाता है की तुलना में आप रेखांकित किया है। यह HTTP GET, POST, PUT का उपयोग करता है, मनमानी दस्तावेज़ों को संवाद करने के लिए संदेशों को हटा देता है। पैरामीटर यूआरएल के हिस्से के रूप में दिए जाते हैं। उदाहरण के लिए:

<insert airport="JFK" city="New York" country="USA" continent="North America" /> 

<insert URL="airport?city=Chicago">ORD</insert> 

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

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

व्यक्तिगत रूप से मैं कुछ आरईएसटी-पूर्ण विशेषताओं के साथ आरपीसी शैली (समाधान ए) पसंद करता हूं। मैं प्रोटोकॉल को पार्सिंग काम करना चाहता हूं और संदेशों को प्रमाणित करना चाहता हूं। यह आम तौर पर लोग एसओएपी वेब सेवा इंटरफेस को कैसे लागू करते हैं।

आपका इंटरफ़ेस आज आसान लग सकता है लेकिन कल आपके एक ग्राहक आपको एक नए कॉल के लिए पूछने जा रहा है जो आरईएसटी मॉडल को इतना अच्छी तरह से फिट नहीं करता है और आप इसे अपने मौजूदा चार संदेशों में wedging पाएंगे।

1

यह एक पुराना सवाल है, और मुझे यकीन है कि सेवा बहुत समय पहले लिखी गई है, लेकिन मैं वैसे भी एक जवाब देना चाहता था।

RESTful दृष्टिकोण इस जैसे, एक हवाई अड्डे संसाधन परिभाषित करने के लिए किया जाएगा:

<airport href="/airports/JFK"> 
    <name>JFK</name> 
    <city>New York</city> 
    <country>USA</country> 
    <continent>North America</continent> 
</airport> 

या, आप एक ब्राउज़र संगत माइक्रोफ़ॉर्मेट उपयोग करना चाहते हैं:

<div class="object airport" href="/airports/JFK"> 
    <ul class="attributes"> 
     <li class="name">JFK</li> 
     <li class="city">New York</li> 
     <li class="country">USA</li> 
     <li class="continent">North America</li> 
    </ul> 
</div> 

इस संसाधन होगा /airports/JFK जैसे यूआरआई में स्थित है, जिसे GET विधि से पुनर्प्राप्त किया जाएगा, PUT विधि के साथ अपडेट किया गया है, और DELETE विधि के साथ हटा दिया गया है।

इस तरह की एक डिजाइन में, यूआरआई /airports/ डेटाबेस में हवाई अड्डों में से सभी के लिए एक कंटेनर संसाधन का प्रतिनिधित्व करते हैं, और /airports/?city=New+York और /airports/?country=USA तरह यूआरआई कंटेनर पर फिल्टर हवाई अड्डों में से एक सबसेट वापस जाने के लिए किया जाएगा। इनमें से दोनों GET विधियां होंगी, और संसाधनों में ऊपर परिभाषित अनुसार एयरपोर्ट संसाधनों की एक सूची होगी, या तो पूर्ण (क्योंकि वे छोटे हैं) या कुछ उपयोगी विशेषताओं और href जो प्रत्येक हवाई अड्डे के लिए पूर्ण संसाधन को इंगित करती हैं ।

अंत में, एक नया संसाधन जोड़ना हवाई अड्डे के पूर्ण यूआरआई पर PUT विधि या विधि /airports/ पर विधि हो सकता है। दोनों मामलों में अनुरोध के निकाय ऊपर दिखाए गए अनुसार हवाईअड्डा संसाधन है। विधियों के बीच का अंतर यह है कि हवाई अड्डे के लिए अंतिम यूआरआई तय करने के लिए कौन सा होता है: ग्राहक PUT का निर्णय लेता है और सेवा POST के लिए निर्णय लेती है। आप जो भी उपयोग करते हैं, इस पर निर्भर करता है कि क्या आपके ग्राहक सही यूआरआई को उचित रूप से निर्धारित कर सकते हैं या नहीं। आम तौर पर सेवा निर्णय लेती है क्योंकि यूआरआई में एक संख्यात्मक अद्वितीय पहचानकर्ता होता है और सेवा को चुनना होता है।

अब निश्चित रूप से आपका मूल प्रश्न SOAP के बारे में था, आरईएसटी नहीं। मैं आगे बढ़ूंगा और जैसा कि मैंने वर्णन किया है, एक रीस्टफुल डिज़ाइन स्थापित किया है, फिर एक्सएसडी और एसओएपी सेवा का उपयोग करके जटिल संसाधनों के रूप में मेरे संसाधनों का वर्णन करें जो GET, PUT, DELETE, और POST रीस्टफुल सेवा के संचालन को डुप्लिकेट करते हैं। यह आपको आरपीसी समकक्ष देगा:

class Airport 
    has String name 
    has String city 
    has String country 
    has String continent 
    method void update(name, city, country, continent) 
    method void delete() 

class AirportList 
    method Airport[] get(opt name, opt city, opt country, opt continent) 
    method void add(name, city, country, continent) 
संबंधित मुद्दे

 संबंधित मुद्दे