Key Takeaways
- ขับเคลื่อนการเปลี่ยนผ่านด้วยการแยกส่วนแบบค่อยเป็นค่อยไป โดยไม่ต้องเปลี่ยนระบบเดิมทั้งหมดในคราวเดียว
- ใช้ระบบข้อมูลแบบเรียลไทม์บนพื้นฐาน CDC มาแทนการเข้าถึงเมนเฟรมโดยตรง
- ใช้ GraphQL แทน REST เพื่อลดชั้น BFF จำนวนมาก และเพิ่มความยืดหยุ่นกับความสามารถในการบำรุงรักษา
- ใช้โครงสร้างทีมแบบยึดโดเมนเป็นศูนย์กลาง (Team Topologies) เพื่อทำให้ความรับผิดชอบและความเป็นเจ้าของของทีมชัดเจน
- เปลี่ยนระบบโดยไร้ความเสี่ยงและส่งมอบคุณค่าได้อย่างเสถียรผ่านการปล่อยใช้งานแบบค่อยเป็นค่อยไปและระบบอัตโนมัติ
กรณีเริ่มต้น: ครึ่งหนึ่งของระบบยังอยู่รอดได้แม้เกิดเหตุขัดข้อง
แม้จะเกิดปัญหาขัดข้องกับเมนเฟรม แต่ UI ใหม่ยังทำงานได้ตามปกติด้วยสถาปัตยกรรมสตรีมมิงบนคลาวด์
แม้ระบบเดิมจะล่ม ระบบใหม่ก็ยังรักษาประสบการณ์ลูกค้าไว้ได้และพิสูจน์ความยืดหยุ่นของระบบ
กลยุทธ์หลัก: การแยกส่วนหลายชั้น (Decoupling)
- การออกแบบที่ขับเคลื่อนด้วยโดเมน (DDD): ปรับโมเดลที่ยึดเมนเฟรมเป็นศูนย์กลางใหม่ให้สอดคล้องกับธุรกิจมากขึ้น
- Team Topologies: เปลี่ยนไปสู่การจัดทีมตามฟังก์ชัน
- สถาปัตยกรรมแบบอิงเหตุการณ์: ลดการผูกติดกันระหว่างระบบด้วยแนวทางอะซิงโครนัส
- Change Data Capture (CDC): ตรวจจับการเปลี่ยนแปลงของข้อมูลแบบเรียลไทม์เพื่อเชื่อมระบบเดิมกับระบบใหม่
โครงสร้างเดิม: Unified Web Portal 1.0
เดิมมีการรวมข้อมูลจากเมนเฟรมหลายแหล่งผ่าน ETL แล้วให้บริการผ่าน SQL DB และ SaaS
แต่เกิดปัญหาเรื่องความไม่เป็นเรียลไทม์ คุณภาพข้อมูลลดลง และการเรียกใช้เมนเฟรมโดยตรง
ปัญหา
- ข้อมูลล่าช้าจาก ETL
- การเชื่อมต่อแบบซิงโครนัสกับเมนเฟรมที่ขาดความยืดหยุ่น
- การสร้าง BFF API จำนวนมหาศาล
- คอขวดจากโครงสร้างองค์กรและความล่าช้าในการรีลีส
- เมื่อทราฟฟิกพุ่งสูง เมนเฟรมโอเวอร์โหลดจนทำให้บริการทั้งหมดล่ม
การตั้งเป้าหมายใหม่
เป้าหมายทางเทคนิค: แยกเมนเฟรมออกจากเว็บ, ตัด BFF ออก, เพิ่มอิสระในการทำงานของทีม
เป้าหมายทางธุรกิจ: ลดการติดต่อคอลเซ็นเตอร์, ลดต้นทุนไลเซนส์, เพิ่มความพึงพอใจของลูกค้า
ภาพรวมของสถาปัตยกรรมใหม่
- เมนเฟรมยังคงเป็น system of record
- CDC → Kafka → ฐานข้อมูลโดเมน (CosmosDB)
- GraphQL + REST API → BFF → UI
- เชื่อมทุกคอมโพเนนต์ด้วยโครงสร้างแบบอิงเหตุการณ์และ message broker
Step 1: Change Data Capture
- สร้าง system of reference ด้วยการสตรีมข้อมูลแบบเรียลไทม์
- เมนเฟรม → Kafka → แปลงข้อมูล → ฐานข้อมูลโดเมน → ให้บริการผ่าน API
- ได้โครงสร้างข้อมูลที่ยืดหยุ่นและไม่ผูกกับสคีมาของเมนเฟรม
Step 2: Domain-Driven Design + GraphQL
- กำหนดโดเมนโมเดลด้วย DDD (Entity, Command, Event)
- สร้างแต่ละโดเมนเป็น GraphQL node และสร้าง supergraph ผ่าน schema stitching
- รองรับโครงสร้างคิวรีที่เหมาะสมที่สุดด้วยการดึงเฉพาะข้อมูลที่จำเป็น
การเปลี่ยนแปลงโครงสร้างองค์กร: Team Topologies
- ปรับโครงสร้างใหม่เป็น stream-aligned team ที่ยึดฟังก์ชันเป็นศูนย์กลาง
- พื้นที่ซับซ้อน (เช่น การรวมระบบเมนเฟรม) ให้ทีมเฉพาะทางดูแล
- มี Enablement team เพื่อสนับสนุนด้านเทคนิค
การขยายแบบอิงเหตุการณ์: เหตุการณ์โดเมนภายใน + Saga pattern
- ใช้ Outbox pattern เพื่อสร้างเหตุการณ์เมื่อโดเมนมีการเปลี่ยนแปลง
- ใช้ Parallel Saga เพื่อซิงก์งานบนเมนเฟรมกับ CDC
- ออกแบบเวิร์กโฟลว์บนพื้นฐาน state machine → รองรับฟลोที่ซับซ้อนได้
ความท้าทาย
- ต้องปรับมุมมองภายในองค์กรต่อการนำโครงสร้างแบบอิงเหตุการณ์มาใช้
- โครงสร้างแบบอะซิงโครนัสทำให้การสังเกตการณ์ระบบเป็นสิ่งจำเป็น
- งานแบตช์บนเมนเฟรม → ก่อให้เกิดภาระเกินกับ CDC pipeline
- ความซับซ้อนของการจัดการ GraphQL schema และโจทย์เรื่องการนำ federated approach มาใช้
- ประเด็นร่วมอย่างการยืนยันตัวตน/การล็อก ต้องแยกจัดการด้วยแพ็กเกจเฉพาะและระบบอัตโนมัติ
กลยุทธ์การรีลีส: Release Train + Feature Flag
- แต่ละทีมดีพลอยได้อย่างอิสระ แล้วจึงรวมกันใน deployment repository
- ใช้ Kustomize เพื่อจัดทำ deployment pipeline แยกตามสภาพแวดล้อม
- แยกรีลีสฟีเจอร์/ความปลอดภัยด้วย feature flag พร้อมคงแนวทางพัฒนาแบบ trunk-based
การใช้สถาปัตยกรรมแบบไฮบริด
- ให้ UWP 1.0 และ UWP 2.0 อยู่ร่วมกันเพื่อค่อย ๆ เปลี่ยนผ่านระบบ
- ค่อย ๆ เปลี่ยนเส้นทางคำขอของผู้ใช้ไปยังระบบใหม่ด้วย edge routing
บทสรุป: การสร้างแพลตฟอร์มที่พัฒนาได้ต่อเนื่อง
- แยก frontend ออกจากเมนเฟรมได้อย่างสมบูรณ์
- ได้ทั้งความเร็วและความเสถียรจากโครงสร้างที่ยึดทีมเป็นศูนย์กลาง
- ปรับปรุงทั้งความพึงพอใจของลูกค้าและต้นทุนการดำเนินงาน
- วางรากฐานที่ยืดหยุ่นซึ่งทำให้สามารถเปลี่ยนเมนเฟรมในอนาคตได้ด้วย
1 ความคิดเห็น
การปรับปรุงแบบค่อยเป็นค่อยไปและการแยก microservices ออกมาอย่างค่อยเป็นค่อยไปสำคัญมากจริงๆ...พออ่านบทความแบบนี้แล้วก็รู้สึกว่า PM ที่นำโปรเจกต์นี้สำคัญและเก่งมากจริงๆ การต้องจัดการสิ่งมากมายขนาดนี้นี่สุดยอดเลย