บันทึกการสอน และ แบ่งปันความรู้เรื่องของ Microservices ที่ Skooldio
ตั้งแต่การออกแบบ การพัฒนา การทดสอบ และ การ deploy
รวมไปถึงการ operate เรื่องต่าง ๆ เช่น monitoring และ observability
จำนวน 4 วัน โดยครั้งนี้เขาบอกว่าเป็นรุ่นที่ 13 แล้ว
จึงทำการสรุปการแบ่งปันไว้นิดหน่อย
เริ่มด้วย 2 วันแรก จะลงรายละเอียดของการออกแบบ
โดยเป้าหมายของ 2 วันนี้ คือ
- เพิ่มความรู้ความเข้าใจของปัญหาต่าง ๆ ที่พบเจอของระบบงาน
- ให้รู้และเข้าใจว่า ทำไม เราจึงมีแนวคิดต่าง ๆ ของการออกแบบระบบ รวมทั้งเรื่องของ software architecture
- แนวคิดต่าง ๆ ล้วนสร้างขึ้นมาเพื่อแก้ไขปัญหา
- แต่เมื่อเรานำมาใช้งาน ทำไมถึงสร้างปัญหา
- เราเข้าใจถึงที่มาที่ไปของแนวคิดนั้น ๆ หรือไม่
ดังนั้นจึงได้เริ่มสร้างความเข้าใจในแนวคิดต่าง ๆ เข้ามา ยกตัวอย่างเช่น
- DevOps, DevSecOps
- Continuous Integration และ Continuous Deployment/Delivery
- Software architecture เช่น Monolith, Modular, Layer, Tier, SOA, Microservices และ Function-as-aService
- Containerization
โดยสิ่งที่เน้นย้ำในการแบ่งปันครั้งนี้ คือ Software Architecture
ซึ่งล้วนมี trade-off ที่เราต้องพิจารณาเสมอ
เนื่องจากไม่ได้มีเพียงข้อดีเท่านั้น
มันยังมีข้อเสียที่เราต้องรู้และเข้าใจ รวมทั้งต้องเตรียมวิธีการรับมือเสมอ
บ่อยครั้งจะพบว่า เราแก้ไขปัญหา ด้วยการเพิ่มปัญหาใหม่ ๆ !!
กลับมาที่ Microservices นั้น จะแนะนำให้มอง 4 มุมเป็นอย่างน้อยเสมอ
ประกอบไปด้วย
- การสร้าง service จะเพิ่มเข้าไป หรือ แยกออกมา มีเหตุผลอะไร อย่างไร
- การออกแบบ interface หรือ การเข้าถึง service นั้น ๆ เป็นอย่างไร สนใจเรื่อง compatability และ ใช้งานง่ายหรือไม่
- การทดสอบ คิดไหมว่า จะทดสอบอย่างไร
- การ operate คิดหรือไม่ว่าจะดูแล จัดการอย่างไร deploy อย่างไร monitoring/observability เป็นอย่างไร ถ้าเกิดปัญหาต่าง ๆ จะจัดการอย่างไร หรือ ระบบสามารถ react ต่อปัญหาได้หรือไม่ อย่างไร
ยิ่งทำการแยกกันออกมา มีข้อดีหรือข้อเสียมากกว่ากัน
มีความเป็นอิสระหรือไม่ ในมุมมองต่าง ๆ ไม่ใช่เพียงแค่แยกกันพัฒนา แยกกันทำงาน
แต่ยังต้องมองเรื่องของ
- การติดต่อสื่อสาร เช่น แยกกันแล้ว แต่ต้องติดต่อสื่อสารกันเสมอ คำถามคือ แยกกันทำไม ตรงนี้ตอบได้ไหม
- การ deploy และ scale ต้องรอกันไหม ? ถ้ารอ แล้วไหนบอกว่า service ต้องเป็นอิสระแก่กัน
- การแก้ไข พบว่าเมื่อทำการเปลี่ยนแปลง ต้องไปแก้ไขหลาย ๆ ที่ หรือ หลาย service แบบนี้คือ duplication ไหมนะ น่าคิด
- เมื่อมีบาง service พัง หรือ ช้าไป แล้วก่อให้ service อื่น ๆ ที่เกี่ยวข้องมีปัญหาไปด้วย แบบนี้เป็นอิสระไหมนะ ไม่น่าใช่หรือเปล่านะ ?
ปิดท้ายด้วยแนวคิดของการออกระบบ ต้องมองให้รอบด้าน
มีหลสยมุมมอง ดังนั้นต้องการคนที่มี skill หลากหลาย
หรือเป็นการทำงานเป็นทีมนั้นเอง เช่น
- แนวทางการแยก (decomposition)
- แนวทางในการจัดเก็บข้อมูล จะรวม หรือ แยกกัน รวมกันมากไปก็ไม่ได้ แยกมากก็ไม่ได้
- พอแยกหลาย ๆ service และ data ต้องทำการนำมารวมกัน จะทำอย่างไร
- พอแยกหลาย ๆ service และ data จะจัดการเรื่องของ transaction อย่างไร
- แต่ละ service จะติดต่อสื่อสารกันอย่างไร ผูกมัดกันเกินไปไหม ? เป็นอิสระต่อกันไหม ?
- เรื่องของการทดสอบทำอย่างไร
- เรื่องของ observability ของ service และภาพรวมเป็นอย่างไร
- เมื่อเกิดปัญหาแล้ว ค่าของ MTTR (Mean-Time-to-Recovery) เป็นอย่างไร ช้า หรือ เร็ว
- การ deploy ทำอย่างไร คิดก่อนทำหรือไม่ หรือทำไปแล้วค่อยไปคิดทีหลัง ?
- สนใจ Zero downtime หรือไม่
- ระบบงาน react ต่อปัญหาอย่างไร
- ทำแต่ service ที่เป็น backend เคยสนใจฝั่ง fronend บ้างไหม ว่ามีปัญหาอะไรไหม ทำงานยากกว่าเดิมไหม
สิ่งเหล่านี้จำเป็นต้องได้รับคำตอบไหมนะ ?
ต่อมาในอีก 2 วัน ว่าด้วยเรื่องของ develop -> testing -> deploy
เป็นการลงมือทำ ว่าจากแนวคิดต่าง ๆ นั้น
เราจะลงมือทำได้อย่างไรบ้าง
เพื่อทำให้เรารู้และเข้าใจว่า
เพียงคิดอย่างเดียวมันยังไม่พอ
คิดได้ ก็ต้องทำให้ดูได้
แนะนำแล้ว ก็ต้องแสดงให้เห็นได้
โดยเป็นการทำ workshop เป็นเรื่อง ๆ แยกกันไปได้ดังนี้
- การออกแบบ interface ของ service เช่น REST API ทำอย่างไร โดยจะแนะนำเรื่องของ Design-first ด้วยเครื่องมือต่าง ๆ เช่น Postman, Swagger/OpenAPI และ API blueprint
- การจัดการปัญหาเรื่อง service to service communication นั่นคือการใช้งาน Circuit breaker ร่วมกับระบบ alert system เพื่อทำให้เรารู้ปัญหาทันที รวมทั้งการจัดการปัญหาเฉพาะหน้า เพื่อลดปัญหาไม่ให้ขยายวงกว้าง จนไปกระทบต่อส่วนอื่น ๆ
- การใช้งาน API gateway แบบพื้นฐาน โดยครั้งนี้แนะนำ APISIX ดูบ้าง
- การจัดการ Observability ของ service ประกอบไปด้วย Application metric, Distributed tracing และ Log aggregation ด้วยภาษาโปรแกรม และ เครื่องมือต่าง ๆ ที่หลากหลาย
- การติดต่อสื่อสารระหว่าง service แบบ asynchronous ว่าเป็นอย่างไร ลงมือทำเพื่อให้เข้าใจ
- การทดสอบ service to service ทำอย่างไร โดยลงมือทำ workshop 2 รูปแบบคือ component testing และ contract testing
- การออกแบบ pipeline ของการส่งมอบ service รวมไปถึง product ว่าควรมีอะไรบ้าง เพื่อทำให้เรามั่นใจในคุณภาพ พร้อมกับความรวดเร็ว
ปิดด้วย แนวคิดต่าง ๆ เกิดมาเพื่อแก้ไขปัญหา
ดังนั้นเราต้องรู้ก่อนว่า ปัญหาของเราตรงกับแนวคิดเหล่านั้นหรือไม่
มิเช่นนั้น เราเองที่จะเป็นคนสร้าง หรือ นำ ปัญหาเข้ามาเอง