แต่นั่นสำคัญจริงๆเหรอ? พิจารณาว่า UI ต้องทำการเรียกเครือข่ายไปยัง API มันค่อนข้างใหญ่ (ลำดับความสำคัญเป็นมิลลิวินาที) ฐานข้อมูลได้รับการปรับให้เหมาะสมเพื่อเก็บสิ่งต่าง ๆ ในหน่วยความจำและดำเนินการอ่านอย่างรวดเร็ว (เช่น SQL Server โหลดและเก็บทุกอย่างไว้ใน RAM และใช้ RAM ฟรีของคุณเกือบทั้งหมดถ้าทำได้)
ลอจิก
ในทางทฤษฎีคุณถูกต้อง อย่างไรก็ตามมีข้อบกพร่องเล็กน้อยด้วยเหตุผลนี้:
จากสิ่งที่คุณระบุไว้มันไม่ชัดเจนถ้าคุณทดสอบ / ทำโปรไฟล์แอปของคุณ คุณรู้จริงไหมว่าการถ่ายโอนเครือข่ายจากแอพไปยัง API นั้นเป็นส่วนประกอบที่ช้าที่สุด? เพราะนั่นคือสัญชาตญาณมันง่ายที่จะคิดว่ามันเป็น อย่างไรก็ตามเมื่อพูดถึงประสิทธิภาพคุณไม่ควรคาดคิด ที่นายจ้างของฉันฉันเป็นผู้นำในการแสดง เมื่อฉันเข้าร่วมครั้งแรกผู้คนยังคงพูดถึงเรื่องของ CDN การจำลองแบบและอื่น ๆ โดยอิงตามสัญชาตญาณว่าคอขวดต้องเป็นอย่างไร ปรากฎว่าปัญหาด้านประสิทธิภาพที่ใหญ่ที่สุดของเราคือการสืบค้นฐานข้อมูลไม่ดี
คุณกำลังพูดว่าเนื่องจากฐานข้อมูลดีในการดึงข้อมูลฐานข้อมูลนั้นจำเป็นต้องทำงานที่ประสิทธิภาพสูงสุดกำลังถูกใช้อย่างเหมาะสมและไม่มีอะไรที่สามารถทำได้เพื่อปรับปรุง กล่าวอีกนัยหนึ่งฐานข้อมูลถูกออกแบบมาให้รวดเร็วดังนั้นฉันไม่ควรกังวลเกี่ยวกับมัน อีกหนึ่งบรรทัดอันตรายของการคิด นั่นเหมือนกับการบอกว่ารถยนต์ตั้งใจจะเคลื่อนที่อย่างรวดเร็วดังนั้นฉันจึงไม่จำเป็นต้องเปลี่ยนน้ำมันเครื่อง
วิธีคิดนี้ถือว่าเป็นกระบวนการเดียวในแต่ละครั้งหรือทำอย่างอื่นโดยไม่มีการทำงานพร้อมกัน สันนิษฐานว่าคำขอหนึ่งไม่สามารถมีอิทธิพลต่อประสิทธิภาพของคำขออื่น มีการแชร์ทรัพยากรเช่นดิสก์ I / O แบนด์วิดท์เครือข่ายพูลการเชื่อมต่อหน่วยความจำรอบการทำงานของ CPU ฯลฯ ดังนั้นการลดการใช้ฐานข้อมูลร่วมของการโทรฐานข้อมูลหนึ่งครั้งสามารถป้องกันไม่ให้เกิดการร้องขออื่น ๆ เมื่อฉันเข้าร่วมนายจ้างปัจจุบันของฉันครั้งแรกฝ่ายบริหารเชื่อว่าการปรับการสืบค้นฐานข้อมูล 3 วินาทีนั้นเป็นการเสียเวลา 3 วินาทีมีน้อยมากทำไมต้องเสียเวลากับมัน เราจะไม่ดีกว่าด้วย CDN หรือการบีบอัดหรืออย่างอื่นหรือ แต่ถ้าฉันสามารถสร้างคิวรี 3 วินาทีใน 1 วินาทีพูดโดยเพิ่มดัชนีนั่นคือการบล็อกน้อยลง 2/3 ใช้เวลาน้อยลง 2/3 ใช้เธรดและที่สำคัญยิ่งอ่านข้อมูลจากดิสก์น้อยลง
ทฤษฎี
มีความคิดเหมือนกันคือประสิทธิภาพการทำงานของซอฟแวร์เป็นเพียงเกี่ยวกับความเร็ว
จากมุมมองของความเร็วที่แท้จริงคุณพูดถูก ระบบนั้นเร็วเท่ากับส่วนประกอบที่ช้าที่สุดเท่านั้น หากคุณได้ทำโปรไฟล์ของคุณและพบว่าอินเทอร์เน็ตเป็นองค์ประกอบที่ช้าที่สุดแล้วทุกอย่างอื่นนั้นไม่ได้เป็นส่วนที่ช้าที่สุด
อย่างไรก็ตามตามที่กล่าวไว้ข้างต้นฉันหวังว่าคุณจะเห็นว่าการช่วงชิงทรัพยากรการขาดการจัดทำดัชนีรหัสที่เขียนไม่ดี ฯลฯ สามารถสร้างความแตกต่างที่น่าประหลาดใจในประสิทธิภาพได้อย่างไร
สมมติฐาน
สิ่งสุดท้าย. คุณกล่าวว่าการโทรฐานข้อมูลควรถูกเมื่อเปรียบเทียบกับการโทรผ่านเครือข่ายจากแอปไปยัง API แต่คุณยังกล่าวถึงแอพและเซิร์ฟเวอร์ API ที่อยู่ใน LAN เดียวกัน ดังนั้นจึงไม่สามารถเปรียบเทียบได้ทั้งคู่กับการโทรผ่านเครือข่าย กล่าวอีกนัยหนึ่งทำไมคุณสมมติว่าการถ่ายโอน API เป็นคำสั่งที่มีขนาดช้ากว่าการถ่ายโอนฐานข้อมูลเมื่อทั้งคู่มีแบนด์วิดท์ที่พร้อมใช้งานเท่ากัน? แน่นอนว่าโปรโตคอลและโครงสร้างข้อมูลนั้นแตกต่างกันฉันเข้าใจแล้ว แต่ฉันโต้แย้งว่าพวกเขามีขนาดต่างกัน
สถานที่ที่จะได้รับ murkey
คำถามทั้งหมดนี้เกี่ยวกับการเรียกฐานข้อมูล "หลาย" กับ "เดี่ยว" แต่มันไม่ชัดเจนว่ามีหลายเท่า เนื่องจากสิ่งที่ฉันพูดข้างต้นตามกฎทั่วไปแล้วฉันขอแนะนำให้ทำการโทรฐานข้อมูลน้อยตามที่จำเป็น แต่นั่นเป็นเพียงกฎของหัวแม่มือ
นี่คือเหตุผล:
- ฐานข้อมูลดีเยี่ยมในการอ่านข้อมูล พวกเขาเป็นเครื่องมือเก็บข้อมูล อย่างไรก็ตามตรรกะทางธุรกิจของคุณอาศัยอยู่ในแอปพลิเคชันของคุณ หากคุณสร้างกฎที่การเรียก API ทุกครั้งจะทำให้เกิดการเรียกฐานข้อมูลหนึ่งครั้งตรรกะธุรกิจของคุณอาจสิ้นสุดลงในฐานข้อมูล อาจจะไม่เป็นไร ระบบจำนวนมากทำเช่นนั้น แต่บางคนทำไม่ได้ มันเกี่ยวกับความยืดหยุ่น
- บางครั้งเพื่อให้ได้การถอดรหัสที่ดีคุณต้องแยกการเรียกฐานข้อมูลออกเป็น 2 ตัวอย่างเช่นบางทีคำขอ HTTP ทุกครั้งจะถูกส่งผ่านตัวกรองความปลอดภัยทั่วไปซึ่งตรวจสอบจากฐานข้อมูลที่ผู้ใช้มีสิทธิ์การเข้าถึงที่ถูกต้อง หากเป็นเช่นนั้นให้ดำเนินการตามหน้าที่ที่เหมาะสมสำหรับ URL นั้น ฟังก์ชันนั้นอาจโต้ตอบกับฐานข้อมูล
- การเรียกฐานข้อมูลในลูป นี่คือเหตุผลที่ฉันถามว่ามีหลายรายการ ในตัวอย่างข้างต้นคุณจะมีการโทรฐานข้อมูล 2 ครั้ง 2 ใช้ได้ 3 อาจไม่เป็นไร เอ็นไม่ดี ถ้าคุณเรียกใช้ฐานข้อมูลในลูปตอนนี้คุณได้สร้างประสิทธิภาพเชิงเส้นซึ่งหมายความว่ามันจะใช้เวลานานกว่าที่อยู่ในอินพุตของลูป ดังนั้นการบอกว่าเวลาเครือข่าย API ช้าที่สุดอย่างสมบูรณ์ที่สุดสามารถมองเห็นความผิดปกติเช่น 1% ของปริมาณการใช้งานของคุณใช้เวลานานเนื่องจากการวนรอบที่ยังไม่ได้ค้นพบที่เรียกฐานข้อมูล 10,000 ครั้ง
- บางครั้งมีสิ่งต่าง ๆ ที่แอปของคุณดีกว่าเช่นการคำนวณที่ซับซ้อน คุณอาจจำเป็นต้องอ่านข้อมูลบางส่วนจากฐานข้อมูลทำการคำนวณบางอย่างจากนั้นส่งผลลัพธ์ให้พารามิเตอร์ผ่านการเรียกฐานข้อมูลตัวที่สอง (อาจจะเขียนผลลัพธ์บางส่วน) หากคุณรวมสิ่งเหล่านั้นไว้ในการโทรครั้งเดียว (เช่นขั้นตอนการจัดเก็บ) เพียงเพื่อเรียกฐานข้อมูลเพียงครั้งเดียวคุณได้บังคับให้คุณใช้ฐานข้อมูลสำหรับสิ่งที่เซิร์ฟเวอร์แอปอาจทำได้ดีกว่า
- โหลดบาลานซ์: คุณมี 1 ฐานข้อมูล (สมมุติ) และโหลดแอ็พพลิเคชันเซิร์ฟเวอร์หลายโหลด ดังนั้นยิ่งแอปทำงานได้มากเท่าไหร่ฐานข้อมูลก็ยิ่งน้อยเท่านั้นยิ่งปรับขนาดได้ง่ายขึ้นเพราะโดยทั่วไปแล้วการเพิ่มแอพเซิร์ฟเวอร์ก็ง่ายกว่าการจำลองแบบฐานข้อมูลการตั้งค่า ขึ้นอยู่กับสัญลักษณ์แสดงหัวข้อก่อนหน้ามันอาจทำให้เหมาะสมในการเรียกใช้แบบสอบถาม SQL จากนั้นทำการคำนวณทั้งหมดในแอปพลิเคชันซึ่งกระจายไปทั่วหลายเซิร์ฟเวอร์แล้วเขียนผลลัพธ์เมื่อเสร็จสิ้น วิธีนี้จะให้ปริมาณงานที่ดีขึ้น (แม้ว่าเวลาธุรกรรมโดยรวมจะเท่ากัน)
TL; DR
TLDR: เป็นเรื่องสำคัญหรือไม่ที่จะต้องกังวลเกี่ยวกับการโทรฐานข้อมูลหลายครั้งเมื่อเราทำการโทรผ่านเครือข่ายผ่าน LAN หรือไม่? ถ้าเป็นเช่นนั้นทำไม
ใช่ แต่เพียงในระดับหนึ่ง คุณควรพยายามลดจำนวนการโทรของฐานข้อมูลเมื่อใช้งานได้จริง แต่อย่ารวมการโทรที่ไม่มีส่วนเกี่ยวข้องเข้าด้วยกันเพียงเพื่อรวมเข้าด้วยกัน นอกจากนี้หลีกเลี่ยงการเรียกฐานข้อมูลในลูปที่ค่าใช้จ่ายทั้งหมด