ในช่วง 2-3 เดือนที่ผ่านมานั้น มีโอกาสได้แลกเปลี่ยนความรู้และประสบการณ์
เกี่ยวกับการนำแนวคิด Microservices มาใช้งาน
ผ่านทางการพูดคุย สอน แบ่งปันแบบ Remote/Online
ทำให้ได้เห็นแนวทางที่ชัดเจนขึ้นว่า
เราต้องเข้าใจในปัญหา หรือ ความต้องการก่อน
ถึงจะเลือกวิธีการที่เหมาะสมได้
เนื่องจากสิ่งเหล่านี้มันคือ การตัดสินใจและลองผิดลองถูก
และสิ่งที่สำคัญมาก ๆ คือ ได้ลงมือทำมันหรือยัง
ว่าสิ่งที่เราคิดและออกแบบมานั้น มันเหมาะสมกับปัญหานั้น ๆ หรือไม่
การพูดคุยได้แบ่งเป็นหัวข้อใหญ่ ๆ ดังนี้
การแบ่งระบบงานออกเป็น service ย่อย ๆ (Decomposition)
ก่อนจะทำการแยกหรือรวมได้นั้น เราต้องเข้าใจก่อนว่า
แต่ละส่วนงานนั้นเป็นอย่างไร
มีหน้าที่หรือขอบเขตการทำงานอย่างไร
มีการเชื่อมต่อหรือติดต่อสื่อสารกับส่วนงานไหนบ้าง
ทำไมถึงต้องแยกออกมาเป็น service ย่อย ๆ ที่เป็นอิสระจากส่วนอื่น
ที่สำคัญคือ ผลที่ตามมาจากการแยกทั้งดีและเสียเป็นอย่างไร
แนวทางในการแยกก็มีหลายแบบ
- แยกตาม business หรือ feature ไป บ่อยครั้งแยกให้แต่ละทีมทำไปเลย เช่น logging, monitoring และ user management เป็นต้น
- แยกตาม domain ตามแนวคิดของ Domain-Driven Design
เมื่อแยกเป็นหลาย ๆ service แล้วจะค้นหากันอย่างไร (Service Discovery) ?
แน่นอนว่า ต้องเตรียมคำตอบหรือวิธีการไว้เสมอ
ต่อจากนั้นเรื่องของ การติดต่อสื่อสารระหว่าง service ก็ตามมาอีก
ว่าจะมีรูปแบบอย่างไร ?
ทั้ง Remote Procedure Invocation เช่น REST, RPC เป็นต้น
ทั้ง Messaging ที่ติดต่อสื่อสารกันแบบ asynchronous หรือเป็น protocol เฉพาะทาง
บ่อยครั้งจะพบว่า แยก service แล้ว
แต่รูปแบบการติดต่อสื่อสารกันยังผูกมัดกัน !!
มันเป็นผลมาจากการเลือกที่ไม่เหมาะสมหรือไม่ ?
สิ่งที่ขาดไม่ได้เลยคือ Service Observation
เพื่อทำให้เราสามารถดูแลสุขภาพของระบบงานโดยรวมได้ดี
รวมทั้งสามารถหาต้นเหตุของปัญหาได้ง่ายอีกด้วย
ประกอบไปด้วย
- Log aggregation
- Application Metrics
- Distributed tracing
- Health check
- Log deployment and change
อีกส่วนที่มักพลาดกันเยอะคือ Database management
ถือว่าเป็นอีกส่วนที่สำคัญ ว่าระบบงานและ service จะจัดการข้อมูลกันอย่างไร
แต่ละรูปแบบก็มีข้อดีข้อเสียต่างกันไป
จำเป็นต้องกลับไปดูความต้องการและขอบเขตการทำงานจากข้างต้นด้วย
เพราะว่า แต่ละ service ต้องการ database ที่แตกต่างกันไป
รูปแบบประกอบไปด้วย
- Shared database
- Database per service
- Hybrid database
เรื่องที่คุยกันท้าย ๆ คือ Testing และ Deployment
เราจะทดสอบกันอย่างไร เราจะ deploy กันอย่างไร
จำเป็นต้องมีการออกแบบและเตรียมระบบ CI/CD ไว้เสมอ
เพื่อให้เรามีความมั่นใจต่อระบบ
เพื่อให้เราสามารถ deploy ได้บ่อยตามที่ต้องการ
เพื่อให้เรากลัวการผิดพลาดน้อยลง