Monolith Case Study: Silicon Sandwiches (กรณีศึกษา Monolith: Silicon Sandwiches)
ใน architecture kata ของ Silicon Sandwiches ใน Chapter 5 หลังจากการวิเคราะห์คุณลักษณะสถาปัตยกรรม เราสรุปว่า quantum เดียวก็เพียงพอสำหรับการ implement ระบบนี้ เนื่องจากเรากำลังดูแอปพลิเคชันง่าย ๆ ที่ไม่มีงบประมาณมากนัก ความเรียบง่ายของ monolith จึงน่าสนใจ
อย่างไรก็ตาม เราสร้าง component design สองแบบสำหรับ Silicon Sandwiches แบบหนึ่งแบ่งตามโดเมน อีกแบบหนึ่งแบ่งตามเทคนิค— คุณอาจต้องย้อนกลับไปดู Chapter 5 หากต้องการทบทวน ในบทนี้ เราจะกลับมาที่ทางออกง่าย ๆ เหล่านั้นเพื่อสร้างการออกแบบสำหรับแต่ละตัวเลือก และพูดถึง trade-off ของแต่ละแบบ เราจะเริ่มด้วยสถาปัตยกรรมแบบ monolithic
Modular Monolith (Modular Monolith)
Modular monolith สร้าง component ที่เน้นโดเมนโดยมีฐานข้อมูลเดียว deploy เป็น quantum เดียว การออกแบบ modular monolith สำหรับ Silicon Sandwiches ปรากฏอยู่ใน Figure 19-3
นี่คือ monolith ที่มี relational database เดียว implement ด้วย UI แบบเว็บเดียว (พร้อมข้อพิจารณาอย่างรอบคอบ สำหรับอุปกรณ์มือถือ) เพื่อควบคุมค่าใช้จ่ายโดยรวม แต่ละโดเมนที่เราระบุไว้ปรากฏเป็น component หนึ่งตัว หากมีเวลาและทรัพยากรเพียงพอ ลองพิจารณาแยกตารางและ database asset อื่น ๆ ในลักษณะเดียวกับ domain component ซึ่งจะทำให้การ migrate สถาปัตยกรรมนี้ไปเป็น distributed architecture ในอนาคตง่ายขึ้นมาก หากมี requirement ในอนาคตที่ต้องการเช่นนั้น
Figure 19-3. การ implement Silicon Sandwiches แบบ modular monolith
เนื่องจากสถาปัตยกรรมสไตล์เองไม่ได้รองรับการปรับแต่งโดยธรรมชาติ ฟีเจอร์นี้จึงควรกลายเป็นส่วนหนึ่งของการออกแบบ โดเมน ในกรณีนี้ สถาปนิกออกแบบ endpoint Override ซึ่งนักพัฒนาสามารถอัปโหลดการปรับแต่งแต่ละอย่างได้ ตามมาด้วยการต้องมั่นใจว่าทุก domain component อ้างอิงถึง component Override สำหรับทุกคุณลักษณะที่ปรับแต่งได้ (การตรวจสอบเรื่องนี้เหมาะมากที่จะให้ architectural fitness function ทำหน้าที่)
Microkernel (Microkernel)
หนึ่งในคุณลักษณะสถาปัตยกรรมที่เราระบุไว้ใน Silicon Sandwiches คือความสามารถในการปรับแต่ง (customizability) Figure 19-4 ใช้ domain/architecture isomorphism เพื่อแสดงว่าสิ่งนี้อาจถูก implement ด้วยสถาปัตยกรรม microkernel ได้อย่างไร
Figure 19-4. การ implement Silicon Sandwiches แบบ microkernel
ใน Figure 19-4 core system ประกอบด้วย domain component และ relational database เดียว เช่นเดียวกับการออกแบบ modular monolith การประสานงานอย่างรอบคอบระหว่างโดเมนกับการออกแบบข้อมูลจะช่วยให้การ migrate core ไปเป็น distributed architecture ในอนาคตง่ายขึ้น การปรับแต่งแต่ละอย่างปรากฏอยู่ใน plug-in ส่วนที่ใช้ร่วมกันปรากฏอยู่ใน plug-in ชุดเดียว (พร้อมฐานข้อมูลของตัวเอง) และชุดของ plug-in เฉพาะที่แต่ละอันมีข้อมูลของตัวเอง เนื่องจากไม่มี plug-in ตัวไหน ต้อง couple กับ plug-in อื่น พวกมันจึงรักษาข้อมูลของตัวเองและคง decoupled ไว้ได้
องค์ประกอบเฉพาะอีกอย่างของการออกแบบนี้คือการใช้ รูปแบบ Backends for Frontends (BFF) ทำให้เลเยอร์ API กลายเป็น microkernel adapter บาง ๆ นอกเหนือจาก core architecture เลเยอร์ API ให้ข้อมูลทั่วไป จาก backend ซึ่ง BFF adapter จะแปลงให้เป็นรูปแบบที่เหมาะสมสำหรับอุปกรณ์ frontend ตัวอย่างเช่น BFF สำหรับ iOS รับ output ทั่วไปจาก backend มาปรับแต่งรูปแบบข้อมูล การแบ่งหน้า latency และปัจจัยอื่น ๆ ให้ตรงกับสิ่งที่ แอปพลิเคชัน iOS แบบ native คาดหวัง การสร้าง BFF adapter แต่ละตัวช่วยให้ได้ user interface ที่สมบูรณ์ที่สุด เท่าที่จะเป็นไปได้ และทำให้ขยายสถาปัตยกรรมเพื่อรองรับอุปกรณ์อื่น ๆ ในอนาคตได้—นี่คือหนึ่งในประโยชน์ของสไตล์ microkernel
การสื่อสารภายในสถาปัตยกรรม Silicon Sandwiches ทั้งสองแบบนี้สามารถเป็น synchronous ได้ เนื่องจากสถาปัตยกรรม ไม่ต้องการ performance หรือ elasticity ที่สูงมาก และไม่มีการดำเนินการไหนที่ใช้เวลานาน