Microservices-vs-SOA

ในปัจจุบันไปงานไหน ๆ ก็มีแต่คนพูดถึง Microservice
ว่ามันดีอย่างนั้นอย่างนี้
แต่สำหรับใครก็ตามที่มีประสบการณ์กับ SOA (Service Oriented Architecture)
หรือบางคนอาจจะเรียกว่า Service Oriented Ambiguity ก็ตาม

อาจจะเกิดคำถามขึ้นมาว่า
ทั้ง SOA และ Microservice มันเหมือนหรือแตกต่างกันอย่างไรบ้าง ?

SOA ย่อมาจาก Service Oriented Architecture

เป็นรูปแบบหนึ่งของการออกแบบสถาปัตยกรรม Software
โดยทำการแยกส่วนการทำงานออกเป็น component
ในแต่ละ component ประกอบไปด้วย service ต่าง ๆ
ซึ่งทำงานอย่างใดอย่างหนึ่งไปเลย เช่น

  • Shopping cart service
  • Account activation service
  • Order validation service
  • Order status service

รวมทั้งยังได้กำหนด protocol ในการสื่อสารอย่างง่ายระหว่าง component ไว้อีกด้วย

โดยใน SOA ประกอบไปด้วย 2 ส่วนหลักคือ

  1. Consumer คือ ผู้ใช้งานทั้งจากผู้ใช้งาน จาก service อื่น และ ระบบอื่น
  2. Provider คือ ผู้ใช้บริการ service ต่าง ๆ

แสดงดังรูป

soa-01

จากรูปจะเห็นว่ามีส่วนที่เรียกว่า Enterprise Service Bus (ESB)
เป็นสถาปัตยกรรมหนึ่งที่รวมเอาส่วนการทำงานต่าง ๆ มาทำงานร่วมกัน
ทั้ง Consumer และ Provider
นั่นคือช่องทางนการติดต่อสื่อสารนั่นเอง
ทำให้ส่วนการทำงานต่าง ๆ สามารถแบ่งปันและแลกเปลี่ยนข้อมูลกันได้ง่าย
แต่บ่อยครั้งที่พบว่า ESB กลับกลายเป็นปัญหา !!

มาดู Microservice Architecture กันบ้าง

เป็นรูปแบบหนึ่งของการออกแบบสถาปัตยกรรมของ Software
ซึ่งแยกส่วนการทำงานใหญ่ ๆ ออกเป็นส่วนเล็ก ๆ
โดยแต่ละส่วนเรียกว่า service
แต่ละ service มีขนาดเล็ก แต่ไม่ใช่เล็กแบบ function หรือ method นะ
แต่ละ service แยกกันทำงานอย่างชัดเจน
แต่ละ service แยกส่วนจัดเก็บข้อมูลออกจากกัน แต่อาจจะ share กันได้บางกรณี
แต่ละ service สามารถพัฒนาด้วยภาษาโปรแกรมที่ต่างกัน
แต่ละ service ติดต่อสื่อสารกันผ่าน protocol ที่กำหนดร่วมกัน
แต่ละ service เป็นอิสระต่อกัน ทำให้สามารถ deploy โดยไม่กระทบ (แต่ต้องทดสอบดี ๆ นะ)
แต่ละ service สามารถปิด หรือ ล่มได้ โดยไม่ส่งผลกระทบต่อ service อื่น !! (Design for failure)
แต่การออกแบบและพัฒนาไม่ง่ายเลย !!

แสดงดังรูป

soa-02

แล้ว SOA กับ Microservice มันแตกต่างกันอย่างไร ?

ในมุมมองนักพัฒนาของผมชอบภาพนี้
มันอธิบายได้ชัดเจนมาก ๆ

soa-04

โดยแต่ละ service ของ SOA และ Microservice
สามารถแบ่งไปให้แต่ละทีม หรือ หลาย ๆ ทีมพัฒนาได้
สามารถใช้เทคโนโลยีในการพัฒนาที่แตกต่างกันได้

แต่สิ่งที่แต่ละทีมต้องตกลงร่วมกันก่อนคือ
รูปแบบของการติดต่อสื่อสารระหว่าง service ว่าเป็นอย่างไร

แต่ว่า service ใน SOA มักจะไม่เป็นอิสระต่อกัน  !!
ซึ่งต่างจาก Microservice
ส่งผลให้ Microservice นั้น
deploy ได้ง่ายกว่า
scale ระบบได้ง่ายกว่า

ส่วนใน SOA นั้น ESB กลับกลายเป็นปัญหาใหญ่ของทั้งระบบ
หรือเป็น Single Point of Failure (SPoF)
เนื่องจากแต่ละ service ต้องทำการติดต่อสื่อสารผ่าน ESB

ส่วนเรื่องของการ share ข้อมูลระหว่าง service นั้น
มีทั้งข้อดีและข้อเสีย ซึ่งต้องพิจารณาให้ดี ๆ
ข้อดีคือแต่ละ service สามารถใช้ข้อมูลร่วมกันได้ง่าย
ข้อเสียคือแต่ละ service จะผูกมัดกันอย่างมาก (Tight coupling)

โดยสรุปแล้ว SOA และ Microservice นั้นต่างกันที่

ขนาดและขอบเขตการทำงาน
โดยที่ Microservice จะมีขนาดเล็กกว่า SOA
และแต่ละ service เป็นอิสระต่อกันมากกว่า SOA

ส่วน SOA นั้นสามารถประกอบมีระบบแบบ Monolith และ Microservice อยู่รวมกันได้
เนื่องจาก SOA นั้นถูกออกแบบและสร้างขึ้นมา
เพื่อทำให้ระบบที่แตกต่างกันสามารถทำงานร่วมกันได้ผ่านระบบ ESB
จึงไม่แปลกใจเลยว่า เมื่อพูดถึง SOA เมื่อใด จะมี ESB ตามมาติด ๆ เสมอ
แสดงดังรูป

soa-03

Reference Websites
http://martinfowler.com/articles/microservices.html
http://microservices.io/patterns/microservices.html
http://stackoverflow.com/questions/25501098/difference-between-microservices-architecture-and-soa
https://dzone.com/articles/microservices-vs-soa-2