สัปดาห์ที่ 3 | เอกสารประกอบการสอน
หน่วยเรียน 1.1 – 1.3
Monolithic, Layered, Client-Server, N-Tier, Pipe-and-Filter
ผู้สอน: อ.ธนิต เกตุแก้ว
หลักสูตรวิศวกรรมซอฟต์แวร์ มทร.ล้านนา
"เมื่อเรารู้ว่าระบบต้องการ Quality อะไร...
เราจะเลือกโครงสร้าง (Architectural Style)
ไหนมาใช้?"
ความหมาย ความแตกต่าง และเหตุผลที่ต้องใช้
โครงร่างแบบซ้ำได้ (Reusable) ของโครงสร้างระบบซอฟต์แวร์ในระดับสูง กำหนดรูปแบบของ Components, Connectors และ Constraints
โซลูชันที่พิสูจน์แล้วว่าใช้ได้ผล (Proven Solution) สำหรับปัญหาสถาปัตยกรรมที่เกิดขึ้นบ่อย มีโครงสร้างและแนวทางที่ค่อนข้างชัดเจน
ภาพใหญ่ระดับระบบ (System Level)
"เราจะสร้างบ้านทรงไทย หรือทรงโมเดิร์น?"
วิธีแก้ปัญหาเฉพาะจุด (Component/Module Level)
"เราจะจัดห้องครัวอย่างไรให้ทำอาหารสะดวก?"
ระบบจริงมักเป็น Hybrid ผสมหลาย Styles เข้าด้วยกัน
ไม่ต้องเริ่มออกแบบจากศูนย์ ใช้แบบที่มีอยู่แล้ว
พูดว่า "Layered" ทีมเข้าใจตรงกันทันที
ไม่ต้อง Reinvent the wheel
รู้อยู่แล้วว่า Style นี้ดีต่อ Modifiability แต่อาจช้าลง
ใช้สถาปัตยกรรมที่มีคนใช้แล้วจำนวนมาก มี Best practices ให้ศึกษา
จุดเริ่มต้นของทุกสิ่ง
แผนภาพตัวอย่าง Monolithic Application
💡 ข้อคิด: "เริ่มให้เดินได้ก่อน (Monolith) แล้วค่อยคิดเรื่องวิ่งมาราธอน (Microservices)"
แผนภาพตัวอย่าง Layered (3-Tier) Architecture
แบ่งระบบเป็นชั้น แต่ละชั้นคุยกับชั้นที่ติดกันเท่านั้น
Dependency Rule: Layer บนเรียก Layer ล่างได้ แต่ล่างห้ามเรียกดึงบน
Browser / App
|
| HTTP
↓
Web / App Server
|
| SQL
↓
Database
UI (Controller)
|
↓
Application Layer (Use Cases)
|
↓
Domain Layer (Entities + Rules)
|
↓
Infrastructure (DB, External API)
โครงสร้างทำงานได้ แต่กฎธุรกิจกระจาย/ปนกับโค้ดควบคุมลำดับงาน → ทดสอบยาก
กฎธุรกิจหลักจะอยู่ใน Domain → ทดสอบได้ง่าย, ใช้ซ้ำได้ทั้ง Web, Mobile, API อื่น ๆ
สังเกตว่า: โครงสร้างในโค้ด (Layer) มักจะ Map ตรงกับการ Deploy จริง (Tier) ในระบบขนาดใหญ่
โครงสร้างยอดนิยมในระบบจริง
ผู้ขอใช้บริการ (Client) ↔ ผู้ให้บริการ (Server)
Note: Tier = Physical Separation (เครื่องคนละเครื่อง)
เหมาะกับงานที่เป็นลำดับขั้นตอนชัดเจน เช่น ETL, Image Processing, Audio Processing
Input → [Filter 1] → [Filter 2] → [Filter 3] → Output
ตัวอย่าง: Log → Parse → Filter ERROR → Aggregate → Alert
const fs = require('fs');
const zlib = require('zlib');
// Read → Compress → Write
fs.createReadStream('input.log')
.pipe(zlib.createGzip()) // Filter 1: บีบอัด
.pipe(fs.createWriteStream('input.log.gz')); // Filter 2: เขียนไฟล์ใหม่
console.log('Done!');
Reusable & Composable!
แต่ละขั้นสามารถเป็น Filter ตัวหนึ่ง ต่อเชื่อมด้วย Pipe (Message Queue / Stream)
แต่ละขั้นเป็น Filter แยกกัน ทำให้ re-use pipeline เดิมได้กับหลายโปรเจกต์
เลือกอย่างไรให้เหมาะสม?
Architecture: Client-Server + N-Tier + Microservices (บางส่วน)
Architecture: N-Tier / Microservices
Architecture: Layered + N-Tier
ตอบคำถามสั้น ๆ เพื่อลองเช็คความเข้าใจเรื่อง Styles วันนี้
เฉลย: Monolithic เริ่มต้นง่ายสุด Setup เร็ว ไม่ซับซ้อน เหมาะกับทีมเล็กและ MVP
เฉลย: Layer แบ่งตามโครงสร้างในโค้ด ส่วน Tier แบ่งตามการ Deploy บนเครื่อง/Server
💡 สามารถใช้คำถามเหล่านี้ทบทวนก่อนสอบ หรือใช้เป็น Guideline ออกแบบโปรเจกต์ของตัวเองได้
Monolithic ไม่ใช่ผู้ร้าย ถ้าระบบไม่ใหญ่ มันคือพระเอก
Layered ช่วยให้โค้ดสะอาด รักษาได้ยาวนาน
Client-Server/N-Tier ดีแต่แลกมาด้วยความซับซ้อนของ Network และ Infrastructure
คิดแบบท่อ (Pipe) เมื่อต้อง process ข้อมูลเป็นขั้นตอนตามลำดับ
เราจะเข้าสู่ Modern Architecture:
เตรียมตัว: ลองหาข้อมูล Netflix Architecture มาล่วงหน้า
มีคำถามไหมครับ?
"Good architecture is not about making decisions early,
but delaying them until you have more
information."
- Robert C. Martin