คำเตือน: โพสต์ใหญ่ความคิดเห็นบางส่วนคลุมเครือ 'ทำในสิ่งที่ดีที่สุดสำหรับคุณ' ข้อสรุป
โดยทั่วไปสิ่งนี้จะทำเพื่อใช้ 'สถาปัตยกรรมหกเหลี่ยม' รอบฐานข้อมูลของคุณ คุณสามารถมีเว็บแอปพลิเคชั่นมือถือแอปพลิเคชั่นเดสก์ท็อปผู้นำเข้าจำนวนมากและการประมวลผลพื้นหลังทั้งหมดใช้ฐานข้อมูลของคุณอย่างสม่ำเสมอ แน่นอนว่าคุณสามารถทำสิ่งเดียวกันให้สำเร็จได้โดยการเขียนไลบรารีที่มีรูปแบบหลากหลายเพื่อเข้าถึงฐานข้อมูลของคุณและการที่กระบวนการทั้งหมดของคุณใช้ไลบรารีนั้น และแน่นอนถ้าคุณอยู่ในร้านเล็ก ๆ ที่มีระบบที่ง่ายมากนั่นอาจเป็นเส้นทางที่ดีกว่า มันเป็นวิธีที่ง่ายกว่าและถ้าคุณไม่ต้องการความสามารถขั้นสูงของระบบที่ซับซ้อนมากขึ้นทำไมต้องจ่ายสำหรับความซับซ้อน อย่างไรก็ตามหากคุณทำงานกับระบบที่มีขนาดใหญ่และซับซ้อนซึ่งทุกคนต้องมีปฏิสัมพันธ์กับฐานข้อมูลของคุณ
ความเป็นอิสระของแพลตฟอร์ม & การบำรุงรักษา
หากคุณมีฐานข้อมูลและคุณเขียนไลบรารี Python เพื่อโต้ตอบกับฐานข้อมูลนั้นและทุกคนก็ดึงเข้าไปในห้องสมุดนั้นเพื่อโต้ตอบกับฐานข้อมูลนั่นยอดเยี่ยมมาก แต่สมมุติว่าคุณต้องเขียนแอพมือถือทันใดนั้นแอพมือถือนั้นก็ต้องคุยกับฐานข้อมูลด้วย และวิศวกร iOS ของคุณไม่ใช้ Python และวิศวกร Android ของคุณไม่ใช้ Python บางทีพวก iOS ต้องการใช้ภาษาของ Apple และวิศวกร Android ต้องการใช้ Java ถ้าอย่างนั้นคุณจะเขียนและดูแลรักษา data access library ของคุณใน 3 ภาษา บางที iOS และ Android devs ตัดสินใจที่จะใช้บางอย่างเช่น Xamarin เพื่อเพิ่มรหัสที่พวกเขาสามารถแบ่งปันได้สูงสุด สมบูรณ์แบบยกเว้นคุณอาจจะต้องย้ายพอร์ตไลบรารีการเข้าถึงข้อมูลไปยัง. NET แล้ว บริษัท ของคุณเพิ่งซื้อ บริษัท อื่นที่ ' เว็บแอปพลิเคชั่นเป็นผลิตภัณฑ์ที่แตกต่างกัน แต่เกี่ยวข้องกันและธุรกิจต้องการรวมข้อมูลบางส่วนจากแพลตฟอร์ม บริษัท ของคุณเข้ากับแพลตฟอร์มของ บริษัท ย่อยที่ได้มาใหม่ มีเพียงปัญหาเดียว: บริษัท ย่อยเริ่มต้นแล้วและตัดสินใจที่จะเขียนใบสมัครจำนวนมากใน Dart นอกจากนี้ไม่ว่าจะด้วยเหตุผลใด (เหตุผลที่อาจอยู่นอกเหนือการควบคุมของคุณ) ทีมงานมือถือที่เป็นนักบินของ Xamarin ตัดสินใจว่ามันไม่ได้มีไว้สำหรับพวกเขาและพวกเขาต้องการใช้เครื่องมือและภาษาเฉพาะสำหรับอุปกรณ์พกพาที่พวกเขาจะพัฒนา แต่ในขณะที่คุณอยู่ในช่วงนั้นทีมงานของคุณได้ส่งมอบห้องสมุดการเข้าถึงข้อมูลส่วนใหญ่ของคุณใน. NET และทีมอื่นใน บริษัท กำลังเขียนข้อมูลการรวม Salesforce ที่บ้าคลั่งและตัดสินใจทำสิ่งนั้นใน. NET ตั้งแต่นั้นมา เป็นห้องสมุดการเข้าถึงข้อมูลสำหรับแล้ว
ดังนั้นตอนนี้เนื่องจากเหตุการณ์ที่เกิดขึ้นจริงคุณจึงมีไลบรารีการเข้าถึงข้อมูลของคุณที่เขียนใน Python, .NET, Swift, Java และ Dart พวกเขาไม่ได้ดีอย่างที่คุณต้องการ คุณไม่สามารถใช้ ORM ได้อย่างมีประสิทธิภาพตามที่คุณต้องการเนื่องจากแต่ละภาษามีเครื่องมือ ORM ที่แตกต่างกันดังนั้นคุณต้องเขียนโค้ดเพิ่มเติมมากกว่าที่คุณต้องการ และคุณไม่สามารถอุทิศเวลาให้กับแต่ละชาติได้มากเท่าที่คุณต้องการเพราะมี 5 แห่ง และห้องสมุดรุ่น Dart มีขนดกโดยเฉพาะอย่างยิ่งเพราะคุณต้องทำสิ่งที่ทำธุรกรรมของคุณเองสำหรับห้องสมุดเพราะห้องสมุดและการสนับสนุนไม่ได้อยู่ที่นั่นจริงๆ คุณพยายามทำกรณีที่เป็นเช่นนี้แอปพลิเคชัน Dart ควรมีฟังก์ชั่นอ่านอย่างเดียวสำหรับฐานข้อมูลของคุณ แต่ธุรกิจได้ตัดสินใจแล้วว่าคุณสมบัติใด ๆ ที่พวกเขาวางแผนไว้นั้นคุ้มค่ากับความพยายามพิเศษ และปรากฎว่ามีข้อผิดพลาดในตรรกะการตรวจสอบความถูกต้องบางอย่างที่มีอยู่ในสาขาทั้งหมดของไลบรารีการเข้าถึงข้อมูลของคุณ ตอนนี้คุณต้องเขียนการทดสอบและรหัสเพื่อแก้ไขข้อผิดพลาดนี้ในไลบรารีทั้งหมดเหล่านี้รับการตรวจสอบโค้ดสำหรับการเปลี่ยนแปลงทั้งหมดของไลบรารีเหล่านี้รับ QA ในไลบรารีทั้งหมดเหล่านี้และเผยแพร่การเปลี่ยนแปลงของคุณไปยังระบบทั้งหมดโดยใช้ ห้องสมุดเหล่านี้ ในขณะเดียวกันลูกค้าของคุณก็ไม่พอใจและถูกพาไปที่ Twitter โดยรวมกลุ่มของความหยาบคายที่คุณไม่เคยคาดคิดมาก่อนและสามารถตั้งเป้าหมายไว้ที่ผลิตภัณฑ์เรือธงของ บริษัท ของคุณ และเจ้าของผลิตภัณฑ์ตัดสินใจที่จะไม่เข้าใจเกี่ยวกับสถานการณ์เลย
โปรดเข้าใจว่าในบางสภาพแวดล้อมตัวอย่างข้างต้นคือทุกอย่างยกเว้นการวางแผน ยังพิจารณาด้วยว่าลำดับเหตุการณ์นี้อาจคลี่คลายในช่วงเวลาไม่กี่ปี โดยทั่วไปเมื่อคุณไปถึงจุดที่สถาปนิกและนักธุรกิจเริ่มพูดคุยเกี่ยวกับการเชื่อมต่อระบบอื่น ๆ กับฐานข้อมูลของคุณนั่นคือเมื่อคุณต้องการ 'วาง REST API หน้าฐานข้อมูล' ลงในแผนงานของคุณ พิจารณาก่อนว่าเมื่อใดที่ชัดเจนว่าฐานข้อมูลนี้กำลังจะเริ่มถูกแชร์โดยระบบบางระบบแสดงว่าเว็บเซอร์วิส / REST API นั้นอยู่ข้างหน้า การแก้ไขข้อผิดพลาดในการตรวจสอบของคุณจะเร็วและง่ายขึ้นมากเพราะคุณทำครั้งเดียวแทนที่จะเป็น 5 ครั้ง และการปล่อยการแก้ไขจะง่ายกว่ามากในการประสานงานเพราะคุณ
TLDR; ง่ายกว่าในการรวมศูนย์ตรรกะการเข้าถึงข้อมูลและรักษาไคลเอ็นต์ HTTP ที่บางมากกว่าเพื่อกระจายตรรกะการเข้าถึงข้อมูลไปยังแต่ละแอปพลิเคชันที่ต้องการเข้าถึงข้อมูล ในความเป็นจริงไคลเอนต์ HTTP ของคุณอาจถูกสร้างขึ้นจาก meta-data ในระบบขนาดใหญ่ REST API ช่วยให้คุณรักษารหัสน้อยลง
ประสิทธิภาพและความยืดหยุ่น
บางคนอาจเชื่อว่าการพูดคุยกับฐานข้อมูลโดยตรงแทนที่จะเข้าใช้บริการเว็บก่อนจะเร็วกว่า หากคุณมีเพียงแอปพลิเคชั่นเดียวนั่นเป็นเรื่องจริง แต่ในระบบที่ใหญ่กว่าฉันไม่เห็นด้วยกับความเชื่อมั่น ในที่สุดในระดับหนึ่งก็จะเป็นประโยชน์อย่างมากในการวางแคชไว้หน้าฐานข้อมูล บางทีคุณอาจใช้ไฮเบอร์เนตและต้องการติดตั้งกริด Infinispan เป็นแคช L2 หากคุณมีเซิร์ฟเวอร์จำนวน 4 เซิร์ฟเวอร์ที่ทำหน้าที่โฮสต์บริการเว็บของคุณแยกจากแอปพลิเคชันของคุณคุณสามารถที่จะมีโทโพโลยีแบบฝังที่เปิดใช้งานการจำลองแบบซิงโครนัส หากคุณพยายามใส่ในคลัสเตอร์ของ 30 แอพพลิเคชันเซิร์ฟเวอร์ค่าใช้จ่ายในการเปิดการจำลองแบบในการตั้งค่านั้นจะมากเกินไปดังนั้นคุณจะ จะต้องเรียกใช้ Infinispan ในโหมดกระจายหรือในโทโพโลยีเฉพาะบางประเภทและในทันทีไฮเบอร์เนตก็ต้องออกไปนอกเครือข่ายเพื่อที่จะอ่านจากแคช นอกจากนี้ Infinispan ใช้งานได้กับ Java เท่านั้น หากคุณมีภาษาอื่นคุณจะต้องใช้วิธีแก้ปัญหาแคชอื่น ๆ เครือข่ายค่าใช้จ่ายที่ต้องไปจากแอปพลิเคชันของคุณไปยังบริการเว็บของคุณก่อนถึงฐานข้อมูลจะถูกชดเชยอย่างรวดเร็วโดยความต้องการใช้โซลูชันแคชที่ซับซ้อนมากขึ้นซึ่งโดยทั่วไปจะมาพร้อมกับค่าใช้จ่ายของตนเอง
นอกจากนี้เลเยอร์ HTTP ของ REST API ของคุณยังให้กลไกการแคชที่มีค่าอื่น เซิร์ฟเวอร์สำหรับ REST API ของคุณสามารถวางส่วนหัวแคชไว้บนการตอบสนองของพวกเขาและการตอบสนองเหล่านี้สามารถแคชที่เลเยอร์เครือข่ายซึ่งปรับขนาดได้ดีเป็นพิเศษ ในการตั้งค่าขนาดเล็กที่มีเซิร์ฟเวอร์หนึ่งหรือสองเครื่องทางออกที่ดีที่สุดของคุณคือการใช้แคชหน่วยความจำในแอปพลิเคชันเมื่อพูดถึงฐานข้อมูล แต่ในแพลตฟอร์มขนาดใหญ่ที่มีแอปพลิเคชันจำนวนมากที่ทำงานบนเซิร์ฟเวอร์จำนวนมาก เครือข่ายเพื่อจัดการกับแคชของคุณเพราะเมื่อกำหนดค่าบางอย่างเช่น squid หรือ varnish หรือ nginx สามารถปรับขนาดให้อยู่ในระดับบ้าบนฮาร์ดแวร์ที่ค่อนข้างเล็ก คำขอนับร้อยนับพันหรือล้านต่อวินาทีของปริมาณงานมีราคาถูกกว่ามากที่จะทำจากแคช HTTP กว่าจากแอพพลิเคชันเซิร์ฟเวอร์หรือฐานข้อมูล
ยิ่งไปกว่านั้นการมีลูกค้าจำนวนมากชี้ไปที่ฐานข้อมูลของคุณแทนที่จะให้พวกเขาทั้งหมดชี้ไปที่เซิร์ฟเวอร์เพียงไม่กี่แห่งซึ่งชี้ไปที่ฐานข้อมูลสามารถปรับฐานข้อมูลและการเชื่อมต่อร่วมกันได้ยากขึ้น โดยทั่วไปเวิร์กโหลดที่เกิดขึ้นจริงส่วนใหญ่บนแอ็พพลิเคชันเซิร์ฟเวอร์คือเนื้อหาของแอปพลิเคชัน การรอให้ข้อมูลกลับมาจากฐานข้อมูลมักจะใช้เวลานาน แต่โดยทั่วไปจะไม่แพงมากนัก คุณอาจต้องใช้เซิร์ฟเวอร์ 40 เครื่องเพื่อจัดการปริมาณงานของแอปพลิเคชันของคุณ แต่คุณอาจไม่จำเป็นต้องใช้เซิร์ฟเวอร์ 40 เครื่องในการรวบรวมข้อมูลจากฐานข้อมูล หากคุณอุทิศภารกิจนั้นให้กับบริการบนเว็บบริการบนเว็บอาจทำงานบนเซิร์ฟเวอร์น้อยกว่าแอปพลิเคชั่นที่เหลือซึ่งหมายความว่าคุณจะต้องเชื่อมต่อกับฐานข้อมูลน้อยลง สิ่งที่สำคัญเนื่องจากฐานข้อมูลโดยทั่วไปไม่ได้
TLDR; ปรับแต่งขนาดและแคชการเข้าถึงข้อมูลของคุณได้ง่ายขึ้นเมื่อมันเป็นสิ่งที่เกิดขึ้นภายในบริการเว็บเดียวโดยเฉพาะเมื่อมันเป็นสิ่งที่เกิดขึ้นในแอพพลิเคชั่นที่หลากหลายโดยใช้ภาษาและเทคโนโลยีที่แตกต่างกัน
ความคิดสุดท้าย
โปรดอย่ามาจากความคิดนี้"โอ้ว้าวฉันควรใช้ REST APIs เพื่อรับข้อมูลของฉันเสมอ"หรือ"คนโง่นี้พยายามจะบอกว่าเราทำผิดเพราะเว็บแอปของเราพูดคุยกับฐานข้อมูลโดยตรง แต่ สิ่งที่เราใช้งานได้ดี! ". ประเด็นสำคัญที่ฉันพยายามทำคือระบบที่แตกต่างกันและธุรกิจที่แตกต่างกันมีข้อกำหนดที่แตกต่างกัน ในหลายกรณีการวาง REST API ไว้หน้าฐานข้อมูลของคุณก็ไม่สมเหตุสมผล มันเป็นสถาปัตยกรรมที่ซับซ้อนมากขึ้นซึ่งต้องการการพิสูจน์ความซับซ้อนนั้น แต่เมื่อรับประกันความซับซ้อนแล้วคุณจะได้รับประโยชน์มากมายจากการใช้ REST API ความสามารถในการชั่งน้ำหนักข้อกังวลต่าง ๆ และเลือกวิธีการที่เหมาะสมสำหรับระบบของคุณคือสิ่งที่ทำให้วิศวกรที่ดี
นอกจากนี้หาก REST API กำลังได้รับการแก้ไขข้อบกพร่องอาจเป็นไปได้ว่ามีบางอย่างผิดปกติหรือหายไปในภาพนั้น ฉันไม่เชื่อว่าการมีชั้น abstraction ที่เพิ่มเข้ามานั้นทำให้การดีบักนั้นยากขึ้น เมื่อฉันทำงานกับระบบ n-tier ที่มีขนาดใหญ่ฉันต้องการตรวจสอบให้แน่ใจว่าฉันมีบริบทการบันทึกแบบกระจาย บางทีเมื่อผู้ใช้เริ่มต้นคำขอสร้าง GUID สำหรับคำขอนั้นและบันทึกชื่อผู้ใช้ของผู้ใช้นั้นและคำขอที่พวกเขาทำ จากนั้นส่ง GUID นั้นขณะที่แอปพลิเคชันของคุณพูดคุยกับระบบอื่น ด้วยการรวมบันทึกและการจัดทำดัชนีที่เหมาะสมคุณสามารถสืบค้นทั้งแพลตฟอร์มของคุณสำหรับผู้ใช้ที่รายงานปัญหาและมองเห็นการกระทำทั้งหมดของพวกเขาและพวกเขาไหลผ่านระบบเพื่อระบุว่าสิ่งใดผิดพลาดอย่างรวดเร็ว อีกครั้งมันเป็นสถาปัตยกรรมที่ซับซ้อนกว่า
แหล่งที่มา:
http://alistair.cockburn.us/Hexagonal+ar Architecture
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing