ชุมชน Rails กำลังหันมาใช้ Rails Engines เป็นโซลูชันสำหรับการสร้างแอปพลิเคชันแบบโมดูลาร์มากขึ้น ซึ่งได้รับแรงผลักดันจากการอพิเคราะห์โปรเจกต์ Active Storage Dashboard การเปลี่ยนแปลงนี้แสดงถึงความสงสัยที่เพิ่มขึ้นต่อสถาปัตยกรรม microservices และการชื่นชมแอปพลิเคชันแบบ monolithic ที่มีโครงสร้างภายในที่ดีกว่า
ความซับซ้อนของ Microservices ผลักดันให้ค้นหาทางเลือก
การอภิปรายในชุมชนเผยให้เห็นความผิดหวังอย่างกว้างขวางต่อการนำ microservices มาใช้งาน นักพัฒนาหลายคนรายงานว่าทีมงานมักจะใช้ microservices เพื่อความเป็นโมดูลาร์มากกว่าความต้องการในการขยายขนาดที่แท้จริง ทำให้เกิดความซับซ้อนที่ไม่จำเป็น การอภิปรายเน้นย้ำว่า microservices ได้รับการออกแบบมาเพื่อแยกแอปพลิเคชันแบบ monolithic แต่มักจะสร้างปัญหามากกว่าที่จะแก้ไข
ส่วนใหญ่แล้วผู้คนไปใช้ microservices ด้วยเหตุผลที่ผิด และพวกเขาจะเสียใจเรื่องนั้นเป็นปีๆ
Rails Engines เสนอทางกลางที่น่าสนใจ พวกมันช่วยให้นักพัฒนาสร้างโมดูลที่สมบูรณ์และครบครันภายในแอปพลิเคชันเดียว รวมถึง controllers, views, models, routes และ database migrations วิธีการนี้ให้ประโยชน์ด้านความเป็นโมดูลาร์ที่ทีมต้องการโดยไม่มีภาระงานด้านการดำเนินงานของระบบแบบกระจาย
ส่วนประกอบของ Rails Engine
- Controllers, views และ models
- Routes และ database migrations
- Assets และไฟล์การกำหนดค่า
- สามารถติดตั้งภายในแอปพลิเคชัน Rails ที่มีอยู่แล้วได้
- รองรับความเข้ากันได้ข้ามเวอร์ชัน ( Rails 5.2 ถึง 7.1)
ประโยชน์ทางเทคนิคของสถาปัตยกรรมแบบ Engine
ตัวอย่าง Active Storage Dashboard แสดงให้เห็นว่า Rails Engines สามารถห่อหุ้มฟังก์ชันการทำงานที่ซับซ้อนในขณะที่ยังคงความเรียบง่าย ต่างจาก microservices, engines ใช้การเชื่อมต่อฐานข้อมูลเดียวกัน ระบบการยืนยันตัวตน และ deployment pipeline เดียวกันกับแอปพลิเคชันหลัก สิ่งนี้ช่วยขจัดความท้าทายทั่วไปของระบบแบบกระจาย เช่น network latency, service discovery และ data consistency
นักพัฒนาในชุมชนชื่นชมเป็นพิเศษในวิธีที่ engines จัดการการแยกความกังวลภายใน monolithic deployments แอปพลิเคชัน Rails แบบดั้งเดิมรองรับประเภทบริการหลายแบบอยู่แล้ว - web servers รัน Puma ในขณะที่ background jobs ใช้ Sidekiq - ทั้งหมดใช้ codebase เดียวกัน Engines ขยายรูปแบบนี้โดยอนุญาตให้แยกทางตรรกะโดยไม่ต้องแยกทางกายภาพ
คุณสมบัติของ Active Storage Dashboard
- เมตริกการจัดเก็บข้อมูลแบบเรียลไทม์และสстатистิกการใช้งาน
- ความสามารถในการกรองข้อมูลขั้นสูงสำหรับการจัดการไฟล์
- ทรัพยากรที่สามารถดาวน์โหลดได้เพื่อการปฏิบัติตามข้อกำหนดข้อมูล
- อินเทอร์เฟซแดชบอร์ดที่ปรับแต่งได้
- รองรับการจัดเก็บข้อมูลแบบเครือข่ายและแบบมิเรอร์
ข้อมูลเชิงลึกการนำไปใช้ในโลกจริง
การอภิปรายในชุมชนเผยให้เห็นข้อพิจารณาเชิงปฏิบัติสำหรับการพัฒนา engine การตั้งชื่อ namespace ที่เหมาะสมป้องกันความขัดแย้งระหว่าง engines และแอปพลิเคชันหลัก ความยืดหยุ่นในการกำหนดค่าช่วยให้ engines ปรับตัวเข้ากับระบบการยืนยันตัวตนและความต้องการของแอปพลิเคชันที่แตกต่างกัน ความเข้ากันได้ข้าม Rails version ทำให้มั่นใจว่า engines ทำงานได้ในสภาพแวดล้อมโปรเจกต์ที่แตกต่างกัน
การนำไปใช้ที่ไม่ขึ้นกับฐานข้อมูลและ dependencies ภายนอกที่น้อยที่สุดช่วยลดความยุ่งยากในการรวมระบบ แทนที่จะพึ่งพา third-party gems สำหรับฟีเจอร์ต่างๆ เช่น pagination, engines ที่ออกแบบมาอย่างดีจะนำฟังก์ชันหลักมาใช้โดยตรง ลดความขัดแย้งของเวอร์ชันและภาระการบำรุงรักษา
แนวทางปฏิบัติที่ดีที่สุดสำหรับการพัฒนา Engine
- การใช้ namespace ที่เหมาะสมเพื่อป้องกันความขัดแย้ง
- การพึ่พาภายนอกให้น้อยที่สุด
- กลยุทธ์การยืนยันตัวตนที่สามารถกำหนดค่าได้
- การใช้งานที่ไม่ขึ้นกับฐานข้อมูลใดฐานข้อมูลหนึ่ง
- เอกสารประกอบและตัวอย่างที่ครอบคลุม
มุมมองของอุตสาหกรรมต่อตัวเลือกสถาปัตยกรรม
การอภิปรายขยายไปไกลกว่า Rails ถึงการตัดสินใจด้านสถาปัตยกรรมที่กว้างขึ้น นักพัฒนาบางคนปกป้อง microservices สำหรับกรณีการใช้งานเฉพาะ เช่น ความยืดหยุ่นและการขยายขนาดแบบอิสระ อย่างไรก็ตาม ฉันทามติของชุมชนแนะนำว่าแอปพลิเคชันส่วนใหญ่ไม่ต้องการความซับซ้อนที่ microservices นำมา
Rails Engines แสดงถึงวิธีการที่เป็นผู้ใหญ่ต่อความเป็นโมดูลาร์ที่มีอยู่มาหลายปีแต่ได้รับความสนใจน้อยกว่ารูปแบบสถาปัตยกรรมใหม่ๆ พวกมันเสนอการนำ code กลับมาใช้ใหม่ข้ามโปรเจกต์ การแยกส่วน monolith แบบค่อยเป็นค่อยไป และโอกาสสำหรับการแจกจ่าย open source - ทั้งหมดนี้โดยไม่มีความซับซ้อนด้านการดำเนินงานของระบบแบบกระจาย
การอภิปรายเน้นย้ำการเปลี่ยนแปลงพื้นฐานในวิธีที่นักพัฒนาคิดเกี่ยวกับสถาปัตยกรรมแอปพลิเคชัน แทนที่จะใช้ระบบแบบกระจายเป็นค่าเริ่มต้น ทีมงานกำลังค้นพบพลังของแอปพลิเคชันแบบ monolithic ที่มีโครงสร้างดีซึ่งเสริมด้วยส่วนประกอบแบบโมดูลาร์อย่าง Rails Engines
อ้างอิง: Buidling Modular Rails Applications: A Deep Dive into Ralls Engines Through Active Storage Dashboard