การโทรแบบอะซิงโครนัสจำนวนมากเทียบกับการโทรครั้งเดียวไปยัง API


12

เรากำลังพัฒนา REST API ซึ่งส่วนอื่น ๆ จะถูกใช้โดยส่วนหน้า HTML5 ผ่านทางจาวาสคริปต์ แอปพลิเคชันมีไว้สำหรับใช้ภายในองค์กรและมักจะมีผู้ใช้ประมาณ 300 คน แต่เราต้องการที่จะขยายผู้ใช้ให้ได้มากถึง 1,000 คน

โดยทั่วไปแล้วการเชื่อมต่อกับ API จะทำภายใน LAN ดังนั้นคุณภาพและเวลาแฝงของการเชื่อมต่อจะดีแม้ว่าจะไม่ได้ยกเว้นการใช้งานผ่านอินเทอร์เน็ตเป็นครั้งคราวซึ่งการเชื่อมต่ออาจช้าลงและมีความล่าช้ามากขึ้นผ่านทาง 3G / 4G

ตัวเลือกสองตัวที่เราคิดคือ:

  1. ส่วนหน้าจะทำการเรียกใช้แบบอะซิงโครนัสพร้อมกันหลายครั้งเพื่อโหลดส่วนประกอบต่าง ๆ ของอินเทอร์เฟซ

    • จุดเด่น: เรียบง่าย
    • จุดด้อย: การเชื่อมต่อกับเซิร์ฟเวอร์มากขึ้น
  2. ตัวควบคุมของส่วนหน้าจะทำการเรียก API ผ่านครั้งเดียวเป็นพารามิเตอร์ที่ต้องดึงข้อมูลวัตถุ

    • ข้อดี: มีการเชื่อมต่อกับเซิร์ฟเวอร์เพียงครั้งเดียวแม้ว่าเซิร์ฟเวอร์จะทำการเชื่อมต่อกับฐานข้อมูลหลายครั้ง
    • ข้อด้อย: ต้องใช้กลไกทั้งในส่วนหน้าและ API มันซับซ้อนการออกแบบ

คำอธิบายเพิ่มเติม: จะมีทรัพยากรที่แตกต่างกัน ... / ผลิตภัณฑ์ ... / ที่ตั้ง ฯลฯ ทรัพยากรเหล่านี้สามารถดึงข้อมูลได้เพียงอย่างเดียว แต่จะมีทรัพยากรที่เป็นนามธรรม ... / หน้าจอผลิตภัณฑ์และตำแหน่งที่จะดึงทั้งสองในการโทรครั้งเดียว

คำตอบ:


14

ตัวเลือก 1 (การโทรแบบหลายสาย) เป็นตัวเลือกที่ดีที่สุดเพราะ:

  1. การโทรแต่ละครั้งเป็นเอนทิตีของตนเองดังนั้นคุณสามารถลองใหม่ทีละรายการหากมีบางอย่างเกิดขึ้นล้มเหลว ในสถาปัตยกรรมแบบ 'โทรออกครั้งเดียว' หากสิ่งหนึ่งล้มเหลวคุณจะต้องทำการโทรทั้งหมดอีกครั้ง
  2. รหัสฝั่งเซิร์ฟเวอร์จะง่ายขึ้น: อีกครั้งแบบแยกส่วนหมายความว่านักพัฒนาที่แตกต่างกันสามารถทำงานกับทรัพยากร API ที่แตกต่างกัน
  3. ในรูปแบบ MVC ทั่วไปก็ไม่ได้ทำให้ความรู้สึกที่จะมีหนึ่งเรียก API โหลดหลายแยกต่างหากทรัพยากร ; ตัวอย่างเช่นถ้าคุณส่งคำขอไปยัง/productsที่จะได้รับรายชื่อของผลิตภัณฑ์ที่จะแสดงบนหน้าเว็บและคุณยังต้องการที่จะแสดงรายการของสถานที่ที่ผลิตภัณฑ์ที่นิยมจะขายคุณมีสองแหล่งข้อมูลที่แยกต่างหาก: และProduct Locationแม้ว่าจะปรากฏในหน้าเดียวกัน แต่คุณไม่สามารถโทรออกได้อย่างเป็นเหตุเป็นผล/productsและส่งคืนตำแหน่งด้วยเช่นกัน
  4. รายงานการบันทึก / การใช้ประโยชน์ของคุณจะง่ายขึ้นในแนวทางแบบแยกส่วน ถ้าคุณทำการร้องขอ/productsและคุณกำลังโหลดตำแหน่งที่ตั้งแฟ้มบันทึกของคุณจะสับสนจริง ๆ
  5. หากคุณมีปัญหาเกี่ยวกับแหล่งข้อมูลเฉพาะวิธีการโทรออกครั้งเดียวจะทำให้ทั้งเพจหยุดทำงานและจะไม่ปรากฏแก่ผู้ใช้ของคุณว่าอะไรเสียหาย- และนั่นหมายความว่าทีมของคุณจะใช้เวลาในการแก้ไขปัญหานานขึ้น อย่างไรก็ตามในวิธีการแยกส่วนหากมีสิ่งใดแตกหักจะเห็นได้ชัดว่าอะไรที่แตกและคุณสามารถแก้ไขได้เร็วขึ้น และจะไม่ทำลายส่วนที่เหลือของหน้าเว็บ (เว้นแต่จะมีการเชื่อมโยงอย่างใกล้ชิดเกินไปกับ ... )
  6. มันจะง่ายกว่าถ้าทำการเปลี่ยนแปลงโดยทั่วไปหากสิ่งต่าง ๆ ถูกแยกออก หากคุณมีทรัพยากร 5 รายการที่ถูกโหลดด้วยการเรียก API หนึ่งครั้งจะเป็นการยากที่จะทราบว่าจะไม่แบ่งสิ่งต่าง ๆ อย่างไรเมื่อคุณต้องการเปลี่ยนบางสิ่ง

ประเด็นทั้งหมดคือทรัพยากรแยกออกจากกันและใน REST API จะส่งคืนทรัพยากรที่แยกต่างหากจำนวนมากจากเส้นทาง API เดียวไม่สมเหตุสมผลแม้ว่าคุณจะ "กำลังบันทึกการเชื่อมต่อไปยังเซิร์ฟเวอร์" โดยวิธีการใช้พารามิเตอร์เพื่อโหลดทรัพยากร (แตกต่างกัน) ตามเงื่อนไขไม่สงบ

ทั้งหมดที่กล่าวว่าตัวเลือกเชิงตรรกะเท่านั้นคือการร้องขอ async หลายครั้งเพื่อแยกทรัพยากร: ใช้แนวทางแบบแยกส่วน !

PS - อย่าปรับ "การเชื่อมต่อไปยังเซิร์ฟเวอร์" ล่วงหน้าโดยเฉพาะอย่างยิ่งเมื่อการเชื่อมต่อ HTTP มีค่าใช้จ่ายต่ำอย่างไม่น่าเชื่อและคุณใช้ LAN การคิดแบบนั้นแทนที่จะเลือกการออกแบบที่เรียบง่ายออกไปจากค้างคาวจะทำให้คุณมีปัญหาในภายหลัง


1
นอกจากนี้โมดูลาร์มีแนวโน้มที่จะง่ายต่อการทดสอบหน่วย
user949300

@ user949300 จุดดีฉันไม่ได้คิดอย่างนั้น! การทดสอบหน่วยในความเป็นจริงจะง่ายขึ้นมากถ้าสิ่งที่แยกได้
Chris Cirefice

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

@mattinsalto วิธีการ/screen?Product&Locationsเป็นวิธีที่ไม่ดีอย่างน้อยก็ด้วยประสบการณ์ทั้งหมดที่ฉันได้พัฒนา REST API และเว็บแอปที่ใช้พวกเขา จากมุมมองเสาหินบริสุทธิ์ (เช่นใน Ruby on Rails) การมีเส้นทางไปยัง/screenที่โหลดทั้งสองProductและLocationทรัพยากรนั้นดีมาก อย่างไรก็ตามจากมุมมองRESTคุณจะไม่ต้องการให้เส้นทางโหลดมากกว่าหนึ่ง (ยกเว้นว่าคุณกำลังเข้าร่วมตารางเพื่อรับข้อมูลเพิ่มเติมพร้อมกัน) สิ่งที่/screenควรทำคือโหลดหน้าเลย์เอาต์พื้นฐานและคุณ AJAX API ของคุณเพื่อรับข้อมูล ( Product, Locationและอื่น ๆ )
Chris Cirefice

@mattinsalto หากคุณกำลังพัฒนา REST API เพื่อใช้ในเว็บแอป (รวมถึงสิ่งอื่น ๆ ) คุณจะต้องมุ่งเน้นไปที่ข้อมูลและลดการใช้ข้อมูลของแอป REST API ควรสนับสนุนการดำเนินงานขั้นพื้นฐาน (ตามที่คุณต้องการ) สำหรับแต่ละทรัพยากร จากนั้นคุณapp เว็บจะทำในการโหลดของทรัพยากรทั้งหมดที่จำเป็นสำหรับหน้าใดก็ตาม (เช่น/screenจะอาแจ็กซ์HTTP GETไป/products/popularและ/locations) API ของคุณไม่ควรทำงานหลายอย่างเนื่องจากไม่น่าเป็นไปได้ที่คุณจะแสดงข้อมูลในลักษณะเดียวกับเว็บแอปและ Android
Chris Cirefice
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.