9 คะแนน โดย baeba 2025-05-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

Key Takeaways

  • ขับเคลื่อนการเปลี่ยนผ่านด้วยการแยกส่วนแบบค่อยเป็นค่อยไป โดยไม่ต้องเปลี่ยนระบบเดิมทั้งหมดในคราวเดียว
  • ใช้ระบบข้อมูลแบบเรียลไทม์บนพื้นฐาน CDC มาแทนการเข้าถึงเมนเฟรมโดยตรง
  • ใช้ GraphQL แทน REST เพื่อลดชั้น BFF จำนวนมาก และเพิ่มความยืดหยุ่นกับความสามารถในการบำรุงรักษา
  • ใช้โครงสร้างทีมแบบยึดโดเมนเป็นศูนย์กลาง (Team Topologies) เพื่อทำให้ความรับผิดชอบและความเป็นเจ้าของของทีมชัดเจน
  • เปลี่ยนระบบโดยไร้ความเสี่ยงและส่งมอบคุณค่าได้อย่างเสถียรผ่านการปล่อยใช้งานแบบค่อยเป็นค่อยไปและระบบอัตโนมัติ

กรณีเริ่มต้น: ครึ่งหนึ่งของระบบยังอยู่รอดได้แม้เกิดเหตุขัดข้อง

แม้จะเกิดปัญหาขัดข้องกับเมนเฟรม แต่ UI ใหม่ยังทำงานได้ตามปกติด้วยสถาปัตยกรรมสตรีมมิงบนคลาวด์
แม้ระบบเดิมจะล่ม ระบบใหม่ก็ยังรักษาประสบการณ์ลูกค้าไว้ได้และพิสูจน์ความยืดหยุ่นของระบบ


กลยุทธ์หลัก: การแยกส่วนหลายชั้น (Decoupling)

  1. การออกแบบที่ขับเคลื่อนด้วยโดเมน (DDD): ปรับโมเดลที่ยึดเมนเฟรมเป็นศูนย์กลางใหม่ให้สอดคล้องกับธุรกิจมากขึ้น
  2. Team Topologies: เปลี่ยนไปสู่การจัดทีมตามฟังก์ชัน
  3. สถาปัตยกรรมแบบอิงเหตุการณ์: ลดการผูกติดกันระหว่างระบบด้วยแนวทางอะซิงโครนัส
  4. 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 ความคิดเห็น

 
mhj5730 2025-05-13

การปรับปรุงแบบค่อยเป็นค่อยไปและการแยก microservices ออกมาอย่างค่อยเป็นค่อยไปสำคัญมากจริงๆ...พออ่านบทความแบบนี้แล้วก็รู้สึกว่า PM ที่นำโปรเจกต์นี้สำคัญและเก่งมากจริงๆ การต้องจัดการสิ่งมากมายขนาดนี้นี่สุดยอดเลย