เหตุใดจึงใช้ REST แทนกลไกคล้าย RPC ในเว็บแอปพลิเคชัน


18

ฉันเพิ่งเริ่มต้นเมื่อเร็ว ๆ นี้ที่ บริษัท ที่ใช้เฟรมเวิร์กแบบกำหนดเองที่ค่อนข้างแปลกสำหรับเว็บแอปพลิเคชัน แทนที่จะใช้เว็บเซอร์ RESTful จะใช้กลไก RPC เพื่อสื่อสารกับเซิร์ฟเวอร์

การสื่อสารกับเซิร์ฟเวอร์ดูเหมือนจะเป็นการเรียกใช้ฟังก์ชั่นอย่างง่าย แต่ฟังก์ชั่นนั้นจะถูกดำเนินการบนเซิร์ฟเวอร์ไม่ใช่ไคลเอนต์ บนฝั่งเซิร์ฟเวอร์มีวิธีกำหนดฟังก์ชันที่ไคลเอ็นต์สามารถเรียกได้ รายละเอียดของการแปลสิ่งนี้เป็นคำขอ http ถูกแยกออกไปอย่างสมบูรณ์

ตอนนี้ฉันเพิ่งใช้ไปแค่ช่วงสั้น ๆ แต่มันก็ค่อนข้างสะดวก แต่ฉันสงสัยว่าข้อเสียของวิธีนี้คืออะไร ดูเหมือนคนอื่น ๆ จะทำมันแตกต่างกันไปซึ่งมักเป็นสัญญาณสำหรับฉันว่าฉันอาจจะทำอะไรที่โง่หรือฉลาดด้วยอัตราต่อรองที่สูงขึ้นในอดีต


5
ฉันจะเดา ( แต่ผมไม่แน่ใจ 100% ดังนั้นฉันจะออกจากนี้เป็นความคิดเห็นและให้คนที่มันรู้ว่าสิ่งที่พวกเขาโพสต์คำตอบที่เหมาะสม) ที่เหลือก็เป็นใช้มากกว่า RPC เพราะอินเตอร์เฟส REST มักจะง่ายในการดำเนินการ และขึ้นอยู่กับกรอบ / เทคโนโลยีพื้นฐานที่เฉพาะเจาะจงน้อยกว่า
FrustratedWithFormsDesigner

11
ความประทับใจของฉันคือผู้บริโภค REST ส่วนใหญ่ให้ความสนใจกับการมี http + json API อย่างง่ายมากกว่าเกี่ยวกับ REST
CodesInChaos

4
เพราะอุตสาหกรรมทั้งหมดเป็นบ้าไปแล้ว
Mike Nakis

คุณอาจสนใจstackoverflow.com/q/15056878/5934037
Laiv

1
ความเห็นที่ถกเถียง: ส่วนใหญ่ความแตกต่างระหว่าง REST และ RPC ส่วนใหญ่เป็นเรื่องทางวิชาการ
whatsisname

คำตอบ:


33

REST ได้รับการออกแบบสำหรับเว็บและเว็บได้รับการออกแบบสำหรับ REST ทั้งสองพอดีจะเข้าด้วยกัน วิทยานิพนธ์ระดับปริญญาเอก 2000 วิทยานิพนธ์ของ Roy Fielding รูปแบบสถาปัตยกรรมและการออกแบบสถาปัตยกรรมซอฟต์แวร์ที่ใช้เครือข่ายที่กำหนดและแนะนำคำว่าRESTและมีการทำงานร่วมกันอย่างมีนัยสำคัญระหว่างเว็บและ REST: Roy Fielding ทำงานกับ HTTP / 1.1 ซึ่งเขาเป็นผู้เขียนหลัก และเขาใช้สิ่งที่เขาเรียนรู้ที่นั่นเพื่ออธิบาย REST ในวิทยานิพนธ์ของเขา

ดังนั้นเหตุผลง่ายๆที่เว็บและ REST ทำงานร่วมกันได้ดีก็คือคำจำกัดความของ REST นั้นถูกแยกออกมาจากการทำงานของเว็บและเว็บเป็นการนำ REST มาใช้

นั่นเป็นสาเหตุที่ REST นั้นเหมาะสมสำหรับบริการเว็บและเว็บแอพ: เพราะคุณทำสิ่งเดียวกับที่ได้รับการพิสูจน์แล้วว่าทำงานบนเว็บ "มนุษย์" แล้วนำไปใช้กับเว็บ "เครื่องจักร"

ใหญ่มีปัญหากับ RPC (ขึ้นอยู่กับที่แน่นอนการดำเนินงาน) อยู่โดยทั่วไปในชักนำของการคำนวณแบบกระจายซึ่งมีการอธิบายในรายละเอียดในนี้เอกสารโดย Arnon Rotem-Gal-Oz :

  1. เครือข่ายมีความน่าเชื่อถือ
  2. ความหน่วงแฝงเป็นศูนย์
  3. แบนด์วิดธ์ไม่ จำกัด
  4. เครือข่ายมีความปลอดภัย
  5. โทโพโลยีไม่เปลี่ยนแปลง
  6. มีผู้ดูแลระบบหนึ่งคน
  7. ค่าขนส่งเป็นศูนย์
  8. เครือข่ายเป็นเนื้อเดียวกัน

ทั้งหมดนี้เป็นข้อสันนิษฐานที่ผู้มาใหม่มักทำเมื่อเริ่มสร้างระบบแบบกระจาย แน่นอนพวกเขาทั้งหมดเป็นเท็จ และคุณต้องคำนึงถึงสิ่งเหล่านี้ทั้งหมดเมื่อสร้างระบบแบบกระจาย

ปัญหาเกี่ยวกับการใช้งาน RPC จำนวนมากคือพวกเขาพยายามโทรระยะไกลดูเหมือนกับการโทรภายใน แต่มันก็ไม่เหมือนกัน:

  • การโทรในประเทศไม่เคยล้มเหลว ย่อยที่คุณเรียกว่าอาจจะล้มเหลว แต่การเรียกตัวเองไม่ได้ทำ - การโทรระยะไกลอาจได้รับหายไปในเครือข่าย
  • โทรในประเทศทันที ย่อยที่คุณเรียกว่าสามารถใช้งานเป็นเวลานาน (หรือแม้กระทั่งตลอดไปหากได้รับติดอยู่ในวง จำกัด ) แต่การเรียกตัวเองต้องใช้เวลาที่ทุกคน (ดีกำมือของคำแนะนำของ CPU ที่มากที่สุดน้อยกว่าถ้าโทร inlined แต่เร็วมาก ) - การโทรระยะไกลอาจค้างอยู่บนเครือข่ายเป็นเวลานาน
  • หากรูทีนย่อยกลับมาตามปกติผลลัพธ์จะกลับมาเสมอ - ด้วยการโทรระยะไกลผลลัพธ์อาจหายไปบนเครือข่าย
  • ผลตอบแทนเป็นแบบทันที - ผลลัพธ์จากระยะไกลสามารถเดินทางบนเครือข่ายเป็นเวลานาน
  • ถ้าฉันเรียกรูทีนย่อยหนึ่งครั้งมันจะทำงานอย่างแน่นอนครั้งเดียว - การโทรระยะไกลอาจหายไปในเครือข่ายหรือทำซ้ำดังนั้นรูทีนระยะไกลอาจทำงานระหว่าง 0 ถึงกี่ครั้งก็ได้
  • ฉันได้ผลลัพธ์หนึ่งรายการกลับมา - ผลลัพธ์ระยะไกลอาจสูญหายหรือทำซ้ำดังนั้นคุณอาจได้ผลลัพธ์ 0 หรือมากกว่านั้น
  • ถ้าฉันเรียกรูทีนย่อยสองครั้งฉันจะได้ผลลัพธ์สองครั้งและฉันจะได้รับผลลัพธ์ของการโทรครั้งแรกก่อนผลลัพธ์ของการโทรครั้งที่สอง - คุณอาจเดาได้ว่าตอนนี้: ด้วย RPC คุณอาจไม่ได้รับผลลัพธ์ใด ๆ หรือเฉพาะที่สองหรือที่สองก่อนที่หนึ่งหรือที่หนึ่งอาจหายไปและคุณได้รับสองครั้งหรือวิธีอื่น ๆ และอื่น ๆ ...
  • ถ้าฉันโทรaแล้วbฉันจะได้ผลลัพธ์กลับมาaและผลลัพธ์ของb - นี่เป็นรุ่นทั่วไปของจุดก่อนหน้านี้มากกว่าด้วย RPC คุณอาจได้คำตอบสองคำตอบ 0 หรือมากกว่านั้นในลำดับใดก็ได้

คุณจะต้องจัดการกับสิ่งทั้งหมดข้างต้นสำหรับการโทรระยะไกล แต่ถ้าคุณจะทำให้กรอบการโทรทางไกลแยกไม่ออกจากโทรศัพท์ในพื้นที่แล้วคุณไม่สามารถเพราะคุณไม่ทราบว่าคนที่เป็นสายระยะไกล เฟรมเวิร์กอาจลองและจัดการสิ่งเหล่านี้ให้คุณ แต่ปัญหาคือ: เฟรมเวิร์กไม่ทราบมากเกี่ยวกับระบบของคุณเท่าที่คุณทำ ไม่ทราบว่ามีการโทรที่จริง ๆ แล้วมันไม่สำคัญว่าใครจะหายไปนาน ๆ ดังนั้นกรอบจะต้องมีการป้องกันมากและมีราคาแพงในแง่ของความล่าช้าและแบนด์วิดธ์

โดยเฉพาะอย่างยิ่งเนื่องจากกรอบงานไม่สามารถป้องกันคุณได้ CAP ทฤษฎีบทบอกว่าระบบกระจายไม่สามารถที่สอดคล้องกัน, มีและ Partition ทนในเวลาเดียวกัน; มันบอกว่าเมื่อพาร์ติชั่นเกิดขึ้นระบบจะไม่สามารถดำเนินต่อไปได้ทั้งแบบต่อเนื่องและพร้อมใช้งานมันต้องเลือกอย่างใดอย่างหนึ่ง (ตรงกันข้ามกับความเชื่อที่นิยมทฤษฎีบทไม่ได้บอกว่าคุณไม่สามารถมีทั้งสามอย่างได้) โดยปกติคุณสามารถมีทั้งสามได้ แต่เมื่อคุณมีพาร์ติชั่นคุณจะต้องเลือกหนึ่งในสองอันนั้น) PACELC ทฤษฎีบทขยาย CAP ทฤษฎีบทโดยแสดงให้เห็นว่าแม้ในขณะที่ระบบมีการทำงานที่คุณต้องการปิดแฝงกับความสอดคล้อง

สิ่งเหล่านี้เป็นการแลกเปลี่ยนที่สำคัญที่เฟรมเวิร์กไม่สามารถป้องกันคุณได้เนื่องจากเป็นโดเมนเฉพาะและสำคัญต่อการออกแบบหลัก

คมชัดนี้ด้วยวิธีการเช่น Erlang ซึ่งไม่ทำงาน: ใน Erlang, ทุกข้อความส่งจะถือว่าเป็นระยะไกลถึงแม้ว่าพวกเขามีในท้องถิ่น ซึ่งหมายความว่าคุณพร้อมที่จะรับมือกับปัญหาข้างต้นทั้งหมด (และอีกมากมาย) สำหรับกระบวนการในท้องถิ่นสิ่งเหล่านี้จะก่อให้เกิดค่าใช้จ่ายเล็กน้อย เพื่อช่วยในเรื่องนี้มีเครื่องมือกรอบงานห้องสมุดรูปแบบและสำนวนที่ใช้จัดการกับข้อผิดพลาดและการกำกับดูแล

คุณยังไม่ได้อธิบายวิธีการทำงานของกรอบ RPC ของคุณโดยเฉพาะและภาษาหรือไลบรารีที่คุณใช้ แต่ฉันมีข้อสงสัยอย่างมากว่ามันเป็นของประเภท "แกล้งเครือข่ายที่ไม่มีอยู่" ในอดีต สิ่งเหล่านั้นไม่ทำงาน มันก็โอเคที่จะลบความแตกต่างระหว่างการโทรในพื้นที่และระยะไกลโดยการจัดการทุกอย่างเป็นการโทรระยะไกล การทำอย่างอื่นรอบบทคัดย่อมากเกินไป: เครือข่ายเป็นส่วนหนึ่งของระบบของคุณหากคุณทำให้เป็นนามธรรมคุณจะทำให้บางสิ่งที่คุณจำเป็นต้องรู้

ตอนนี้ไม่ว่าคุณจะต้องใช้ REST โดยเฉพาะหรือไม่นั่นเป็นคำถามที่แตกต่างอย่างสิ้นเชิง ขณะที่ผมอธิบายไว้ข้างต้นเว็บได้รับการออกแบบเพื่อการพักผ่อนและส่วนที่เหลือได้รับการออกแบบสำหรับเว็บดังนั้นทั้งสองทำทำให้ความรู้สึกร่วมกัน แต่คุณสามารถใช้รูปแบบสถาปัตยกรรมอื่น ๆ ถ้าคุณต้องการที่จะ แต่อย่างน้อยคำถามของคุณเกี่ยวกับ "ทำไมไม่ใช่ RPC" และฉันได้อธิบายเหตุผลข้างต้นฉันอธิบายได้อย่างแม่นยำมากขึ้นว่าทำไมประเภทของ RPC ที่ฉันสงสัยว่าคุณใช้อาจทำให้คุณเดือดร้อน


การทำให้เป็นมาตรฐานไม่ใช่ปัญหาด้วย (เนื่องจากไม่มีการแมป 1: 1 ระหว่าง HTTP และ RPC)
จิมมี่ต

ดีมีนักแสดงรุ่นกรอบว่าที่อยู่ทั้งหมดของปัญหาเหล่านี้
Robert Harvey

แน่นอนสิ่งที่ต้องทำคือบุคคลที่กระตือรือร้นที่จะสร้างเลเยอร์สิ่งที่เป็นนามธรรมผ่านอินเทอร์เฟซ REST และจะแยกไม่ออกจากอินเตอร์เฟส RPC อย่างรวดเร็ว
whatsisname

1
ข้อผิดพลาดอีกประการหนึ่งของการคำนวณแบบกระจาย: ไคลเอนต์และเซิร์ฟเวอร์อัพเดทในเวลาเดียวกัน
แจ็ค

@ แจ็ค: นั่นคือการเข้าใจผิดโดย "มีเพียงผู้ดูแลระบบเดียว" มันถูกกล่าวถึงในเอกสารทางเทคนิค: …
Jörg W Mittag

5

มีความคิดที่ดีหลายอย่างในความคิดเห็นซึ่งฉันจะทำซ้ำที่นี่:

  1. RPC เป็นเทคโนโลยีเฉพาะ
  2. สิ่งที่นักพัฒนาส่วนใหญ่ให้ความสนใจคือ JSON ไม่ใช่ REST

JSON มีคุณสมบัติที่ดีมาก มันเป็นเรื่องง่ายที่ง่ายสำหรับมนุษย์ที่จะอ่านง่ายสำหรับคอมพิวเตอร์ที่จะแยกและ Javascript ทันทีจำได้ว่ามันกำเนิด (มันเป็น y รู้Javascriptสัญกรณ์วัตถุ)

หากคุณยินดีที่จะสละข้อ จำกัด เช่น REST คุณสามารถทำเกือบทุกอย่างที่คุณต้องการด้วย JSON รวมถึงการเรียกขั้นตอนระยะไกล สิ่งที่คุณต้องทำคือสร้างโปรโตคอลที่เหมาะสม ในความเป็นจริงโปรโตคอลดังกล่าวมีอยู่แล้ว: JSON-RPC

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

-1

RPC และ REST เป็นเพียงแนวทางที่แตกต่างกับข้อดีข้อเสียและทั้งสองมีค่าขึ้นอยู่กับบริบท REST ได้รับการอธิบายที่ดีที่สุดในการทำงานกับทรัพยากรโดยที่ RPC เป็นมากกว่าเกี่ยวกับการกระทำ ลูกค้า RPC ผนวกกับการติดตั้งใช้งานบริการในหลายวิธีอย่างแน่นหนาและเป็นการยากที่จะเปลี่ยนการใช้งานบริการโดยไม่ทำลายลูกค้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.