ไม่ว่าแนวคิดของสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์จะกำหนดไว้อย่างไร (และมีคำจำกัดความดังกล่าวมากมายในเอกสาร) พื้นฐานของแนวคิดนี้คือแบบจำลองการคำนวณแบบกระจาย ในกรณีทั่วไปที่สุดภายใต้ ลูกค้าและ เซิร์ฟเวอร์เข้าใจกระบวนการโต้ตอบสองกระบวนการ หนึ่งในนั้นคือผู้ให้บริการบางอย่างสำหรับอีกกระบวนการหนึ่ง
คำว่า "ไคลเอนต์-เซิร์ฟเวอร์" หมายถึงสถาปัตยกรรมของชุดซอฟต์แวร์ที่ส่วนการทำงานโต้ตอบกันตามรูปแบบ "การร้องขอและการตอบกลับ" หากเราพิจารณาสองส่วนที่โต้ตอบของคอมเพล็กซ์นี้ หนึ่งในนั้น (ไคลเอนต์) ทำหน้าที่ที่ใช้งานอยู่นั่นคือมันเริ่มต้นคำขอและอีกส่วนหนึ่ง (เซิร์ฟเวอร์) ตอบกลับอย่างอดทน เมื่อระบบพัฒนาขึ้น บทบาทอาจมีการเปลี่ยนแปลง เช่น บล็อกซอฟต์แวร์บางตัวจะทำหน้าที่ของเซิร์ฟเวอร์ที่เกี่ยวข้องกับบล็อกหนึ่งและไคลเอนต์ที่เกี่ยวข้องกับบล็อกอื่นไปพร้อมๆ กัน
เซิร์ฟเวอร์ - โปรเซสเซอร์หนึ่งหรือหลายผู้ใช้ที่มีฟิลด์หน่วยความจำเดียวซึ่งให้ฟังก์ชั่นการคำนวณการสื่อสารและการเข้าถึงฐานข้อมูลตามความต้องการของผู้ใช้ เซิร์ฟเวอร์สามารถเรียกได้ว่าเป็นโปรแกรมที่ให้บริการบางอย่างแก่โปรแกรมอื่น ตัวอย่างของเซิร์ฟเวอร์ ได้แก่ เว็บเซิร์ฟเวอร์ Apache, เซิร์ฟเวอร์ฐานข้อมูล - MySQL, ORACLE, ระบบไฟล์เครือข่าย และเครื่องพิมพ์ Windows
ไคลเอนต์ - เวิร์กสเตชันสำหรับผู้ใช้หนึ่งรายซึ่งมีโหมดการลงทะเบียนและฟังก์ชั่นอื่น ๆ ที่จำเป็นในที่ทำงานของเขา - การคำนวณ, การสื่อสาร, การเข้าถึงฐานข้อมูล ฯลฯ ไคลเอนต์สามารถเรียกได้ว่าเป็นโปรแกรมที่ใช้บริการที่ได้รับจากโปรแกรมเซิร์ฟเวอร์ ตัวอย่างไคลเอนต์ - MSIE (MS Internet Explorer), ไคลเอนต์ ICQ
บ่อยครั้งที่ผู้คนอ้างถึงคอมพิวเตอร์ที่หนึ่งในโปรแกรมเหล่านี้ทำงานเป็นไคลเอนต์หรือเซิร์ฟเวอร์
โดยพื้นฐานแล้ว ไคลเอนต์และเซิร์ฟเวอร์เป็นบทบาทที่ดำเนินการโดยโปรแกรม ไคลเอนต์และเซิร์ฟเวอร์สามารถอยู่บนคอมพิวเตอร์เครื่องเดียวกันได้ โปรแกรมเดียวกันสามารถเป็นทั้งไคลเอนต์และเซิร์ฟเวอร์ในเวลาเดียวกัน ฯลฯ ... นี่เป็นเพียงบทบาท
หากเราทำการเปรียบเทียบกับสังคม - ธนาคารหรือร้านค้า - "เซิร์ฟเวอร์" พวกเขาให้บริการบางอย่างแก่ลูกค้าของตน แต่ธนาคารอาจเป็นลูกค้าของบริษัทอื่นในเวลาเดียวกัน ฯลฯ...
การประมวลผลไคลเอนต์-เซิร์ฟเวอร์คือสภาพแวดล้อมที่การประมวลผลแอปพลิเคชันถูกกระจายระหว่างไคลเอนต์และเซิร์ฟเวอร์ บ่อยครั้งที่เครื่องจักรประเภทต่างๆ เกี่ยวข้องกับการประมวลผล โดยไคลเอนต์และเซิร์ฟเวอร์สื่อสารกันโดยใช้ชุดโปรโตคอลการแลกเปลี่ยนมาตรฐานและขั้นตอนคงที่สำหรับการเข้าถึงแพลตฟอร์มระยะไกล
DBMS จากคอมพิวเตอร์ส่วนบุคคล (เช่น Clipper, DBase, FoxPro, Paradox, Clarion มีเวอร์ชันเครือข่ายที่แชร์ไฟล์ฐานข้อมูลในรูปแบบเดียวกันสำหรับพีซี ในขณะที่ใช้การล็อคเครือข่ายเพื่อจำกัดการเข้าถึงตารางและบันทึก อย่างไรก็ตาม งานทั้งหมดจะดำเนินการ บนพีซี เซิร์ฟเวอร์ถูกใช้เป็นดิสก์ระยะไกลที่ใช้ร่วมกันซึ่งมีความจุสูง วิธีดำเนินการนี้นำไปสู่ความเสี่ยงที่ข้อมูลจะสูญหายเนื่องจากความล้มเหลวของฮาร์ดแวร์
เมื่อเปรียบเทียบกับระบบดังกล่าว ระบบที่สร้างขึ้นในสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์มีข้อดีดังต่อไปนี้:
ช่วยให้คุณเพิ่มขนาดและความซับซ้อนของโปรแกรมที่ทำงานบนเวิร์กสเตชัน
ช่วยให้มั่นใจได้ถึงการถ่ายโอนการดำเนินการที่ใช้แรงงานเข้มข้นที่สุดไปยังเซิร์ฟเวอร์ ซึ่งเป็นเครื่องที่มีพลังการประมวลผลมากกว่า
ลดความเป็นไปได้ของการสูญเสียข้อมูลที่มีอยู่ในฐานข้อมูลผ่านการใช้กลไกการปกป้องข้อมูลภายในที่มีอยู่บนเซิร์ฟเวอร์ เช่น ระบบการติดตามธุรกรรม การย้อนกลับหลังจากความล้มเหลว และวิธีการตรวจสอบความสมบูรณ์ของข้อมูล
ลดปริมาณข้อมูลที่ส่งผ่านเครือข่ายหลายครั้ง
ในสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์ เซิร์ฟเวอร์ฐานข้อมูลไม่เพียงแต่ให้การเข้าถึงข้อมูลที่ใช้ร่วมกัน แต่ยังจัดการการประมวลผลข้อมูลทั้งหมดนั้นด้วย ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์เพื่ออ่านหรือเปลี่ยนแปลงข้อมูลซึ่งจัดทำขึ้นใน SQL เซิร์ฟเวอร์ทำการเปลี่ยนแปลงหรือเลือกที่จำเป็นทั้งหมด ในขณะที่ตรวจสอบความสมบูรณ์และความสอดคล้องของข้อมูล และส่งผลลัพธ์ในรูปแบบของชุดบันทึกหรือรหัสส่งคืนไปยังคอมพิวเตอร์ของลูกค้า
1.2. เรื่องราว…
สถาปัตยกรรมและคำว่า "ไคลเอนต์-เซิร์ฟเวอร์" ถูกใช้ครั้งแรกในช่วงต้นทศวรรษที่ 80 แอปพลิเคชันแรกที่มีสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์คือฐานข้อมูล
ก่อนหน้านี้ไม่มีการแบ่งแยกที่ชัดเจน - โดยปกติแล้วโปรแกรมจะทำทุกอย่างด้วยตัวเอง - รวมถึงการทำงานกับข้อมูลในระบบไฟล์การนำเสนอข้อมูลให้กับผู้ใช้ ฯลฯ เมื่อเวลาผ่านไปปริมาณและความสำคัญของข้อมูลสำหรับธุรกิจก็เพิ่มขึ้นและเมื่อเวลาผ่านไป เริ่มก่อให้เกิดปัญหา (ประสิทธิภาพ ความปลอดภัย และอื่นๆ)
จากนั้นพวกเขาก็ตัดสินใจว่าจะสะดวกในการติดตั้งฐานข้อมูลบนคอมพิวเตอร์ (เซิร์ฟเวอร์) แยกที่ทรงพลังและอนุญาตให้ผู้ใช้คอมพิวเตอร์ขนาดเล็ก (ไคลเอนต์) จำนวนมากใช้ฐานข้อมูลนี้ผ่านเครือข่ายซึ่งเสร็จสิ้นแล้ว
โดยพื้นฐานแล้ว ความนิยมที่เพิ่มขึ้นอย่างรวดเร็วของเทคโนโลยีไคลเอ็นต์-เซิร์ฟเวอร์นั้นเกิดจากการประดิษฐ์ภาษาคิวรีอย่างง่ายสำหรับฐานข้อมูลเชิงสัมพันธ์ของ IBM ของ IBM ปัจจุบัน SQL เป็นมาตรฐานสากลสำหรับการทำงานกับฐานข้อมูล เมื่อเร็วๆ นี้ “การระเบิด” นี้ยังคงดำเนินต่อไปพร้อมกับการประดิษฐ์อินเทอร์เน็ต ซึ่งทุกปฏิสัมพันธ์เกิดขึ้นโดยใช้สถาปัตยกรรมไคลเอนต์และเซิร์ฟเวอร์
1.3. โปรโตคอล
เซิร์ฟเวอร์และไคลเอนต์บนเครือข่าย "พูดคุย" กันใน "ภาษา" (ในความหมายกว้าง ๆ ของคำ) ที่ทั้งสองฝ่ายเข้าใจได้ “ภาษา” นี้เรียกว่าโปรโตคอล
ในกรณีของธนาคาร โปรโตคอลสามารถเรียกว่าแบบฟอร์มที่ลูกค้ากรอก
ในกรณีของเรา ตัวอย่างของโปรโตคอล:
FTP (โปรโตคอลการถ่ายโอนไฟล์)
HTTP (โปรโตคอลการถ่ายโอนข้อความแบบไฮเปอร์)
SMTP (โปรโตคอลการโอนจดหมายอย่างง่าย)
IP (อินเทอร์เน็ตโปรโตคอล)
โปรโตคอลไคลเอ็นต์/เซิร์ฟเวอร์ MySQL
โปรดทราบว่าโปรโตคอลสามารถมีได้ในระดับที่แตกต่างกัน ระบบการจำแนกระดับอาจแตกต่างกัน แต่หนึ่งในบรรทัดที่มีชื่อเสียงที่สุดคือ OSI (Open Systems Interconnection) ซึ่งมี 7 ระดับ
ตัวอย่างเช่น HTTP เป็นโปรโตคอลเลเยอร์แอปพลิเคชัน (สูงสุดที่เจ็ด) และ IP เป็นโปรโตคอลเครือข่าย (ที่สาม)
1.4. การกระจายฟังก์ชันในสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์
ในสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์แบบคลาสสิก สามส่วนหลักของแอปพลิเคชันจะต้องกระจายไปยังโมดูลฟิสิคัลสองโมดูล โดยทั่วไป ซอฟต์แวร์จัดเก็บข้อมูลจะอยู่บนเซิร์ฟเวอร์ (เช่น เซิร์ฟเวอร์ฐานข้อมูล) ส่วนต่อประสานกับผู้ใช้อยู่บนฝั่งไคลเอ็นต์ แต่การประมวลผลข้อมูลจะต้องมีการกระจายระหว่างไคลเอนต์และส่วนของเซิร์ฟเวอร์ นี่เป็นข้อเสียเปรียบหลักของสถาปัตยกรรมสองชั้นซึ่งนำไปสู่คุณสมบัติที่ไม่พึงประสงค์หลายประการที่ทำให้การพัฒนาระบบไคลเอนต์เซิร์ฟเวอร์มีความซับซ้อนอย่างมาก
กระบวนการพัฒนาระบบดังกล่าวค่อนข้างซับซ้อน และงานที่สำคัญที่สุดอย่างหนึ่งคือการตัดสินใจว่าควรกระจายฟังก์ชันการทำงานของแอปพลิเคชันระหว่างไคลเอนต์และเซิร์ฟเวอร์อย่างไร ด้วยความพยายามที่จะแก้ไขปัญหานี้ นักพัฒนาจึงได้รับสถาปัตยกรรมแบบสองระดับ สามระดับ และหลายระดับ ทุกอย่างขึ้นอยู่กับจำนวนลิงก์กลางที่รวมไว้ระหว่างไคลเอนต์และเซิร์ฟเวอร์
งานหลักที่แอปพลิเคชันไคลเอนต์แก้ไขคือการจัดหาอินเทอร์เฟซกับผู้ใช้ เช่น การป้อนข้อมูลและการนำเสนอผลลัพธ์ในรูปแบบที่เป็นมิตรต่อผู้ใช้ และการจัดการสถานการณ์ของแอปพลิเคชัน
หน้าที่หลักของเซิร์ฟเวอร์ DBMS คือการรับประกันความน่าเชื่อถือ ความสม่ำเสมอ และความปลอดภัยของข้อมูล การจัดการคำขอของลูกค้า และการประมวลผลคำสั่ง SQL ที่รวดเร็ว
ตรรกะทั้งหมดของแอปพลิเคชัน - งานแอปพลิเคชัน, กฎเกณฑ์ทางธุรกิจ - ในสถาปัตยกรรมสองชั้นนั้นแจกจ่ายโดยนักพัฒนาระหว่างสองกระบวนการ: ไคลเอนต์และเซิร์ฟเวอร์ (รูปที่ 1)
ในตอนแรก ฟังก์ชั่นส่วนใหญ่ของแอปพลิเคชันได้รับการแก้ไขโดยไคลเอนต์ เซิร์ฟเวอร์เกี่ยวข้องกับการประมวลผลคำสั่ง SQL เท่านั้น สถาปัตยกรรมนี้เรียกว่า "เซิร์ฟเวอร์แบบหนา - เซิร์ฟเวอร์แบบบาง"
การเกิดขึ้นของความสามารถในการสร้างขั้นตอนการจัดเก็บบนเซิร์ฟเวอร์ เช่น โปรแกรมที่คอมไพล์ด้วยตรรกะการทำงานภายใน นำไปสู่แนวโน้มในการถ่ายโอนฟังก์ชันบางส่วนที่เพิ่มขึ้นไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์เริ่ม "อ้วน" มากขึ้นเรื่อยๆ และลูกค้าก็ "ผอมลง"
โซลูชันนี้มีข้อดีที่ชัดเจน เช่น บำรุงรักษาได้ง่ายกว่า เนื่องจากการเปลี่ยนแปลงทั้งหมดจำเป็นต้องทำในที่เดียวเท่านั้น - บนเซิร์ฟเวอร์
รุ่นที่กล่าวถึงข้างต้นมีข้อเสียดังต่อไปนี้
1. ลูกค้า “หนา”:
– ความซับซ้อนของการบริหาร
– การอัปเดตซอฟต์แวร์มีความซับซ้อนมากขึ้น เนื่องจากจะต้องเปลี่ยนพร้อมกันทั่วทั้งระบบ
– การกระจายอำนาจมีความซับซ้อนมากขึ้น เนื่องจากการเข้าถึงไม่ได้ถูกจำกัดด้วยการกระทำ แต่ด้วยตาราง
– เครือข่ายโอเวอร์โหลดเนื่องจากการส่งข้อมูลที่ยังไม่ได้ประมวลผลผ่านเครือข่ายนั้น
– การป้องกันข้อมูลที่อ่อนแอ เนื่องจากเป็นการยากที่จะกระจายอำนาจอย่างถูกต้อง
2. เซิร์ฟเวอร์ “อ้วน”:
– การใช้งานมีความซับซ้อนมากขึ้น เนื่องจากภาษาอย่าง PL/SQL ไม่เหมาะสำหรับการพัฒนาซอฟต์แวร์ดังกล่าว และไม่มีเครื่องมือแก้ไขข้อบกพร่องที่ดี
– ประสิทธิภาพของโปรแกรมที่เขียนด้วยภาษาเช่น PL/SQL นั้นต่ำกว่าโปรแกรมที่สร้างในภาษาอื่นอย่างมาก ซึ่งมีความสำคัญสำหรับระบบที่ซับซ้อน
– โปรแกรมที่เขียนด้วยภาษา DBMS มักจะทำงานไม่น่าเชื่อถือ ข้อผิดพลาดอาจทำให้เซิร์ฟเวอร์ฐานข้อมูลทั้งหมดล้มเหลว
– โปรแกรมผลลัพธ์ไม่สามารถพกพาไปยังระบบและแพลตฟอร์มอื่นได้อย่างสมบูรณ์
เพื่อแก้ไขปัญหาเหล่านี้ จึงมีการใช้สถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์หลายระดับ (สามระดับขึ้นไป) สถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์หลายระดับสามารถทำให้การประมวลผลแบบกระจายง่ายขึ้นอย่างมาก ทำให้ไม่เพียงแต่มีความน่าเชื่อถือมากขึ้นเท่านั้น แต่ยังเข้าถึงได้มากขึ้นอีกด้วย
อย่างไรก็ตาม ภาษาที่ใช้เขียน Stored Procedure นั้นไม่มีประสิทธิภาพหรือยืดหยุ่นพอที่จะปรับใช้ตรรกะของแอปพลิเคชันที่ซับซ้อนได้อย่างง่ายดาย
จากนั้นมีแนวโน้มที่จะมอบความไว้วางใจในการปฏิบัติงานแอปพลิเคชันและกฎเกณฑ์ทางธุรกิจให้กับส่วนประกอบแอปพลิเคชันที่แยกจากกัน (หรือส่วนประกอบหลายส่วน) ซึ่งสามารถทำงานบนคอมพิวเตอร์เฉพาะพิเศษ - แอปพลิเคชันเซิร์ฟเวอร์หรือบนคอมพิวเตอร์เครื่องเดียวกับที่เซิร์ฟเวอร์ฐานข้อมูลทำงาน . นี่คือวิธีที่สถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์สามระดับและหลายระดับเกิดขึ้น
ข้าว. 1. การกระจายฟังก์ชันระหว่างไคลเอนต์และเซิร์ฟเวอร์
มิดเดิลแวร์พิเศษได้เกิดขึ้นซึ่งควรให้แน่ใจว่าการทำงานร่วมกันของส่วนประกอบต่างๆ ของแอปพลิเคชันที่มีหลายองค์ประกอบดังกล่าว แอปพลิเคชันดังกล่าวมีความยืดหยุ่น ปรับขนาดได้ แต่ยากต่อการพัฒนา
รายการอ้างอิงที่ใช้
สารสนเทศ / เอ็ด เอ็น.วี. มาคาโรวา – ม.: การเงินและสถิติ, 2541.
เอฟโดคิมอฟ วี.วี. และอื่นๆ สารสนเทศทางเศรษฐกิจ เซนต์ปีเตอร์สเบิร์ก: ปีเตอร์ 2547
คาซาคอฟ เอส.ไอ. พื้นฐานของเทคโนโลยีเครือข่าย - อ.: วิทยุและการสื่อสาร, 2547
Kogalovsky M.R. เทคโนโลยีฐานข้อมูลบนคอมพิวเตอร์ส่วนบุคคล - M.: การเงินและสถิติ, 2546
โปปอฟ วี.วี. พื้นฐานของเทคโนโลยีคอมพิวเตอร์ –ม.: การเงินและสถิติ, 2544.
ฟิกูร์นอฟ วี.อี. IBM PC สำหรับผู้ใช้ ม., 2000.
ระบบปฏิบัติการ MS-DOS แนวคิดพื้นฐานและคำสั่ง แนวคิดพื้นฐาน: ฐานข้อมูล, DBMS, เอนทิตี, คุณลักษณะ, ความสัมพันธ์ (หนึ่งต่อหนึ่ง, หนึ่งต่อหลาย, หลายต่อหลาย) ความสัมพันธ์, คีย์หลัก
สถาปัตยกรรมไฟล์เซิร์ฟเวอร์
สถาปัตยกรรมระบบสารสนเทศแบบดั้งเดิม
หน้าที่พื้นฐานของระบบสารสนเทศ
สถาปัตยกรรมระบบสารสนเทศ- แนวคิดที่กำหนดแบบจำลอง โครงสร้าง ฟังก์ชันที่ดำเนินการ และการเชื่อมโยงระหว่างส่วนประกอบต่างๆ ของระบบสารสนเทศ (อภิธานศัพท์)
จากมุมมอง การใช้ซอฟต์แวร์และฮาร์ดแวร์สามารถระบุสถาปัตยกรรม IC ทั่วไปได้จำนวนหนึ่ง
ส่วนประกอบของระบบข้อมูลสามารถแบ่งออกเป็นสามชั้นตามฟังก์ชันการทำงาน: ชั้นการนำเสนอ ชั้นตรรกะทางธุรกิจ และชั้นการเข้าถึงข้อมูล
เลเยอร์การนำเสนอ- ทุกอย่างที่เกี่ยวข้องกับการโต้ตอบกับผู้ใช้: การกดปุ่ม การเลื่อนเมาส์ การวาดภาพ การแสดงผลการค้นหา ฯลฯ
ตรรกะทางธุรกิจ- กฎ, อัลกอริธึมสำหรับการตอบสนองของแอปพลิเคชันต่อการกระทำของผู้ใช้หรือเหตุการณ์ภายใน, กฎการประมวลผลข้อมูล
ชั้นการเข้าถึงข้อมูล- การจัดเก็บ การเรียกค้น การแก้ไข และการลบข้อมูลที่เกี่ยวข้องกับงานแอปพลิเคชันที่กำลังแก้ไขโดยแอปพลิเคชัน
เครือข่ายท้องถิ่นปรากฏขึ้น ไฟล์เริ่มถูกถ่ายโอนผ่านเครือข่าย ในตอนแรกมีเครือข่ายแบบเพียร์ทูเพียร์ - คอมพิวเตอร์ทุกเครื่องมีสิทธิ์เท่าเทียมกัน 3
จากนั้นแนวคิดก็เกิดขึ้นจากการจัดเก็บไฟล์ที่สาธารณชนสามารถเข้าถึงได้ทั้งหมดบนคอมพิวเตอร์เฉพาะบนเครือข่าย - ไฟล์เซิร์ฟเวอร์
แอปพลิเคชันเซิร์ฟเวอร์ไฟล์คือแอปพลิเคชันที่มีโครงสร้างคล้ายกับแอปพลิเคชันในเครื่องและใช้ทรัพยากรเครือข่ายเพื่อจัดเก็บโปรแกรมและข้อมูล ฟังก์ชั่นเซิร์ฟเวอร์: จัดเก็บข้อมูลและรหัสโปรแกรม ฟังก์ชั่นไคลเอนต์: การประมวลผลข้อมูลเกิดขึ้นเฉพาะในฝั่งไคลเอ็นต์
จำนวนลูกค้าถูกจำกัดไว้ที่สิบคน
1. โหมดผู้ใช้หลายคนสำหรับการทำงานกับข้อมูล
2. ความสะดวกในการควบคุมการเข้าถึงจากส่วนกลาง
3. ต้นทุนการพัฒนาต่ำ
1. ประสิทธิภาพต่ำ
2. ความน่าเชื่อถือต่ำ
3. ความสามารถในการขยายที่อ่อนแอ
ข้อเสียของสถาปัตยกรรมไฟล์เซิร์ฟเวอร์นั้นชัดเจนและมีสาเหตุหลักมาจากการที่ข้อมูลถูกจัดเก็บไว้ในที่เดียวและประมวลผลในอีกที่หนึ่ง ซึ่งหมายความว่าจะต้องส่งผ่านเครือข่าย ซึ่งส่งผลให้โหลดเครือข่ายสูงมาก และเป็นผลให้ประสิทธิภาพของแอปพลิเคชันลดลงอย่างมากเมื่อจำนวนไคลเอนต์พร้อมกันเพิ่มขึ้น ข้อเสียที่สำคัญประการที่สองของสถาปัตยกรรมนี้คือการแก้ปัญหาแบบกระจายอำนาจสำหรับปัญหาความสมบูรณ์และความสม่ำเสมอของข้อมูลและการเข้าถึงข้อมูลพร้อมกัน โซลูชันนี้ลดความน่าเชื่อถือของแอปพลิเคชัน
ความแตกต่างที่สำคัญระหว่างสถาปัตยกรรมไคลเอนต์ - เซิร์ฟเวอร์และสถาปัตยกรรมไฟล์เซิร์ฟเวอร์คือสิ่งที่เป็นนามธรรมจากการเป็นตัวแทนข้อมูลภายใน (สคีมาข้อมูลทางกายภาพ) ขณะนี้โปรแกรมไคลเอนต์จัดการข้อมูลในระดับวงจรลอจิคัล
ดังนั้น การใช้สถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์ทำให้สามารถสร้างระบบข้อมูลที่มีผู้ใช้หลายรายที่เชื่อถือได้ (ในแง่ของความสมบูรณ์ของข้อมูล) ด้วยฐานข้อมูลแบบรวมศูนย์ เป็นอิสระจากฮาร์ดแวร์ (และมักจะเป็นซอฟต์แวร์) ของเซิร์ฟเวอร์ฐานข้อมูล และรองรับผู้ใช้แบบกราฟิก อินเทอร์เฟซ (GUI) บนสถานีไคลเอนต์ที่เชื่อมต่อด้วยเครือข่ายท้องถิ่น นอกจากนี้ ต้นทุนการพัฒนาแอปพลิเคชันยังลดลงอย่างมาก
คุณสมบัติหลัก: 5
โปรแกรมไคลเอนต์ทำงานกับข้อมูลผ่านการร้องขอไปยังซอฟต์แวร์เซิร์ฟเวอร์
ฟังก์ชันพื้นฐานของแอปพลิเคชันจะถูกแบ่งระหว่างไคลเอนต์และเซิร์ฟเวอร์
รองรับการทำงานแบบหลายผู้ใช้อย่างเต็มที่
การรับประกันความสมบูรณ์ของข้อมูล
ตรรกะทางธุรกิจของแอปพลิเคชันยังคงอยู่ในซอฟต์แวร์ไคลเอนต์ เมื่อมีการเปลี่ยนแปลงอัลกอริธึม คุณจะต้องอัปเดตซอฟต์แวร์ผู้ใช้บนไคลเอนต์แต่ละเครื่อง
ข้อกำหนดสูงสำหรับแบนด์วิธของช่องทางการสื่อสารกับเซิร์ฟเวอร์ ซึ่งป้องกันการใช้สถานีไคลเอนต์อื่นนอกเหนือจากในเครือข่ายท้องถิ่น
การป้องกันข้อมูลที่อ่อนแอจากการแฮ็ก โดยเฉพาะจากผู้ใช้ระบบที่ไร้ยางอาย
ความซับซ้อนสูงในการดูแลระบบและการกำหนดค่าเวิร์กสเตชันผู้ใช้ของระบบ
ความจำเป็นในการใช้พีซีที่มีประสิทธิภาพที่ไซต์ไคลเอนต์
การพัฒนาระบบมีความซับซ้อนสูงเนื่องจากความสำคัญอย่างยิ่งยวดของการดำเนินการตรรกะทางธุรกิจและการจัดหาอินเทอร์เฟซผู้ใช้ในโปรแกรมเดียว
จะเห็นได้ง่ายว่าข้อบกพร่องส่วนใหญ่ของสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์แบบคลาสสิกหรือ 2 เลเยอร์เกิดจากการใช้สถานีไคลเอ็นต์เป็นผู้ดำเนินการตรรกะทางธุรกิจ IS ด้วยเหตุนี้ ขั้นตอนที่ชัดเจนในวิวัฒนาการต่อไปของสถาปัตยกรรม IS คือแนวคิดของ "ไคลเอ็นต์แบบบาง" นั่นคือการแบ่งอัลกอริธึมการประมวลผลข้อมูลออกเป็นส่วนที่เกี่ยวข้องกับประสิทธิภาพของฟังก์ชันทางธุรกิจและเกี่ยวข้องกับการแสดงข้อมูลในมนุษย์ -การนำเสนอที่เป็นมิตร ในเวลาเดียวกัน เฉพาะส่วนที่สองเท่านั้นที่เหลืออยู่บนเครื่องไคลเอนต์ ซึ่งเกี่ยวข้องกับการตรวจสอบหลักและการแสดงข้อมูล โดยถ่ายโอนฟังก์ชันการทำงานจริงทั้งหมดของระบบไปยังส่วนของเซิร์ฟเวอร์
เปลี่ยนผ่านเป็นสถาปัตยกรรมสามชั้น (2.5 ชั้น)
การใช้ขั้นตอนการจัดเก็บและการคำนวณข้อมูลฝั่งเซิร์ฟเวอร์จะช่วยลดการรับส่งข้อมูลและเพิ่มความปลอดภัย ลูกค้ายังคงใช้ส่วนหนึ่งของตรรกะทางธุรกิจ
อย่างที่คุณเห็น การจัดระเบียบของระบบนี้ชวนให้นึกถึงการจัดระเบียบของระบบรวมแรกอย่างมาก โดยมีข้อแตกต่างเพียงอย่างเดียวว่าสถานที่ของผู้ใช้ไม่ใช่เทอร์มินัล (ที่มีหน้าจอสีเขียวฉาวโฉ่) แต่เป็นคอมพิวเตอร์ส่วนบุคคลที่มี GUI ตัวอย่างเช่นเมื่อเร็ว ๆ นี้เนื่องจากโปรแกรมไคลเอนต์มักใช้เบราว์เซอร์ www มาตรฐาน แน่นอนว่าการกลับคืนสู่ระบบที่เกือบจะรวมกันนั้นเกิดขึ้นในระดับเทคโนโลยีที่แตกต่างกัน การใช้ DBMS พร้อมข้อดีทั้งหมดกลายเป็นสิ่งจำเป็น โปรแกรมสำหรับฝั่งเซิร์ฟเวอร์เขียนเป็นภาษาเฉพาะเป็นหลัก โดยใช้กลไกของกระบวนการจัดเก็บของเซิร์ฟเวอร์ฐานข้อมูล อย่างไรก็ตาม ในระดับองค์กรเชิงตรรกะ IS ในสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ที่มีธินไคลเอ็นต์จะถูกแบ่งออกเป็นสามชั้น ได้แก่ ชั้นข้อมูล ชั้นฟังก์ชันทางธุรกิจ (ขั้นตอนการจัดเก็บ) และชั้นการนำเสนอ น่าเสียดายที่โดยปกติแล้วในรูปแบบการออกแบบ IS นั้นเป็นไปไม่ได้ที่จะเขียนตรรกะทางธุรกิจทั้งหมดของแอปพลิเคชันในภาษา DBMS ในตัวที่ไม่ได้มีไว้สำหรับจุดประสงค์นี้ ด้วยเหตุนี้ บ่อยครั้งที่ฟังก์ชันทางธุรกิจส่วนหนึ่งถูกนำไปใช้ในส่วนของระบบของลูกค้า ซึ่งส่งผลให้ "อ้วนขึ้น" อย่างหลีกเลี่ยงไม่ได้ ส่วนหนึ่งเป็นเพราะสิ่งนี้ และส่วนหนึ่งเป็นเพราะไอซีดังกล่าวทางกายภาพประกอบด้วยสององค์ประกอบ สถาปัตยกรรมนี้จึงมักเรียกว่าสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์ 2.5 เลเยอร์
ต่างจากสถาปัตยกรรม 2 เลเยอร์ สถาปัตยกรรม 2.5 เลเยอร์มักจะไม่ต้องการช่องทางการสื่อสารความเร็วสูงระหว่างไคลเอนต์และเซิร์ฟเวอร์ส่วนของระบบ เนื่องจากผลการคำนวณสำเร็จรูปจะถูกส่งผ่านเครือข่าย - การคำนวณเกือบทั้งหมดจะดำเนินการบนฝั่งเซิร์ฟเวอร์ . การปกป้องข้อมูลได้รับการปรับปรุงอย่างมีนัยสำคัญเช่นกัน - ผู้ใช้จะได้รับสิทธิ์ในการเข้าถึงฟังก์ชั่นของระบบและไม่สามารถเข้าถึงข้อมูลได้ ฯลฯ ในเวลาเดียวกัน พร้อมด้วยข้อดีของแนวทางแบบรวม สถาปัตยกรรม 2.5 ยังนำข้อเสียทั้งหมดมาใช้ เช่น ความสามารถในการขยายที่จำกัด การพึ่งพาแพลตฟอร์มซอฟต์แวร์ การใช้ทรัพยากรคอมพิวเตอร์เครือข่ายอย่างจำกัด นอกจากนี้ โปรแกรมสำหรับส่วนเซิร์ฟเวอร์ของระบบยังเขียนด้วยภาษาขั้นตอนการจัดเก็บที่สร้างไว้ใน DBMS ซึ่งมีไว้สำหรับการตรวจสอบข้อมูลและสร้างรายงานอย่างง่าย ไม่ใช่สำหรับการเขียน IS ระดับองค์กรเลย ทั้งหมดนี้ช่วยลดความเร็วของระบบ เพิ่มความซับซ้อนในการสร้างและแก้ไข IC และมีผลกระทบด้านลบมากที่สุดต่อต้นทุนของฮาร์ดแวร์ที่จำเป็นสำหรับการดำเนินงาน
Vladimir นักพัฒนาเว็บของ Noveo กล่าวว่า:
นักพัฒนาเว็บไซต์ บริการเว็บ และแอปพลิเคชันมือถือส่วนใหญ่ไม่ช้าก็เร็วจะต้องจัดการกับสถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ กล่าวคือ พัฒนา API ของเว็บหรือบูรณาการเข้ากับสถาปัตยกรรมดังกล่าว เพื่อไม่ให้คิดค้นสิ่งใหม่ทุกครั้ง สิ่งสำคัญคือต้องพัฒนาแนวทางการออกแบบเว็บ API ที่ค่อนข้างเป็นสากล โดยอิงจากประสบการณ์ในการพัฒนาระบบที่คล้ายคลึงกัน เราขอนำเสนอบทความรวมที่เกี่ยวข้องกับปัญหานี้
ประมาณที่หนึ่ง: ตัวละคร
จนถึงจุดหนึ่ง ในกระบวนการสร้างบริการเว็บอื่น ฉันตัดสินใจรวบรวมความรู้และความคิดทั้งหมดของฉันในหัวข้อการออกแบบเว็บ API เพื่อตอบสนองความต้องการของแอปพลิเคชันไคลเอนต์ และนำมาจัดทำเป็นบทความหรือชุดของ บทความ แน่นอนว่าประสบการณ์ของฉันไม่ได้สมบูรณ์แบบ และการวิจารณ์และการเพิ่มเติมเชิงสร้างสรรค์ก็น่ายินดีเป็นอย่างยิ่ง
การอ่านกลายเป็นเชิงปรัชญามากกว่าทางเทคนิค แต่สำหรับแฟน ๆ ในส่วนทางเทคนิคจะต้องมีบางอย่างที่ต้องคิด ฉันสงสัยว่าฉันจะพูดในบทความนี้ถึงสิ่งใหม่โดยพื้นฐานบางสิ่งที่คุณไม่เคยได้ยินอ่านหรือคิดเกี่ยวกับตัวเอง ฉันจะพยายามรวมทุกอย่างไว้ในระบบเดียว โดยหลักๆ แล้วอยู่ในหัวของฉันเอง และนี่ก็คุ้มค่ามากแล้ว อย่างไรก็ตาม ข้าพเจ้าจะยินดีถ้าความคิดของข้าพเจ้าจะเป็นประโยชน์แก่ท่านในการปฏิบัติของท่าน ไปกันเลย
ไคลเอนต์และเซิร์ฟเวอร์
เซิร์ฟเวอร์ในกรณีนี้ เราจะพิจารณาเครื่องที่เป็นนามธรรมบนเครือข่ายที่สามารถรับคำขอ HTTP ประมวลผลและส่งกลับการตอบสนองที่ถูกต้อง ในบริบทของบทความนี้ สาระสำคัญทางกายภาพและสถาปัตยกรรมภายในนั้นไม่สำคัญเลย ไม่ว่าจะเป็นแล็ปท็อปสำหรับนักเรียนหรือเซิร์ฟเวอร์อุตสาหกรรมขนาดใหญ่ที่กระจายอยู่ทั่วโลก ในทำนองเดียวกัน มันไม่สำคัญสำหรับเราว่ามีอะไรซ่อนอยู่ ใครทักทายคำขอที่ประตู Apache หรือ Nginx สัตว์ร้ายที่ไม่รู้จัก PHP Python หรือ Ruby ประมวลผลและสร้างการตอบสนอง ใช้ที่จัดเก็บข้อมูลใด : PostgreSQL, MySQL หรือ MongoDB สิ่งสำคัญคือเซิร์ฟเวอร์ตรงตามกฎหลัก - ที่จะได้ยิน เข้าใจ และให้อภัย
ลูกค้ามันสามารถเป็นอะไรก็ได้ที่สามารถสร้างและส่งคำขอ HTTP ได้ จนถึงจุดหนึ่งของบทความนี้ เราจะไม่สนใจเป็นพิเศษในเป้าหมายที่ลูกค้าตั้งไว้สำหรับตัวเองเมื่อส่งคำขอนี้ หรือสิ่งที่เขาจะทำอย่างไรกับการตอบกลับ ไคลเอ็นต์อาจเป็นสคริปต์ JavaScript ที่ทำงานบนเบราว์เซอร์ แอปพลิเคชันมือถือ ปีศาจร้าย (หรือไม่ชั่วร้ายมาก) ที่ทำงานบนเซิร์ฟเวอร์ หรือตู้เย็นที่ฉลาดเกินไป (มีอยู่แล้ว)
โดยส่วนใหญ่เราจะพูดถึงวิธีการสื่อสารระหว่างคนทั้งสองข้างต้นในลักษณะที่พวกเขาเข้าใจกันและทั้งสองคนก็ไม่มีคำถามใดๆ
ปรัชญาการพักผ่อน
REST (การถ่ายโอนสถานะการเป็นตัวแทน) เดิมทีคิดว่าเป็นอินเทอร์เฟซที่เรียบง่ายและไม่คลุมเครือสำหรับการจัดการข้อมูล ซึ่งเกี่ยวข้องกับการดำเนินการพื้นฐานเพียงไม่กี่อย่างกับที่เก็บข้อมูลเครือข่ายโดยตรง (เซิร์ฟเวอร์): การดึงข้อมูล (GET) การบันทึก (POST) การแก้ไข (PUT/PATCH) ) และการลบ (DELETE) แน่นอนว่ารายการนี้มาพร้อมกับตัวเลือกต่างๆ เช่น การจัดการข้อผิดพลาดในคำขอ (คำขอรวบรวมอย่างถูกต้องหรือไม่) การจำกัดการเข้าถึงข้อมูล (ทันใดนั้นคุณไม่ควรรู้สิ่งนี้) และการตรวจสอบความถูกต้องของข้อมูลที่เข้ามา (ทันใดนั้นคุณเขียนเรื่องไร้สาระ) ใน ทั่วไป การตรวจสอบที่เป็นไปได้ทั้งหมด ซึ่งเซิร์ฟเวอร์ดำเนินการก่อนที่จะตอบสนองความต้องการ ลูกค้า.
นอกจากนี้ REST ยังมีหลักการทางสถาปัตยกรรมจำนวนหนึ่ง ซึ่งสามารถพบรายการหลักการเหล่านี้ได้ในบทความอื่นๆ เกี่ยวกับ REST มาดูกันสั้น ๆ เพื่อให้พวกมันอยู่ใกล้มือและคุณไม่จำเป็นต้องไปไหน:
ความเป็นอิสระของเซิร์ฟเวอร์จากไคลเอนต์- เซิร์ฟเวอร์และไคลเอนต์สามารถแทนที่ได้ทันทีโดยผู้อื่นโดยแยกจากกัน เนื่องจากอินเทอร์เฟซระหว่างกันไม่เปลี่ยนแปลง เซิร์ฟเวอร์ไม่เก็บสถานะไคลเอ็นต์
ความเป็นเอกลักษณ์ของที่อยู่ทรัพยากร- แต่ละหน่วยของข้อมูล (ไม่ว่าจะมีการซ้อนในระดับใดก็ตาม) จะมี URL ที่เป็นเอกลักษณ์ของตัวเอง ซึ่งจริงๆ แล้วคือตัวระบุทรัพยากรที่ไม่ซ้ำกันทั้งหมด
ตัวอย่าง:รับ /api/v1/users/25/name.get
ความเป็นอิสระของรูปแบบการจัดเก็บข้อมูลจากรูปแบบการส่งข้อมูล- เซิร์ฟเวอร์สามารถรองรับรูปแบบที่แตกต่างกันหลายรูปแบบสำหรับการส่งข้อมูลเดียวกัน (JSON, XML ฯลฯ ) แต่จัดเก็บข้อมูลในรูปแบบภายใน ไม่ว่าจะรองรับรูปแบบใดก็ตาม
การแสดงข้อมูลเมตาที่จำเป็นทั้งหมดในการตอบสนอง- นอกเหนือจากข้อมูลแล้ว เซิร์ฟเวอร์จะต้องส่งคืนรายละเอียดของการประมวลผลคำขอ เช่น ข้อความแสดงข้อผิดพลาด คุณสมบัติต่างๆ ของทรัพยากรที่จำเป็นสำหรับการทำงานต่อไป เช่น จำนวนบันทึกทั้งหมดในคอลเลกชันเพื่อการแสดงผลที่ถูกต้อง ของการนำทางหน้า เราจะอธิบายทรัพยากรประเภทต่างๆ ในภายหลัง
เราขาดอะไรไป?
Classic REST เกี่ยวข้องกับไคลเอนต์ที่ทำงานกับเซิร์ฟเวอร์ในฐานะที่เก็บข้อมูลแบบเรียบ ในขณะที่ไม่มีการพูดถึงการเชื่อมต่อและการพึ่งพาซึ่งกันและกันของข้อมูลระหว่างกัน โดยค่าเริ่มต้นทั้งหมดนี้ตกอยู่บนไหล่ของแอปพลิเคชันไคลเอนต์ทั้งหมด อย่างไรก็ตาม สาขาวิชาสมัยใหม่ที่มีการพัฒนาระบบการจัดการข้อมูล ไม่ว่าจะเป็นบริการทางสังคมหรือระบบการตลาดออนไลน์ บ่งบอกถึงความสัมพันธ์ที่ซับซ้อนระหว่างเอนทิตีที่เก็บไว้ในฐานข้อมูล สนับสนุนการเชื่อมต่อเหล่านี้ ได้แก่ ความสมบูรณ์ของข้อมูลเป็นความรับผิดชอบของฝั่งเซิร์ฟเวอร์ ในขณะที่ไคลเอนต์เป็นเพียงอินเทอร์เฟซสำหรับการเข้าถึงข้อมูลนี้ แล้วเราขาดอะไรไปใน REST?
การเรียกใช้ฟังก์ชัน
เพื่อไม่ให้ข้อมูลและการเชื่อมต่อระหว่างกันด้วยตนเอง เราเพียงแค่เรียกใช้ฟังก์ชันบนทรัพยากรและ "ป้อน" ข้อมูลที่จำเป็นให้เป็นอาร์กิวเมนต์ การดำเนินการนี้ไม่สอดคล้องกับมาตรฐาน REST ไม่มีกริยาพิเศษใด ๆ ซึ่งบังคับให้เราซึ่งเป็นนักพัฒนาต้องหลีกหนีจากทางของเราเอง
ตัวอย่างที่ง่ายที่สุด– การอนุญาตผู้ใช้ เราเรียกใช้ฟังก์ชันล็อกอิน ส่งผ่านออบเจ็กต์ที่มีข้อมูลรับรองเป็นอาร์กิวเมนต์ และรับคีย์การเข้าถึงเป็นการตอบกลับ เราไม่สนใจว่าจะเกิดอะไรขึ้นกับข้อมูลทางฝั่งเซิร์ฟเวอร์
อีกทางเลือกหนึ่ง– การสร้างและทำลายการเชื่อมต่อระหว่างข้อมูล เช่น การเพิ่มผู้ใช้ในกลุ่ม กำลังเรียกเอนทิตี กลุ่มฟังก์ชัน addUser ส่งวัตถุเป็นพารามิเตอร์ ผู้ใช้เราก็ได้ผลลัพธ์
และยังมีการดำเนินการที่ไม่เกี่ยวข้องโดยตรงกับการจัดเก็บข้อมูล เช่น การส่งการแจ้งเตือน การยืนยันหรือปฏิเสธการดำเนินการใดๆ (การสิ้นสุดระยะเวลาการรายงาน เป็นต้น)
การดำเนินงานหลายอย่าง
มันมักจะเกิดขึ้น และนักพัฒนาไคลเอนต์จะเข้าใจว่าฉันหมายถึงอะไร จะสะดวกกว่าสำหรับแอปพลิเคชันไคลเอนต์ในการสร้าง/เปลี่ยนแปลง/ลบ/ออบเจ็กต์ที่เป็นเนื้อเดียวกันหลายรายการพร้อมกันด้วยคำขอเดียว และสำหรับแต่ละออบเจ็กต์ คำตัดสินฝั่งเซิร์ฟเวอร์ที่แตกต่างกันเป็นไปได้ . มีตัวเลือกอย่างน้อยหลายตัวเลือก: การเปลี่ยนแปลงทั้งหมดเสร็จสมบูรณ์แล้ว หรือเสร็จสมบูรณ์บางส่วน (สำหรับบางออบเจ็กต์) หรือมีข้อผิดพลาดเกิดขึ้น นอกจากนี้ยังมีกลยุทธ์หลายประการ: ใช้การเปลี่ยนแปลงเฉพาะเมื่อทุกคนประสบความสำเร็จ หรือใช้บางส่วน หรือย้อนกลับในกรณีที่เกิดข้อผิดพลาด และสิ่งนี้นำไปสู่กลไกการทำธุรกรรมที่ครบถ้วนแล้ว
สำหรับเว็บ API ที่มุ่งมั่นเพื่อความสมบูรณ์แบบ ฉันอยากจะนำการดำเนินการดังกล่าวเข้าสู่ระบบด้วย ฉันจะพยายามทำสิ่งนี้ในภาคต่ออย่างใดอย่างหนึ่ง
การสืบค้นทางสถิติ ผู้รวบรวมข้อมูล การจัดรูปแบบข้อมูล
มันมักจะเกิดขึ้นโดยขึ้นอยู่กับข้อมูลที่เก็บไว้บนเซิร์ฟเวอร์ เราจำเป็นต้องได้รับข้อมูลสรุปทางสถิติหรือข้อมูลที่จัดรูปแบบด้วยวิธีพิเศษ เช่น เพื่อสร้างกราฟในฝั่งไคลเอ็นต์ นี่เป็นข้อมูลพื้นฐานที่สร้างขึ้นตามความต้องการ ไม่มากก็น้อยในทันที และเป็นแบบอ่านอย่างเดียว ดังนั้นจึงเหมาะสมที่จะแยกข้อมูลดังกล่าวไว้ในหมวดหมู่ที่แยกต่างหาก ในความคิดของฉัน คุณลักษณะที่โดดเด่นอย่างหนึ่งของข้อมูลทางสถิติคือไม่มีรหัสเฉพาะ
ฉันแน่ใจว่านี่ไม่ใช่ทุกสิ่งที่สามารถพบได้เมื่อพัฒนาแอปพลิเคชันจริง และฉันยินดีที่จะเห็นการเพิ่มเติมและการปรับเปลี่ยนของคุณ
ประเภทของข้อมูล
วัตถุ
ประเภทข้อมูลสำคัญในการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์คือออบเจ็กต์ โดยพื้นฐานแล้ว วัตถุคือรายการคุณสมบัติและค่าที่เกี่ยวข้อง เราสามารถส่งวัตถุไปยังเซิร์ฟเวอร์ในคำขอและรับผลการร้องขอเป็นวัตถุ อย่างไรก็ตาม วัตถุไม่จำเป็นต้องเป็นเอนทิตีจริงที่จัดเก็บไว้ในฐานข้อมูล อย่างน้อยก็ไม่ใช่ในรูปแบบที่ส่งหรือรับ ตัวอย่างเช่น ข้อมูลรับรองการอนุญาตจะถูกส่งผ่านเป็นออบเจ็กต์ แต่ไม่ใช่เอนทิตีอิสระ แม้แต่อ็อบเจ็กต์ที่จัดเก็บไว้ในฐานข้อมูลก็ยังมีแนวโน้มที่จะได้รับคุณสมบัติเพิ่มเติมในลักษณะภายในระบบ เช่น วันที่สร้างและแก้ไข ป้ายกำกับระบบและแฟล็กต่างๆ คุณสมบัติของวัตถุอาจเป็นค่าสเกลาร์ของตัวเองหรือมีก็ได้ วัตถุที่เกี่ยวข้องและ คอลเลกชันของวัตถุซึ่งไม่ใช่ส่วนหนึ่งของวัตถุ คุณสมบัติออบเจ็กต์บางอย่างสามารถแก้ไขได้ คุณสมบัติบางอย่างเป็นคุณสมบัติของระบบ อ่านอย่างเดียว และคุณสมบัติบางอย่างสามารถเป็นค่าทางสถิติและคำนวณได้ทันที (เช่น จำนวนการถูกใจ) คุณสมบัติวัตถุบางอย่างอาจถูกซ่อนไว้ ขึ้นอยู่กับสิทธิ์ของผู้ใช้
คอลเลกชันของวัตถุ
เมื่อเราพูดถึงคอลเลกชัน เราหมายถึงประเภทของทรัพยากรเซิร์ฟเวอร์ที่ช่วยให้คุณสามารถทำงานกับรายการของวัตถุที่เป็นเนื้อเดียวกันได้ เช่น เพิ่ม ลบ เปลี่ยนวัตถุ และเลือกจากวัตถุเหล่านั้น นอกจากนี้ คอลเลกชันอาจมีคุณสมบัติของตัวเองในทางทฤษฎี (เช่น จำนวนองค์ประกอบสูงสุดต่อหน้า) และฟังก์ชัน (ฉันสับสนที่นี่ แต่สิ่งนี้ก็เกิดขึ้นเช่นกัน)
ค่าสเกลาร์
ในรูปแบบที่บริสุทธิ์ ค่าสเกลาร์ในฐานะเอนทิตีที่แยกจากกันนั้นหายากมากในความทรงจำของฉัน โดยปกติแล้วสิ่งเหล่านี้จะปรากฏเป็นคุณสมบัติของวัตถุหรือคอลเลกชัน และสามารถอ่านหรือเขียนได้ ตัวอย่างเช่น ชื่อผู้ใช้สามารถดึงข้อมูลและเปลี่ยนแปลงทีละรายการได้ด้วย GET /users/1/name ในทางปฏิบัติ คุณลักษณะนี้ไม่ค่อยมีประโยชน์ แต่ถ้าจำเป็น ฉันอยากให้มีไว้ใช้ โดยเฉพาะอย่างยิ่งสำหรับคุณสมบัติคอลเลกชัน เช่น จำนวนบันทึก (มีหรือไม่มีการกรอง): GET /news/count
ในบทความใดบทความหนึ่งต่อไปนี้ ฉันจะพยายามจำแนกการดำเนินการเหล่านี้และเสนอตัวเลือกสำหรับคำขอและคำตอบที่เป็นไปได้ โดยพิจารณาจากสิ่งที่ฉันพบในทางปฏิบัติ
ประมาณที่สอง: เส้นทางที่ถูกต้อง
ในแนวทางนี้ ฉันอยากจะพูดแยกกันเกี่ยวกับแนวทางในการสร้างเส้นทางเฉพาะไปยังทรัพยากรและวิธีการของ API เว็บของคุณ และเกี่ยวกับคุณลักษณะทางสถาปัตยกรรมของแอปพลิเคชันที่ส่งผลต่อลักษณะที่ปรากฏของเส้นทางนี้และส่วนประกอบต่างๆ
สิ่งที่ควรคำนึงถึงขณะยืนอยู่บนฝั่ง
การกำหนดเวอร์ชัน
ไม่ช้าก็เร็วระบบปฏิบัติการใดๆ ก็เริ่มมีการพัฒนา: พัฒนา, ซับซ้อนมากขึ้น, ปรับขนาดได้ และทันสมัยมากขึ้น สำหรับนักพัฒนา REST API สิ่งนี้เต็มไปด้วยความจำเป็นในการเปิดตัว API เวอร์ชันใหม่ในขณะที่เวอร์ชันเก่ากำลังทำงานอยู่ ในที่นี้ฉันไม่ได้พูดถึงการเปลี่ยนแปลงทางสถาปัตยกรรมภายใต้ประทุนของระบบของคุณอีกต่อไป แต่เกี่ยวกับความจริงที่ว่ารูปแบบข้อมูลนั้นเองและชุดการดำเนินการที่มีการเปลี่ยนแปลง ไม่ว่าในกรณีใด จะต้องระบุเวอร์ชันสำหรับทั้งในการจัดระเบียบเริ่มต้นของซอร์สโค้ดและในหลักการของการสร้าง URL เมื่อพูดถึง URL มีสองวิธีที่ได้รับความนิยมมากที่สุดในการระบุเวอร์ชันของ API ที่จะจัดการกับคำขอ นำหน้าเส้นทาง example-api.com/v1/ และแยกเวอร์ชันที่ระดับโดเมนย่อย v1.example-api.com คุณสามารถใช้สิ่งเหล่านี้ได้ขึ้นอยู่กับความต้องการและความต้องการของคุณ
ความเป็นอิสระของส่วนประกอบ
Web API ของระบบที่ซับซ้อนที่รองรับบทบาทของผู้ใช้หลายบทบาทมักต้องมีการแบ่งออกเป็นส่วนๆ ซึ่งแต่ละส่วนจะทำหน้าที่ต่างๆ ของตัวเอง ในความเป็นจริง แต่ละส่วนสามารถเป็นแอปพลิเคชันอิสระที่ทำงานบนเครื่องและแพลตฟอร์มจริงที่แตกต่างกัน ในบริบทของการอธิบาย API นั้น ไม่ได้มีความสำคัญเลยสำหรับเราว่าเซิร์ฟเวอร์จะประมวลผลคำขออย่างไร และกองกำลังและเทคโนโลยีใดบ้างที่เกี่ยวข้องกับเรื่องนี้ สำหรับไคลเอนต์ API เป็นระบบแบบห่อหุ้ม อย่างไรก็ตาม ส่วนต่างๆ ของระบบอาจมีฟังก์ชันการทำงานที่แตกต่างกันโดยสิ้นเชิง เช่น ส่วนผู้ดูแลระบบและผู้ใช้ และวิธีการทำงานกับทรัพยากรที่ดูเหมือนจะเหมือนกันอาจแตกต่างกันอย่างมาก ดังนั้น ส่วนดังกล่าวจะต้องถูกแยกออกจากกันที่ระดับโดเมน admin.v1.example-api.com หรือคำนำหน้าเส้นทาง example-api.com/v1/admin/ ข้อกำหนดนี้ไม่บังคับ และส่วนใหญ่ขึ้นอยู่กับความซับซ้อนของระบบและวัตถุประสงค์ของระบบ
รูปแบบการแลกเปลี่ยนข้อมูล
ในความคิดของฉัน รูปแบบการแลกเปลี่ยนข้อมูลที่สะดวกและใช้งานได้มากที่สุดคือ JSON แต่ไม่มีใครห้ามการใช้ XML, YAML หรือรูปแบบอื่นใดที่ช่วยให้คุณจัดเก็บวัตถุที่ต่อเนื่องกันโดยไม่สูญเสียประเภทข้อมูล หากต้องการ คุณสามารถทำให้ API รองรับรูปแบบอินพุต/เอาต์พุตหลายรูปแบบได้ การใช้ส่วนหัวคำขอ HTTP เพื่อระบุรูปแบบการตอบสนองยอมรับที่ต้องการและประเภทเนื้อหาเพื่อระบุรูปแบบของข้อมูลที่ส่งในคำขอก็เพียงพอแล้ว อีกวิธีหนึ่งที่ได้รับความนิยมคือการเพิ่มส่วนขยายให้กับ URL ของทรัพยากร เช่น GET /users.xml แต่วิธีนี้ดูยืดหยุ่นและสวยงามน้อยลง หากเพียงเพราะมันทำให้ URL หนักขึ้นและเป็นจริงสำหรับคำขอ GET มากกว่าที่จะเป็นไปได้ทั้งหมด การดำเนินงาน
รองรับหลายภาษาและหลายภาษา
ในทางปฏิบัติ API หลายภาษาส่วนใหญ่มักเกี่ยวข้องกับการแปลบริการและข้อความแสดงข้อผิดพลาดเป็นภาษาที่จำเป็นสำหรับการแสดงผลโดยตรงต่อผู้ใช้ปลายทาง เนื้อหาหลายภาษาก็มีที่มาเช่นกัน แต่ในความคิดของฉัน การบันทึกและการออกเนื้อหาในภาษาต่าง ๆ ควรแยกความแตกต่างให้ชัดเจนยิ่งขึ้น ตัวอย่างเช่น หากคุณมีบทความเดียวกันในภาษาต่าง ๆ ที่จริงแล้วสิ่งเหล่านี้เป็นสองเอนทิตีที่แตกต่างกันซึ่งจัดกลุ่มตาม สัญลักษณ์ของความสามัคคีของเนื้อหา สามารถใช้วิธีการต่างๆ เพื่อระบุภาษาที่ต้องการได้ วิธีที่ง่ายที่สุดคือ Accept-Language ส่วนหัว HTTP มาตรฐาน ฉันเคยเห็นวิธีอื่นๆ เช่นการเพิ่มพารามิเตอร์ GET language="en" โดยใช้คำนำหน้าเส้นทาง example-api.com/en/ หรือแม้แต่ที่ระดับชื่อโดเมน en.example-api.com สำหรับฉันดูเหมือนว่าการเลือกวิธีระบุสถานที่นั้นขึ้นอยู่กับแอปพลิเคชันเฉพาะและงานที่เผชิญอยู่
เส้นทางภายใน
ดังนั้นเราจึงมาถึงโหนดรูทของ API ของเราแล้ว (หรือหนึ่งในส่วนประกอบของมัน) เส้นทางเพิ่มเติมทั้งหมดจะเกิดขึ้นโดยตรงภายในแอปพลิเคชันเซิร์ฟเวอร์ของคุณ ตามชุดทรัพยากรที่สนับสนุน
เส้นทางการสะสม
ในการระบุเส้นทางไปยังคอลเลกชัน เราเพียงใช้ชื่อของเอนทิตีที่เกี่ยวข้อง เช่น หากนี่คือรายชื่อผู้ใช้ เส้นทางจะเป็น /users มีสองวิธีที่ใช้กับคอลเลกชันได้ เช่น: GET (รับรายการเอนทิตีที่จำกัด) และ POST (การสร้างองค์ประกอบใหม่) ในการร้องขอรายการ เราสามารถใช้พารามิเตอร์ GET เพิ่มเติมจำนวนมากที่ใช้สำหรับเพจ การเรียงลำดับ การกรอง การค้นหา ฯลฯ แต่พารามิเตอร์เหล่านั้นต้องเป็นทางเลือก กล่าวคือ จะต้องไม่ส่งพารามิเตอร์เหล่านี้เป็นส่วนหนึ่งของเส้นทาง!
องค์ประกอบการสะสม
ในการเข้าถึงองค์ประกอบคอลเลกชันเฉพาะ เราจะใช้ตัวระบุเฉพาะ /users/25 ในเส้นทาง นี่คือเส้นทางที่ไม่เหมือนใคร ในการทำงานกับวัตถุ จะใช้วิธี GET (การรับวัตถุ), PUT/PATCH (การเปลี่ยนแปลง) และ DELETE (การลบ)
วัตถุที่ไม่ซ้ำใคร
บริการจำนวนมากมีออบเจ็กต์ที่ไม่ซ้ำกับผู้ใช้ปัจจุบัน เช่น โปรไฟล์ของผู้ใช้ปัจจุบัน /profile หรือการตั้งค่าส่วนบุคคล /settings แน่นอนว่าสิ่งเหล่านี้เป็นองค์ประกอบของหนึ่งในคอลเลกชัน แต่เป็นจุดเริ่มต้นสำหรับการใช้ Web API ของเราโดยแอปพลิเคชันไคลเอ็นต์ และยังช่วยให้สามารถดำเนินการกับข้อมูลได้หลากหลายยิ่งขึ้นอีกด้วย ในกรณีนี้ คอลเลกชันที่จัดเก็บการตั้งค่าผู้ใช้อาจไม่สามารถเข้าถึงได้โดยสิ้นเชิงด้วยเหตุผลด้านความปลอดภัยและการรักษาความลับของข้อมูล
คุณสมบัติของวัตถุและคอลเลกชัน
เพื่อที่จะเข้าถึงคุณสมบัติใดๆ ของอ็อบเจ็กต์โดยตรง ก็เพียงพอแล้วที่จะเพิ่มชื่อคุณสมบัติให้กับพาธไปยังอ็อบเจ็กต์ เช่น รับชื่อผู้ใช้ /users/25/name วิธีการ GET (รับค่า) และ PUT/PATCH (เปลี่ยนค่า) ใช้ได้กับคุณสมบัติ วิธีการ DELETE ใช้ไม่ได้เนื่องจาก คุณสมบัติเป็นส่วนโครงสร้างของวัตถุในฐานะหน่วยข้อมูลที่เป็นทางการ
ในส่วนก่อนหน้านี้ เราได้พูดถึงว่าคอลเลกชันต่างๆ เช่น วัตถุ สามารถมีคุณสมบัติเป็นของตัวเองได้อย่างไร จากประสบการณ์ของฉัน คุณสมบัติเดียวที่ฉันพบว่ามีประโยชน์คือคุณสมบัติการนับ แต่แอปพลิเคชันของคุณอาจซับซ้อนและเฉพาะเจาะจงมากขึ้น เส้นทางไปยังคุณสมบัติคอลเลกชันถูกสร้างขึ้นตามหลักการเดียวกันกับคุณสมบัติขององค์ประกอบ: /users/count สำหรับคุณสมบัติการรวบรวม มีเพียงวิธี GET (การรับคุณสมบัติ) เท่านั้นที่สามารถใช้ได้ เนื่องจาก คอลเลกชันเป็นเพียงอินเทอร์เฟซสำหรับการเข้าถึงรายการ
คอลเลกชันของวัตถุที่เกี่ยวข้อง
คุณสมบัติของวัตถุประเภทหนึ่งสามารถเป็นวัตถุที่เกี่ยวข้องหรือคอลเลกชันของวัตถุที่เกี่ยวข้องได้ ตามกฎแล้วเอนทิตีดังกล่าวไม่ใช่ทรัพย์สินของวัตถุ แต่อ้างอิงถึงความเชื่อมโยงกับเอนทิตีอื่นเท่านั้น ตัวอย่างเช่น รายการบทบาทที่กำหนดให้กับผู้ใช้ /users/25/roles เราจะพูดถึงรายละเอียดเกี่ยวกับการทำงานกับวัตถุที่ซ้อนกันและคอลเลกชันในส่วนใดส่วนหนึ่งต่อไปนี้ แต่ในขั้นตอนนี้ ก็เพียงพอแล้วสำหรับเราที่เราสามารถเข้าถึงวัตถุเหล่านั้นได้โดยตรง เช่นเดียวกับคุณสมบัติอื่น ๆ ของวัตถุ
หน้าที่ของวัตถุและคอลเลกชัน
ในการสร้างเส้นทางไปยังอินเทอร์เฟซการเรียกใช้ฟังก์ชันของคอลเลกชันหรือวัตถุ เราใช้วิธีการเดียวกันกับการเข้าถึงคุณสมบัติ ตัวอย่างเช่น สำหรับอ็อบเจ็กต์ /users/25/sendPasswordReminder หรือคอลเล็กชัน /users/disableUnconfirmed สำหรับการเรียกใช้ฟังก์ชัน เราจะใช้วิธี POST เสมอ ทำไม ฉันขอเตือนคุณว่าใน REST แบบคลาสสิกไม่มีคำกริยาพิเศษสำหรับเรียกใช้ฟังก์ชัน ดังนั้นเราจะต้องใช้หนึ่งในคำกริยาที่มีอยู่ ในความคิดของฉัน วิธี POST เหมาะสมที่สุดสำหรับสิ่งนี้ เพราะ... ช่วยให้คุณสามารถส่งผ่านอาร์กิวเมนต์ที่จำเป็นไปยังเซิร์ฟเวอร์ ไม่ใช่ idempotent (ส่งคืนผลลัพธ์เดียวกันเมื่อเข้าถึงหลายครั้ง) และเป็นนามธรรมที่สุดในซีแมนทิกส์
ฉันหวังว่าทุกอย่างจะเข้ากับระบบไม่มากก็น้อย :) ในส่วนถัดไปเราจะพูดถึงรายละเอียดเพิ่มเติมเกี่ยวกับคำขอและการตอบกลับ รูปแบบ และรหัสสถานะ
การประมาณที่สาม: คำถามและคำตอบ
ในการประมาณก่อนหน้านี้ ฉันได้พูดคุยเกี่ยวกับวิธีที่แนวคิดนี้มาในการรวบรวมและสรุปประสบการณ์ที่มีอยู่ในการพัฒนา Web API ในส่วนแรก ฉันพยายามอธิบายว่าเราจัดการทรัพยากรและการดำเนินงานประเภทใดเมื่อออกแบบเว็บ API ส่วนที่สองกล่าวถึงประเด็นของการสร้าง URL ที่ไม่ซ้ำกันสำหรับการเข้าถึงทรัพยากรเหล่านี้ และในการประมาณนี้ ฉันจะพยายามอธิบายตัวเลือกที่เป็นไปได้สำหรับคำขอและการตอบกลับ
คำตอบสากล
เราได้กล่าวไปแล้วว่ารูปแบบการสื่อสารเฉพาะระหว่างเซิร์ฟเวอร์และไคลเอนต์สามารถเป็นไปตามดุลยพินิจของผู้พัฒนา สำหรับฉัน ดูเหมือนว่ารูปแบบ JSON จะสะดวกและใช้งานง่ายที่สุด แม้ว่าแอปพลิเคชันจริงอาจรองรับหลายรูปแบบก็ตาม ตอนนี้เรามาดูโครงสร้างและคุณลักษณะที่จำเป็นของวัตถุตอบสนองกันดีกว่า ใช่ เราจะรวมข้อมูลทั้งหมดที่เซิร์ฟเวอร์ส่งคืนไว้ในคอนเทนเนอร์พิเศษ - วัตถุตอบสนองทั่วไปซึ่งจะมีข้อมูลบริการที่จำเป็นทั้งหมดสำหรับการประมวลผลต่อไป แล้วข้อมูลนี้คืออะไร:
ความสำเร็จ - เครื่องหมายของความสำเร็จของคำขอ
เพื่อให้เข้าใจได้ทันทีเมื่อได้รับการตอบกลับจากเซิร์ฟเวอร์ว่าคำขอสำเร็จหรือไม่และส่งต่อไปยังตัวจัดการที่เหมาะสม การใช้โทเค็นความสำเร็จ "ความสำเร็จ" ก็เพียงพอแล้ว การตอบสนองของเซิร์ฟเวอร์ที่ง่ายที่สุด ที่ไม่มีข้อมูล จะมีลักษณะดังนี้:
POST /api/v1/articles/22/publish ("ความสำเร็จ": จริง)
ข้อผิดพลาด - ข้อมูลข้อผิดพลาด
หากคำขอล้มเหลว เราจะพูดถึงเหตุผลและประเภทของการตอบสนองของเซิร์ฟเวอร์เชิงลบในภายหลัง - แอตทริบิวต์ "ข้อผิดพลาด" จะถูกเพิ่มลงในการตอบกลับ ซึ่งมีรหัสสถานะ HTTP และข้อความของข้อความแสดงข้อผิดพลาด กรุณาอย่าสับสนกับข้อความเกี่ยวกับ ข้อผิดพลาดในการตรวจสอบข้อมูลสำหรับสาขาเฉพาะ ในความคิดของฉัน ถูกต้องที่สุดที่จะส่งคืนรหัสสถานะในส่วนหัวการตอบกลับ แต่ฉันได้เห็นวิธีอื่นเช่นกัน - ส่งกลับสถานะ 200 (สำเร็จ) ในส่วนหัวเสมอ และส่งรายละเอียดและข้อมูลข้อผิดพลาดที่เป็นไปได้ในเนื้อหาของ การตอบสนอง.
GET /api/v1/user ("success": false, "error": ("code": 401, "message": "การอนุญาตล้มเหลว"))
ข้อมูล - ข้อมูลที่ส่งคืนโดยเซิร์ฟเวอร์
การตอบสนองของเซิร์ฟเวอร์ส่วนใหญ่ได้รับการออกแบบมาเพื่อส่งคืนข้อมูล ชุดข้อมูลที่คาดหวังจะแตกต่างกันไปขึ้นอยู่กับประเภทของคำขอและความสำเร็จ อย่างไรก็ตาม แอตทริบิวต์ "data" จะปรากฏในการตอบกลับส่วนใหญ่
ตัวอย่างข้อมูลที่ส่งคืนหากสำเร็จ ในกรณีนี้ การตอบสนองจะมีออบเจ็กต์ผู้ใช้ที่ร้องขอ
รับ /api/v1/user ("success": true, "data": ( "id": 125, "email": " [ป้องกันอีเมล], "ชื่อ" : "จอห์น", "นามสกุล" : "สมิธ", ) )
ตัวอย่างข้อมูลที่ส่งคืนในกรณีที่เกิดข้อผิดพลาด ในกรณีนี้ ประกอบด้วยชื่อฟิลด์และข้อความแสดงข้อผิดพลาดในการตรวจสอบ
PUT /api/v1/user ( "success": false, "error": ( "code" : 422, "message" : "Validation failed" ) "data": ( "email" : "อีเมลไม่สามารถเว้นว่างได้ ", ) )
การแบ่งหน้า - ข้อมูลที่จำเป็นในการจัดระเบียบการนำทางหน้า
นอกเหนือจากข้อมูลแล้วในการตอบกลับด้วย ชุดขององค์ประกอบการสะสมต้องมีข้อมูลเกี่ยวกับการนำทางหน้า (การแบ่งหน้า) ตามผลลัพธ์ของแบบสอบถาม
ชุดค่าขั้นต่ำสำหรับการแบ่งหน้าประกอบด้วย:
- จำนวนบันทึกทั้งหมด
- จำนวนหน้า;
- หมายเลขหน้าปัจจุบัน
- จำนวนบันทึกต่อหน้า
- จำนวนบันทึกสูงสุดต่อหน้าที่ฝั่งเซิร์ฟเวอร์รองรับ
นักพัฒนาเว็บ API บางรายยังรวมชุดลิงก์สำเร็จรูปไปยังหน้าที่ติดกันไว้ในการแบ่งหน้า รวมถึงลิงก์แรก สุดท้าย และปัจจุบัน
GET /api/v1/articles การตอบสนอง: ( "success": true, "data": [ ( "id" : 1, "title" : "Interesting thing", ), ( "id" : 2, "title" : "ข้อความที่น่าเบื่อ", ) ], "การแบ่งหน้า": ( "totalRecords" : 2, "totalPages" : 1, "currentPage" : 1, "perPage" : 20, "maxPerPage" : 100, ) )
ทำงานกับข้อผิดพลาด
ตามที่กล่าวไว้ข้างต้น ไม่ใช่ทุกคำขอที่ส่งไปยัง Web API จะสำเร็จ แต่นี่ก็เป็นส่วนหนึ่งของเกมเช่นกัน ระบบการรายงานข้อผิดพลาดเป็นเครื่องมืออันทรงพลังที่ทำให้งานของลูกค้าง่ายขึ้น และแนะนำแอปพลิเคชันไคลเอนต์ในเส้นทางที่ถูกต้อง คำว่า "ข้อผิดพลาด" ในบริบทนี้ไม่เหมาะสมโดยสิ้นเชิง น่าจะเป็นคำที่ดีกว่านี้ ข้อยกเว้นเนื่องจากในความเป็นจริงแล้ว ได้รับคำขอสำเร็จแล้ว แยกวิเคราะห์ และได้รับการตอบกลับอย่างเพียงพอ โดยอธิบายว่าเหตุใดจึงไม่สามารถดำเนินการตามคำขอให้เสร็จสิ้นได้
อะไรคือสาเหตุที่เป็นไปได้สำหรับข้อยกเว้นที่คุณได้รับ?
500 ข้อผิดพลาดเซิร์ฟเวอร์ภายใน - ทุกอย่างเสียหาย แต่เราจะแก้ไขในไม่ช้า
นี่เป็นกรณีที่เกิดปัญหาที่ด้านข้างของเซิร์ฟเวอร์เอง และแอปพลิเคชันไคลเอนต์ทำได้เพียงถอนหายใจและแจ้งให้ผู้ใช้ทราบว่าเซิร์ฟเวอร์เหนื่อยและนอนพักผ่อน ตัวอย่างเช่น การเชื่อมต่อกับฐานข้อมูลขาดหาย หรือมีจุดบกพร่องในโค้ด
400 คำขอไม่ถูกต้อง - และตอนนี้ทุกอย่างพังเพื่อคุณ
คำตอบนั้นตรงกันข้ามกับคำตอบก่อนหน้าทุกประการ ส่งคืนเมื่อแอปพลิเคชันไคลเอนต์ส่งคำขอที่ไม่สามารถประมวลผลได้อย่างถูกต้อง ไม่มีพารามิเตอร์ที่จำเป็น หรือมีข้อผิดพลาดทางไวยากรณ์ โดยปกติสามารถแก้ไขได้ด้วยการอ่านเอกสาร Web API อีกครั้ง
401 ไม่ได้รับอนุญาต - คนแปลกหน้าระบุตัวตน
ต้องได้รับอนุญาตเพื่อเข้าถึงทรัพยากรนี้ แน่นอนว่าการได้รับอนุญาตไม่ได้รับประกันว่าทรัพยากรจะพร้อมใช้งาน แต่หากไม่ได้รับอนุญาต คุณจะไม่ทราบอย่างแน่นอน เกิดขึ้น เช่น เมื่อพยายามเข้าถึงส่วนส่วนตัวของ API หรือเมื่อโทเค็นปัจจุบันหมดอายุ
403 ต้องห้าม - คุณไม่ได้รับอนุญาตที่นี่
มีทรัพยากรที่ร้องขออยู่ แต่ผู้ใช้ไม่มีสิทธิ์เพียงพอที่จะดูหรือแก้ไข
404 ไม่พบ - ไม่มีใครอาศัยอยู่ตามที่อยู่นี้
ตามกฎแล้วการตอบสนองดังกล่าวจะถูกส่งกลับในสามกรณี: เส้นทางไปยังทรัพยากรไม่ถูกต้อง (ผิดพลาด) ทรัพยากรที่ร้องขอถูกลบและหยุดอยู่ สิทธิ์ของผู้ใช้ปัจจุบันไม่อนุญาตให้เขาทราบเกี่ยวกับการมีอยู่ ของทรัพยากรที่ร้องขอ ตัวอย่างเช่น ในขณะที่เรากำลังดูรายการผลิตภัณฑ์ จู่ๆ หนึ่งในนั้นก็ดูล้าสมัยและถูกถอดออก
ไม่อนุญาตให้ใช้วิธี 405 - คุณไม่สามารถทำได้
ข้อยกเว้นประเภทนี้เกี่ยวข้องโดยตรงกับคำกริยาที่ใช้ในคำขอ (GET, PUT, POST, DELETE) ซึ่งในทางกลับกันจะบ่งบอกถึงการกระทำที่เราพยายามดำเนินการกับทรัพยากร หากทรัพยากรที่ร้องขอไม่รองรับการกระทำที่ระบุ เซิร์ฟเวอร์จะแจ้งอย่างชัดเจน
422 เอนทิตีที่ไม่สามารถประมวลผลได้ - แก้ไขและส่งอีกครั้ง
หนึ่งในข้อยกเว้นที่มีประโยชน์ที่สุด ส่งคืนเมื่อใดก็ตามที่มีข้อผิดพลาดเชิงตรรกะในข้อมูลคำขอ โดยการร้องขอข้อมูลเราหมายถึงชุดของพารามิเตอร์และค่าที่เกี่ยวข้องที่ส่งผ่านวิธี GET หรือเขตข้อมูลของวัตถุที่ส่งผ่านในเนื้อความของคำขอโดยวิธี POST, PUT และ DELETE หากข้อมูลไม่ได้รับการตรวจสอบ เซิร์ฟเวอร์จะส่งรายงานในส่วน "ข้อมูล" เกี่ยวกับพารามิเตอร์ที่ไม่ถูกต้องและสาเหตุ
โปรโตคอล HTTP รองรับรหัสสถานะที่แตกต่างกันจำนวนมากขึ้นมากสำหรับทุกโอกาส แต่ในทางปฏิบัติแล้ว ไม่ค่อยมีการใช้รหัสเหล่านี้ และในบริบทของ Web API ก็ไม่มีประโยชน์ในทางปฏิบัติ ในความทรงจำของฉัน ฉันไม่เคยต้องไปไกลกว่ารายการข้อยกเว้นข้างต้น
คำขอ
กำลังดึงรายการคอลเลกชัน
หนึ่งในคำขอที่พบบ่อยที่สุดคือคำขอเพื่อรับองค์ประกอบการรวบรวม แอปพลิเคชันไคลเอ็นต์จะแสดงฟีดข้อมูล รายการผลิตภัณฑ์ ข้อมูลต่างๆ และตารางสถิติ และอื่นๆ อีกมากมายโดยการเข้าถึงทรัพยากรของคอลเลกชัน เพื่อส่งคำขอนี้ เราเข้าถึงคอลเลกชันโดยใช้วิธี GET และส่งพารามิเตอร์เพิ่มเติมในสตริงการสืบค้น ดังที่เราได้ระบุไว้ข้างต้น เพื่อเป็นการตอบสนอง เราคาดว่าจะได้รับอาร์เรย์ขององค์ประกอบคอลเลกชันที่เป็นเนื้อเดียวกันและข้อมูลที่จำเป็นสำหรับการแบ่งหน้า - กำลังโหลดความต่อเนื่องของรายการหรือหน้าเฉพาะของรายการ เนื้อหาที่เลือกสามารถจำกัดและจัดเรียงด้วยวิธีพิเศษโดยส่งพารามิเตอร์เพิ่มเติม พวกเขาจะหารือเพิ่มเติม
การนำทางหน้า
หน้าหนังสือ- พารามิเตอร์ระบุว่าควรแสดงหน้าใด หากไม่ผ่านพารามิเตอร์นี้ หน้าแรกจะปรากฏขึ้น จากการตอบกลับที่สำเร็จครั้งแรกจากเซิร์ฟเวอร์ จะชัดเจนว่าคอลเลกชันมีกี่เพจพร้อมกับพารามิเตอร์การกรองปัจจุบัน หากค่าเกินจำนวนหน้าสูงสุด วิธีที่ดีที่สุดคือส่งคืนข้อผิดพลาด 404 ไม่พบ.
รับ /api/v1/news?page=1
ต่อหน้า- ระบุจำนวนองค์ประกอบที่ต้องการบนหน้า โดยทั่วไป API จะมีค่าเริ่มต้นของตัวเอง ซึ่งจะส่งกลับเป็นฟิลด์ perPage ในส่วนการแบ่งหน้า แต่ในบางกรณี API จะอนุญาตให้คุณเพิ่มค่านี้เป็นขีดจำกัดที่สมเหตุสมผลโดยระบุค่าสูงสุด maxPerPage:
รับ /api/v1/news?perPage=100
การเรียงลำดับผลลัพธ์
บ่อยครั้ง คุณต้องการเรียงลำดับผลลัพธ์ของการเลือกโดยค่าจากน้อยไปหามากหรือจากมากไปน้อยของบางฟิลด์ที่รองรับการเรียงลำดับแบบเปรียบเทียบ (สำหรับฟิลด์ตัวเลข) หรือการเรียงลำดับตามตัวอักษร (สำหรับฟิลด์สตริง) ตัวอย่างเช่น เราจำเป็นต้องจัดระเบียบรายชื่อผู้ใช้ตามชื่อหรือผลิตภัณฑ์ตามราคา นอกจากนี้ เราสามารถกำหนดทิศทางการเรียงลำดับจาก A ถึง Z หรือในทิศทางตรงกันข้ามได้ และจะแตกต่างกันไปในแต่ละฟิลด์
เรียงลำดับตาม- มีหลายวิธีในการส่งข้อมูลการเรียงลำดับที่ซับซ้อนในพารามิเตอร์ GET ที่นี่จำเป็นต้องระบุลำดับและทิศทางการเรียงลำดับอย่างชัดเจน
API บางตัวแนะนำให้ทำเช่นนี้เป็นสตริง:
รับ /api/v1/products?sortBy=name.desc,price.asc
ตัวเลือกอื่นแนะนำให้ใช้อาร์เรย์:
รับ /api/v1/ผลิตภัณฑ์? sortBy=name& sortBy=desc& sortBy=price& sortBy=asc
โดยทั่วไปแล้ว ทั้งสองตัวเลือกจะเทียบเท่ากัน เนื่องจากมีคำสั่งเดียวกัน ในความคิดของฉันตัวเลือกที่มีอาเรย์นั้นเป็นสากลมากกว่า แต่อย่างที่พวกเขาบอกว่ามันขึ้นอยู่กับรสนิยมและสี...
การกรองอย่างง่ายตามค่า
ในการกรองการเลือกตามค่าของฟิลด์ ในกรณีส่วนใหญ่ การส่งชื่อฟิลด์และค่าที่ต้องการเป็นพารามิเตอร์ตัวกรองก็เพียงพอแล้ว ตัวอย่างเช่น เราต้องการกรองบทความตามรหัสผู้เขียน:
รับ /api/v1/articles?authorId=25
ตัวเลือกการกรองขั้นสูง
อินเทอร์เฟซจำนวนมากต้องการระบบการกรองและการค้นหาที่ซับซ้อนมากขึ้น ฉันจะแสดงรายการตัวเลือกการกรองหลักและที่พบบ่อยที่สุด
การกรองตามขอบเขตบนและล่างโดยใช้ตัวดำเนินการเปรียบเทียบจาก (มากกว่าหรือเท่ากับ) สูงกว่า (มากกว่า) ถึง (น้อยกว่าหรือเท่ากับ) ต่ำกว่า (น้อยกว่า) ใช้กับฟิลด์ที่สามารถจัดอันดับค่าได้
รับ /api/v1/products?price=500&price=1000
กรองตามค่าที่เป็นไปได้หลายค่าจากรายการ ใช้กับฟิลด์ที่มีการจำกัดชุดค่าที่เป็นไปได้ เช่น ตัวกรองตามสถานะต่างๆ:
รับ /api/v1/products?status=1&status=2
การกรองตามการจับคู่สตริงบางส่วน ใช้กับฟิลด์ที่มีข้อมูลข้อความหรือข้อมูลที่สามารถเทียบได้กับข้อความ เช่น SKU ของผลิตภัณฑ์ที่เป็นตัวเลข หมายเลขโทรศัพท์ เป็นต้น
GET /api/v1/users?name=John GET /api/v1/products?code=123
ตัวกรองที่มีชื่อ
ในบางกรณี เมื่อชุดพารามิเตอร์ตัวกรองบางชุดมักถูกใช้และบอกเป็นนัยโดยระบบว่าเป็นแบบองค์รวม โดยเฉพาะอย่างยิ่งหากพารามิเตอร์เหล่านี้ส่งผลกระทบต่อกลไกภายในของการสุ่มตัวอย่างที่ซับซ้อน ขอแนะนำให้จัดกลุ่มพารามิเตอร์เหล่านี้ออกเป็นส่วนที่เรียกว่าตัวกรองที่มีชื่อ เพียงส่งชื่อตัวกรองในคำขอก็เพียงพอแล้ว และระบบจะสร้างการเลือกโดยอัตโนมัติ
รับ /api/v1/products?filters=recommended
ตัวกรองที่มีชื่อสามารถมีพารามิเตอร์ของตัวเองได้
รับ /api/v1/products?filters=kidds
ในส่วนย่อยนี้ ฉันพยายามพูดถึงตัวเลือกและวิธีการยอดนิยมในการรับตัวอย่างที่ต้องการ เป็นไปได้มากว่าในทางปฏิบัติของคุณจะมีตัวอย่างและความแตกต่างอีกมากมายเกี่ยวกับหัวข้อนี้ หากคุณมีอะไรเพิ่มเติมในเนื้อหาของฉันฉันก็จะดีใจเท่านั้น ในระหว่างนี้ โพสต์ได้ขยายไปสู่ระดับที่สำคัญแล้ว ดังนั้นเราจะวิเคราะห์คำขอประเภทอื่นๆ ในการประมาณครั้งต่อไป
ฐานข้อมูลที่ทำงานโดยใช้เทคโนโลยี FILE SERVER
ฐานข้อมูลที่ใช้เทคโนโลยี CLIENT-SERVER
ไฟล์เซิร์ฟเวอร์
- การเข้าถึงฐานข้อมูล (แบบสอบถาม)
- การถ่ายโอนข้อมูลในขณะที่บล็อกการเข้าถึงของผู้ใช้รายอื่น
- การประมวลผลข้อมูลบนคอมพิวเตอร์ของผู้ใช้
เพื่อความชัดเจน ลองดูตัวอย่างที่เฉพาะเจาะจง สมมติว่าคุณต้องดูคำสั่งจ่ายเงินที่ส่งในช่วงวันที่ 19 พฤษภาคมถึง 25 พฤษภาคมเป็นจำนวน 5,000 รูเบิล ผู้ใช้จะต้องเปิดแอปพลิเคชันไคลเอนต์บนคอมพิวเตอร์ของเขาซึ่งทำงานในฐานข้อมูลพร้อมคำสั่งการชำระเงิน และป้อนเกณฑ์การคัดเลือกที่จำเป็น หลังจากนั้นไฟล์ที่มีเอกสารประเภทนี้ทั้งหมดตลอดระยะเวลาในจำนวนเท่าใดก็ได้จะถูกดาวน์โหลดไปยังคอมพิวเตอร์ของคุณจากเซิร์ฟเวอร์ฐานข้อมูลและโหลดลงใน RAM แอปพลิเคชันไคลเอนต์ที่ทำงานบนคอมพิวเตอร์ของผู้ใช้ที่ทำงานร่วมกับฐานข้อมูลจะประมวลผลข้อมูลนี้ (เรียงลำดับ) จากนั้นให้การตอบกลับ (รายการคำสั่งชำระเงินที่ตรงตามเกณฑ์ของคุณจะปรากฏบนหน้าจอ) หลังจากนี้ คุณจะเลือกคำสั่งการชำระเงินที่ต้องการและลองแก้ไข (เปลี่ยนแปลง) ฟิลด์หนึ่งในนั้น - ตัวอย่างเช่นวันที่ ในระหว่างการแก้ไข แหล่งข้อมูลจะถูกบล็อก นั่นคือไฟล์ทั้งหมดที่มีเอกสารนี้ ซึ่งหมายความว่าไฟล์จะไม่สามารถใช้ได้สำหรับผู้ใช้รายอื่นเลยหรือจะสามารถใช้ได้เฉพาะในโหมดดูเท่านั้น ยิ่งไปกว่านั้น การจับภาพประเภทนี้ไม่ได้เกิดขึ้นในระดับบันทึกด้วยซ้ำ นั่นคือ เอกสารเดียว แต่ไฟล์ทั้งหมดถูกล็อค นั่นคือทั้งตารางที่มีเอกสารที่คล้ายกัน หลังจากที่ฟิลด์นี้ได้รับการประมวลผลอย่างสมบูรณ์และออกจากโหมดการแก้ไขแล้วเท่านั้น ไฟล์ใบสั่งการชำระเงินนี้จะถูกปลดล็อคจากการถูกบันทึกโดยผู้ใช้ หากข้อมูลถูกจัดเก็บไว้ในออบเจ็กต์ขนาดใหญ่ เช่น ไฟล์หนึ่งมีคำสั่งจ่ายเงินสำหรับทั้งการรับเงินและการส่งเงิน ก็จะไม่มีข้อมูลมากกว่านี้อีก คุณจะทำงานกับช่อง "วันที่" หนึ่งช่องในเอกสารเดียว - พนักงานในองค์กรที่เหลือจะรอจนกว่าคุณจะดำเนินการเสร็จ
ข้อเสียของระบบ FILE SERVER นั้นชัดเจน:
โหลดที่สูงมากบนเครือข่าย ความต้องการแบนด์วิธเพิ่มขึ้น ในทางปฏิบัติ สิ่งนี้ทำให้แทบจะเป็นไปไม่ได้เลยที่ผู้ใช้จำนวนมากจะสามารถทำงานกับข้อมูลจำนวนมากพร้อมกันได้
การประมวลผลข้อมูลจะดำเนินการบนคอมพิวเตอร์ของผู้ใช้ สิ่งนี้นำมาซึ่งความต้องการฮาร์ดแวร์ที่เพิ่มขึ้นสำหรับผู้ใช้แต่ละคน ยิ่งมีผู้ใช้มากเท่าไหร่ คุณก็จะต้องใช้เงินมากขึ้นในการเตรียมคอมพิวเตอร์ของพวกเขา
การล็อกข้อมูลเมื่อแก้ไขโดยผู้ใช้รายหนึ่งทำให้ผู้ใช้รายอื่นไม่สามารถทำงานกับข้อมูลนี้ได้
ความปลอดภัย. เพื่อให้สามารถทำงานกับระบบดังกล่าวได้ คุณจะต้องให้สิทธิ์ผู้ใช้แต่ละคนในการเข้าถึงไฟล์ทั้งหมดโดยสมบูรณ์ ซึ่งเขาอาจสนใจเพียงฟิลด์เดียวเท่านั้น
ไคลเอนต์เซิร์ฟเวอร์
กำลังประมวลผลคำขอของผู้ใช้รายเดียว:
- การเข้าถึงฐานข้อมูล (แบบสอบถาม SQL)
- การส่งการตอบสนอง - ผลลัพธ์ของการประมวลผล
หากจำเป็นต้องประมวลผลข้อมูลที่เก็บไว้ในฐานข้อมูล แอปพลิเคชันไคลเอ็นต์ที่ทำงานบนคอมพิวเตอร์ของผู้ใช้ที่ทำงานร่วมกับฐานข้อมูลจะสร้างแบบสอบถามในภาษา SQL (ชื่อจากตัวอักษรเริ่มต้น - Structured Query Language) เซิร์ฟเวอร์ฐานข้อมูลยอมรับคำขอและดำเนินการอย่างอิสระ ไม่มีการส่งอาร์เรย์ข้อมูล (ไฟล์) ผ่านเครือข่าย หลังจากประมวลผลคำขอ เฉพาะผลลัพธ์เท่านั้นที่จะถูกโอนไปยังคอมพิวเตอร์ของผู้ใช้ นั่นคือในตัวอย่างก่อนหน้านี้ รายการคำสั่งการชำระเงินที่ตรงตามเกณฑ์ที่จำเป็น ตัวไฟล์ซึ่งมีข้อมูลที่ทำหน้าที่เป็นแหล่งที่มาสำหรับการประมวลผลถูกเก็บไว้ ยังคงไม่ถูกบล็อกเพื่อให้เซิร์ฟเวอร์เข้าถึงได้ตามคำขอของผู้ใช้รายอื่น
ใน DBMS ไคลเอนต์-เซิร์ฟเวอร์ที่ร้ายแรง มีกลไกเพิ่มเติมที่ช่วยลดภาระบนเครือข่ายและลดข้อกำหนดสำหรับคอมพิวเตอร์ของผู้ใช้ ตัวอย่างเช่น เราจะให้ขั้นตอนการจัดเก็บ - นั่นคือโปรแกรมทั้งหมดสำหรับการประมวลผลข้อมูลที่เก็บไว้ในฐานข้อมูล ในกรณีนี้ แม้แต่นิพจน์ SQL จะไม่ถูกถ่ายโอนจากผู้ใช้ไปยังเซิร์ฟเวอร์ - การเรียกใช้ฟังก์ชันพร้อมพารามิเตอร์การโทรจะถูกถ่ายโอน ดังนั้นสถานที่ทำงานของผู้ใช้จึงง่ายขึ้น ตรรกะของโปรแกรมจึงถูกถ่ายโอนไปยังเซิร์ฟเวอร์ พื้นที่ผู้ใช้กลายเป็นเพียงวิธีการแสดงข้อมูล ทั้งหมดนี้หมายถึงการลดภาระบนเครือข่ายและเวิร์คสเตชั่นของผู้ใช้อีกด้วย
ดังนั้นข้อเสียข้างต้นทั้งหมดของโครงร่าง FILE-SERVER จึงถูกกำจัดในสถาปัตยกรรม CLIENT-SERVER:
อาร์เรย์ข้อมูลจะไม่ถูกถ่ายโอนผ่านเครือข่ายจากเซิร์ฟเวอร์ฐานข้อมูลไปยังคอมพิวเตอร์ของผู้ใช้ ความต้องการแบนด์วิธของเครือข่ายลดลง ทำให้ผู้ใช้สามารถทำงานพร้อมกันกับข้อมูลจำนวนมากได้
การประมวลผลข้อมูลดำเนินการบนเซิร์ฟเวอร์ฐานข้อมูล ไม่ใช่บนคอมพิวเตอร์ของผู้ใช้ ซึ่งช่วยให้สามารถใช้คอมพิวเตอร์ที่ไซต์ไคลเอนต์ได้ง่ายขึ้นและถูกกว่า
ข้อมูลไม่ถูกบล็อก (บันทึก) โดยผู้ใช้รายเดียว
ผู้ใช้จะได้รับสิทธิ์ในการเข้าถึงไม่ใช่ไฟล์ทั้งหมด แต่เฉพาะข้อมูลจากไฟล์ที่ผู้ใช้มีสิทธิ์ในการทำงานด้วย
เมื่อพิจารณาถึงความแตกต่างระหว่าง FILE SERVER และ CLIENT SERVER แล้ว เราก็สามารถพิจารณาแนวคิดเรื่อง "การจัดเก็บข้อมูล" ให้เสร็จสิ้นได้ สิ่งสำคัญคือต้องเน้นย้ำว่าการทำงานของระบบองค์กรส่วนใหญ่ขึ้นอยู่กับประเภทของ DBMS ที่ใช้ เห็นได้ชัดว่าสำหรับองค์กรขนาดใหญ่ที่มีผู้ใช้จำนวนมากและมีบันทึกจำนวนมากในฐานข้อมูลรูปแบบไฟล์เซิร์ฟเวอร์นั้นไม่สามารถยอมรับได้อย่างสมบูรณ์ ในทางกลับกัน ฐานข้อมูลมีความแตกต่างในพารามิเตอร์และความสามารถอื่นๆ:
ประเภทของข้อมูลที่สามารถจัดเก็บในฐานข้อมูลได้ (ตัวเลข วันที่ ข้อความ รูปภาพ วีดีโอ เสียง ฯลฯ)
เกี่ยวกับเทคโนโลยีที่จัดโดยฐานข้อมูลเองเพื่อเข้าถึงข้อมูลในฐานข้อมูลและระดับการป้องกันข้อมูลจากการเข้าถึงโดยไม่ได้รับอนุญาต
เกี่ยวกับเครื่องมือและวิธีการในการพัฒนาที่สามารถนำมาใช้ในการออกแบบระบบสารสนเทศใด ๆ บนพื้นฐานของฐานข้อมูลนี้
เกี่ยวกับเครื่องมือและวิธีการวิเคราะห์ข้อมูล (ข้อมูล) ที่จัดไว้ให้ซึ่งสามารถนำไปใช้ในระบบสารสนเทศตามฐานข้อมูลนี้
ในแง่ของความน่าเชื่อถือและความเสถียร นั่นคือ (โดยประมาณ) จำนวนบันทึก (ช่องที่กรอกข้อมูล) ในฐานข้อมูล ซึ่งทำให้มั่นใจได้ถึงความสามารถที่เชื่อถือได้และไม่หยุดชะงักในการเข้าถึง เปลี่ยนแปลง และวิเคราะห์ข้อมูลในฐานข้อมูล
ตามความเร็ว - เวลาที่ใช้ในการเข้าถึงและประมวลผลข้อมูล
ถ้าเป็นไปได้ จัดระเบียบงานบนคอมพิวเตอร์จากผู้ผลิตหลายราย นั่นคือ ความเข้ากันได้กับแพลตฟอร์มและระบบปฏิบัติการอื่น
ตามระดับการสนับสนุน (บริการ) ที่จัดทำโดยผู้พัฒนาฐานข้อมูลหรือตัวแทนจำหน่ายที่ได้รับอนุญาต
ความพร้อมของเครื่องมือที่ดีสำหรับการสร้างแอปพลิเคชันที่ใช้ฐานข้อมูลนี้ ฯลฯ
เหตุใดการลงทุนในโซลูชันเซิร์ฟเวอร์ไฟล์จึงไม่ทำกำไรในปัจจุบัน ปัจจุบันเส้นทางการพัฒนาฐานข้อมูลในอนาคตมีความชัดเจนแล้ว ระบบไคลเอ็นต์-เซิร์ฟเวอร์หลายระดับกำลังปรากฏขึ้น โดยมีไคลเอ็นต์ขนาดเล็กมาก โดยได้ขจัดข้อจำกัดใดๆ ออกจากสถานีไคลเอ็นต์ ทั้งในแง่ของประสิทธิภาพและแพลตฟอร์มและระบบปฏิบัติการ หากมองเห็นการพัฒนาเพิ่มเติมอย่างชัดเจนสำหรับโซลูชันไคลเอนต์ - เซิร์ฟเวอร์ และการเปลี่ยนจากไคลเอนต์ - เซิร์ฟเวอร์ไปเป็นไคลเอนต์ - เซิร์ฟเวอร์หลายระดับนั้นไม่เป็นปัญหา ดังนั้นสำหรับไฟล์เซิร์ฟเวอร์ การเปลี่ยนแปลงอย่างง่าย ๆ ไปยังไคลเอนต์ - เซิร์ฟเวอร์ทำให้เกิดปัญหาใหญ่ ปัญหาและค่าแรงจำนวนมหาศาลหากเกิดเหตุการณ์เช่นนี้ขึ้นทันใด
ตามกฎแล้ว คอมพิวเตอร์และโปรแกรมที่เป็นส่วนหนึ่งของระบบข้อมูลจะไม่เท่ากัน บางส่วนเป็นเจ้าของทรัพยากร (ระบบไฟล์ ตัวประมวลผล เครื่องพิมพ์ ฐานข้อมูล ฯลฯ) บางส่วนมีความสามารถในการเข้าถึงทรัพยากรเหล่านี้ คอมพิวเตอร์ (หรือโปรแกรม) ที่จัดการทรัพยากรเรียกว่าเซิร์ฟเวอร์ของทรัพยากรนั้น (ไฟล์เซิร์ฟเวอร์ เซิร์ฟเวอร์ฐานข้อมูล เซิร์ฟเวอร์คอมพิวเตอร์...) ไคลเอ็นต์และเซิร์ฟเวอร์ของทรัพยากรสามารถอยู่ในระบบคอมพิวเตอร์เดียวกันหรือบนคอมพิวเตอร์เครื่องอื่นที่เชื่อมต่อกันด้วยเครือข่าย
หลักการพื้นฐานของเทคโนโลยีไคลเอนต์-เซิร์ฟเวอร์คือการแบ่งฟังก์ชันแอปพลิเคชันออกเป็นสามกลุ่ม:
· การป้อนข้อมูลและการแสดงผล (การโต้ตอบของผู้ใช้)
· ฟังก์ชันที่ประยุกต์ใช้กับสาขาวิชาที่กำหนด
· ฟังก์ชันการจัดการทรัพยากร (ระบบไฟล์ ฐานข้อมูล ฯลฯ)
ดังนั้นในการใช้งานใด ๆ ส่วนประกอบต่อไปนี้จึงมีความโดดเด่น:
· องค์ประกอบการนำเสนอข้อมูล
· ส่วนประกอบแอปพลิเคชัน
· องค์ประกอบการจัดการทรัพยากร
การสื่อสารระหว่างส่วนประกอบต่างๆ ดำเนินการตามกฎเกณฑ์บางประการ ซึ่งเรียกว่า "โปรโตคอลการโต้ตอบ"
5.1.2. โมเดลการโต้ตอบระหว่างไคลเอนต์และเซิร์ฟเวอร์
Gartner Group ซึ่งเป็นบริษัทที่เชี่ยวชาญด้านการวิจัยเทคโนโลยีสารสนเทศ ได้เสนอการจำแนกประเภทของโมเดลการโต้ตอบระหว่างไคลเอนต์และเซิร์ฟเวอร์แบบสองระดับดังต่อไปนี้ (โมเดลเหล่านี้เรียกว่าสองระดับเนื่องจากส่วนประกอบทั้งสามของแอปพลิเคชันมีการกระจายที่แตกต่างกันระหว่างสองโหนด ):
ในอดีต แบบจำลองการนำเสนอข้อมูลแบบกระจายเป็นรูปแบบแรกที่ปรากฏ ซึ่งถูกนำมาใช้บนคอมพิวเตอร์เอนกประสงค์ที่มีเทอร์มินัลที่ไม่ชาญฉลาดเชื่อมต่ออยู่ การจัดการข้อมูลและการโต้ตอบกับผู้ใช้ถูกรวมไว้ในโปรแกรมเดียว เฉพาะ "รูปภาพ" ที่สร้างขึ้นบนคอมพิวเตอร์ส่วนกลางเท่านั้นที่ถูกส่งไปยังเทอร์มินัล
จากนั้น ด้วยการถือกำเนิดของคอมพิวเตอร์ส่วนบุคคล (พีซี) และเครือข่ายท้องถิ่น โมเดลการเข้าถึงฐานข้อมูลระยะไกลจึงถูกนำมาใช้ ในบางครั้ง สถาปัตยกรรมพื้นฐานสำหรับเครือข่ายพีซีคือสถาปัตยกรรมเซิร์ฟเวอร์ไฟล์ ในกรณีนี้ คอมพิวเตอร์เครื่องหนึ่งเป็นไฟล์เซิร์ฟเวอร์ ไคลเอนต์เรียกใช้แอปพลิเคชันที่รวมส่วนประกอบการนำเสนอและส่วนประกอบแอปพลิเคชัน (DBMS และแอปพลิเคชันโปรแกรม) โปรโตคอลการแลกเปลี่ยนคือชุดของการเรียกระดับต่ำไปยังการดำเนินการระบบไฟล์ ตามกฎแล้วสถาปัตยกรรมนี้ที่นำไปใช้โดยใช้ DBMS ส่วนบุคคลมีข้อเสียที่ชัดเจน - การรับส่งข้อมูลเครือข่ายสูงและการขาดการเข้าถึงทรัพยากรแบบรวมศูนย์
ด้วยการถือกำเนิดของเซิร์ฟเวอร์ฐานข้อมูลพิเศษเครื่องแรก ความเป็นไปได้ของการนำโมเดลการเข้าถึงฐานข้อมูลระยะไกลไปใช้ที่แตกต่างกันจึงเป็นไปได้ ในกรณีนี้ เคอร์เนล DBMS ทำงานบนเซิร์ฟเวอร์ และมีการจัดหาโปรโตคอลการแลกเปลี่ยนโดยใช้ภาษา SQL แนวทางนี้เมื่อเปรียบเทียบกับไฟล์เซิร์ฟเวอร์ จะช่วยลดภาระเครือข่ายและการรวมอินเทอร์เฟซไคลเอ็นต์-เซิร์ฟเวอร์เข้าด้วยกัน อย่างไรก็ตาม ปริมาณการใช้เครือข่ายยังคงค่อนข้างสูง และยังเป็นไปไม่ได้เลยที่จะจัดการแอปพลิเคชันอย่างน่าพอใจ เนื่องจากฟังก์ชันต่างๆ ถูกรวมไว้ในโปรแกรมเดียว
ต่อมา แนวคิดของเซิร์ฟเวอร์ที่ใช้งานอยู่ได้รับการพัฒนา ซึ่งใช้กลไกขั้นตอนการจัดเก็บ สิ่งนี้ทำให้ส่วนหนึ่งของส่วนประกอบแอปพลิเคชันถูกถ่ายโอนไปยังเซิร์ฟเวอร์ (โมเดลแอปพลิเคชันแบบกระจาย) ขั้นตอนจะถูกจัดเก็บไว้ในพจนานุกรมฐานข้อมูล แชร์ระหว่างไคลเอนต์หลายตัว และดำเนินการบนคอมพิวเตอร์เครื่องเดียวกันกับเซิร์ฟเวอร์ SQL ข้อดีของแนวทางนี้: การบริหารฟังก์ชันแอปพลิเคชันแบบรวมศูนย์เป็นไปได้ การรับส่งข้อมูลเครือข่ายจะลดลงอย่างมาก (เนื่องจากการเรียกไปยังกระบวนงานที่เก็บไว้จะถูกส่งมากกว่าการสืบค้น SQL) ข้อเสียคือเครื่องมือที่จำกัดในการพัฒนาขั้นตอนการจัดเก็บเมื่อเปรียบเทียบกับภาษาวัตถุประสงค์ทั่วไป (C และ Pascal)
ในทางปฏิบัติ ปัจจุบันมักใช้แนวทางแบบผสม:
· ฟังก์ชันแอปพลิเคชันที่ง่ายที่สุดจะดำเนินการตามขั้นตอนที่เก็บไว้บนเซิร์ฟเวอร์
· ฟังก์ชั่นที่ซับซ้อนมากขึ้นจะถูกนำไปใช้กับไคลเอนต์โดยตรงในแอปพลิเคชันโปรแกรม
ผู้จำหน่าย DBMS เชิงพาณิชย์จำนวนหนึ่งได้ประกาศแผนการใช้กลไกการดำเนินการตามขั้นตอนที่เก็บไว้โดยใช้ภาษา Java สิ่งนี้สอดคล้องกับแนวคิดของ "ไคลเอ็นต์แบบบาง" ซึ่งมีหน้าที่ในการแสดงข้อมูลเท่านั้น (แบบจำลองการนำเสนอข้อมูลระยะไกล)
ล่าสุดก็มีแนวโน้มการใช้โมเดลแอปพลิเคชันแบบกระจายเช่นกัน คุณสมบัติที่เป็นลักษณะเฉพาะของแอปพลิเคชันดังกล่าวคือการแบ่งตรรกะของแอปพลิเคชันออกเป็นสองส่วนขึ้นไป ซึ่งแต่ละส่วนสามารถดำเนินการบนคอมพิวเตอร์เครื่องอื่นได้ ส่วนเฉพาะของแอปพลิเคชันจะสื่อสารถึงกัน แลกเปลี่ยนข้อความในรูปแบบที่ตกลงไว้ล่วงหน้า ในกรณีนี้ สถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์แบบสองระดับจะกลายเป็นสามระดับ และในบางกรณี อาจมีลิงก์เพิ่มเติม
5.1.3. การตรวจสอบธุรกรรม
ในกรณีที่ระบบสารสนเทศรวมแหล่งข้อมูลและเซิร์ฟเวอร์แอปพลิเคชันที่แตกต่างกันจำนวนมากเพียงพอ คำถามก็เกิดขึ้นเกี่ยวกับการจัดการส่วนประกอบทั้งหมดอย่างเหมาะสมที่สุด ในกรณีนี้ มีการใช้เครื่องมือพิเศษ - มอนิเตอร์การประมวลผลธุรกรรม (มักเรียกง่ายๆว่า "มอนิเตอร์ธุรกรรม") ในขณะเดียวกัน แนวคิดของธุรกรรมก็ขยายออกไปเมื่อเทียบกับสิ่งที่ทราบในทฤษฎีฐานข้อมูล ในกรณีนี้ นี่ไม่ใช่การดำเนินการแบบอะตอมมิกในฐานข้อมูล แต่เป็นการดำเนินการใดๆ ในระบบ เช่น การออกข้อความ การเขียนลงในไฟล์ดัชนี การพิมพ์รายงาน ฯลฯ
ในการสื่อสารระหว่างแอปพลิเคชันโปรแกรมและการตรวจสอบธุรกรรม จะใช้ API เฉพาะ (Application Program Interface) ซึ่งใช้เป็นไลบรารีที่มีการเรียกไปยังฟังก์ชันพื้นฐาน (สร้างการเชื่อมต่อ เรียกใช้บริการเฉพาะ ฯลฯ) แอปพลิเคชันเซิร์ฟเวอร์ (บริการ) ก็ถูกสร้างขึ้นโดยใช้ API นี้เช่นกัน แต่ละบริการจะได้รับการกำหนดชื่อที่ไม่ซ้ำกัน การตรวจสอบธุรกรรมที่ได้รับคำขอจากแอปพลิเคชันโปรแกรม จะส่งผ่านการโทรไปยังบริการที่เหมาะสม (หากไม่ได้ทำงานอยู่ กระบวนการที่จำเป็นจะเกิดขึ้น) และหลังจากประมวลผลคำขอโดยแอปพลิเคชันเซิร์ฟเวอร์แล้ว ก็จะส่งคืนผลลัพธ์ไปที่ ลูกค้า. โปรโตคอล XA ได้รับการพัฒนาสำหรับการโต้ตอบของการตรวจสอบธุรกรรมกับเซิร์ฟเวอร์ฐานข้อมูล การมีอินเทอร์เฟซแบบรวมดังกล่าวทำให้สามารถใช้ DBMS ที่แตกต่างกันหลายตัวภายในแอปพลิเคชันเดียวได้
การใช้การมอนิเตอร์ธุรกรรมบนระบบขนาดใหญ่ให้ประโยชน์ดังต่อไปนี้:
· ความเข้มข้นของฟังก์ชันแอปพลิเคชันทั้งหมดบนแอปพลิเคชันเซิร์ฟเวอร์ให้ความเป็นอิสระอย่างมากทั้งจากการใช้งานส่วนต่อประสานกับผู้ใช้และจากวิธีการจัดการทรัพยากรเฉพาะ นอกจากนี้ยังรับประกันการดูแลระบบแอปพลิเคชันแบบรวมศูนย์ เนื่องจากแอปพลิเคชันทั้งหมดอยู่ในที่เดียว และไม่ "กระจาย" ทั่วทั้งเครือข่ายระหว่างเวิร์กสเตชันไคลเอนต์
· การตรวจสอบธุรกรรมสามารถเริ่มและหยุดแอปพลิเคชันเซิร์ฟเวอร์ได้เอง ขึ้นอยู่กับโหลดของเครือข่ายและทรัพยากรการประมวลผล มันสามารถถ่ายโอนหรือคัดลอกส่วนหนึ่งของกระบวนการเซิร์ฟเวอร์ไปยังโหนดอื่น สิ่งนี้ทำให้มั่นใจได้ว่ามีความสมดุลของโหลด
· ให้การกำหนดค่าระบบแบบไดนามิก เช่น สามารถเพิ่มเซิร์ฟเวอร์ทรัพยากรหรือแอปพลิเคชันเซิร์ฟเวอร์ใหม่ได้โดยไม่ต้องหยุดการทำงาน
· ความน่าเชื่อถือของระบบเพิ่มขึ้นเพราะว่า ในกรณีที่เกิดความล้มเหลว แอปพลิเคชันเซิร์ฟเวอร์สามารถย้ายไปยังคอมพิวเตอร์สำรองได้
· เป็นไปได้ที่จะจัดการฐานข้อมูลแบบกระจาย (สำหรับรายละเอียดเพิ่มเติม ดูย่อหน้าถัดไป)
5.2. กำลังประมวลผลข้อมูลที่กระจาย
ในธุรกิจยุคใหม่ มักจำเป็นต้องให้การเข้าถึงข้อมูลเดียวกันแก่กลุ่มผู้ใช้ที่อยู่ห่างไกลจากกันทางภูมิศาสตร์ ตัวอย่างจะเป็นธนาคารที่มีหลายสาขา สาขาเหล่านี้อาจตั้งอยู่ในเมือง ประเทศ หรือแม้แต่ในทวีปที่แตกต่างกัน อย่างไรก็ตาม มีความจำเป็นต้องจัดระเบียบการประมวลผลธุรกรรมทางการเงิน (การโอนเงินระหว่างบัญชี) ระหว่างสาขา ต้องเห็นผลการทำธุรกรรมทางการเงินพร้อมกันทุกสาขา
มีสองวิธีในการจัดการประมวลผลข้อมูลแบบกระจาย
1. เทคโนโลยีฐานข้อมูลแบบกระจายฐานข้อมูลดังกล่าวประกอบด้วยส่วนของข้อมูลที่อยู่บนโหนดเครือข่ายต่างๆ จากมุมมองของผู้ใช้ ดูเหมือนว่าข้อมูลทั้งหมดจะถูกจัดเก็บไว้ในที่เดียว โดยปกติแล้ว โครงการดังกล่าวต้องการประสิทธิภาพและความน่าเชื่อถือของช่องทางการสื่อสารที่เข้มงวด
2. เทคโนโลยีการจำลองแบบในกรณีนี้ ข้อมูลของคอมพิวเตอร์ทุกเครื่องจะถูกทำซ้ำในแต่ละโหนดเครือข่าย ในกรณีนี้:
· เฉพาะการดำเนินการแก้ไขข้อมูลเท่านั้นที่จะถูกส่ง ไม่ใช่ตัวข้อมูลเอง
· การส่งข้อมูลสามารถเป็นแบบอะซิงโครนัส (ไม่พร้อมกันสำหรับโหนดที่แตกต่างกัน)
· ข้อมูลอยู่ในตำแหน่งที่มีการประมวลผล
ทำให้สามารถลดความต้องการแบนด์วิธของช่องทางการสื่อสารได้ นอกจากนี้ หากสายการสื่อสารของคอมพิวเตอร์ล้มเหลว ผู้ใช้โหนดอื่นก็สามารถทำงานได้ต่อไป อย่างไรก็ตาม การทำเช่นนี้จะทำให้สถานะฐานข้อมูลไม่เท่ากันสำหรับผู้ใช้ที่แตกต่างกันในเวลาเดียวกัน ดังนั้นจึงเป็นไปไม่ได้ที่จะขจัดข้อขัดแย้งระหว่างสำเนาสองชุดของบันทึกเดียวกัน