By Arnon Puitrakul - 19 มีนาคม 2017
ในช่วงปีที่ผ่านมา หลาย ๆ เราน่าจะได้ยินคำว่า Microservice Architecture ผ่านหูกันมาไม่น้อยเลย ซึ่งตอนนี้สถาปัตยกรรมแบบนี้ก็ได้ถูกนำไป Implement จริงในบริษัท IT ใหญ่ ๆ หลาย ๆ เจ้ามาแล้ว ซึ่งตัวผมเองก็ได้ลง Production จริงกับสถาปัตยกรรมแบบนี้มาแล้วนิดนึง เลยอยากจะมาเล่าให้อ่านกันสักหน่อย
เมื่อก่อน เวลาเราจะพัฒนาระบบขึ้นมาสักตัว เราจะแบ่งระบบของเราออกมาอย่างง่าย ๆ เป็น 3 ส่วนคือ
ฉะนั้นขั้นตอนจะเป็นว่า User ส่ง Request ผ่าน Frontend ให้ไปทำงานสักอย่างหนึ่ง ทีนี้ Frontend ก็จะส่งคำขอไปที่ Backend เพื่อให้ Backend ไปทำงานมา ซึ่ง Backend ก็อาจจะต้องทำการเปลี่ยนแปลงข้อมูล จึงต้องไปคุยกับ Database เพื่อทำการเปลี่ยนแปลง หรือเรียกข้อมูลขึ้นมา แล้วส่งกลับไปที่ Backend และมันก็จะประมวลผล และส่งผลลัพธ์สุดท้ายกลับไปให้ Frontend เพื่อให้ User ดู
ทีนี้ ถ้าสมมุติว่า วันดีคืนดี App ของเรามีผู้ใช้เยอะขึ้นเรื่อย ๆ หรือเอาเคสที่ว่าถูกคนใน Pantip แชร์แล้วคนกระหน่ำเข้าไปใช้ App ของเรา เราก็ต้อง Deploy App ของเราทั้ง App เพิ่มอีก Instance และใช้ Load Balancer เพื่อควบคุม Traffic
และอีกเคสคือ ถ้าเราเจอข้อผิดพลาดบางประการใน App ของเรา เราก็ต้องทำการแก้ไข และทำการ Publish (หรือเรียกในภาษาคอมพิวเตอร์ว่า Deploy) ขึ้นไปบน Production Server ใหม่ทั้ง App เลย ซึ่งอาจจะทำให้เกิด Downtime (ล่มไปแปบนึง) และความยุ่งยากระดับล้าน ได้เลย ถ้า Programmer วางแผนไม่ดีพอหรือมีประสบการณ์ไม่พอ
Programmer ในปัจจุบันจึงเกิดคำถามว่า "จะเป็นไปได้มั้ยที่เราจะ Scale และ Deploy ในส่วนที่ต้องใช้เยอะ หรือต้องการแก้ไขเท่านั้น ?" คำว่า Microservice Architecture จึงเกิดขึ้นจากคำถามนี้
แนวคิดของ Microservice คือการที่เราแบ่ง Functionality ใน App ของเราออกมาเป็นส่วน ๆ แยกออกไปเป็นแต่ละ Service อาจจะมองภาพไม่ออก เราลองมาดูตัวอย่างกันดีกว่า
สมมุติว่า เราต้องออกแบบระบบของโรงหนังละกัน ทีนี้เราลองมาคิดกันว่า ในระบบของโรงหนังต้องมีอะไรบ้าง
จริง ๆ มันอาจจะมีอีก แต่เอาแค่นี้ก่อน วาดไม่ไหว หลังจากที่เราได้เห็นภาพรวมของ Reuqirement คร่าว ๆ แล้ว เราลองมาออกแบบระบบนี้กันดีกว่า
ถ้าเป็นเมื่อก่อน เราคงจะคิดถึงว่า มันต้องมี Database ที่ใช้เก็บข้อมูลทั้งหมดไว้ น่าจะใช้ RDBMS ละกัน เพราะระบบการจองต้องอาศัย ACID (Atomicity, Consistency, Isolation, Durability) จาก RDBMS แล้ว Web Server เราจะทำยังไง ใช้ Apache หรือ Nginx ยังไงดี แล้วจะจัดการ Load ได้อย่างไรดีน้อออ
เราลองมาคิดให้มันเป็น Microservice กันดีกว่า ในตอนแรกผมอยากให้เราลองมอง ความสัมพันธ์ ของแต่ละระบบที่เราจะสร้างก่อน ว่าใครต้องต่อกับใคร อาจจะเขียน User Journey ขึ้นมาคร่าว ๆ ว่า User เข้ามาแล้วต้องไปที่ไหนบ้าง เราจะได้รู้ความสัมพันธ์ว่า ใครต้องส่งข้อมูลอะไรให้ใคร จะได้เห็นข้อมูลที่วิ่งอยู่ในระบบ แล้วจึงค่อยคิดว่า ในแต่ละระบบจะใช้อะไรยังไง แล้วแต่ละระบบจะคุยกันได้ยังไง จะใช้ REST API คุยกันหรือยังไง อันนี้ก็ต้องอยู่ที่ดุลพินิจของคนออกแบบ
จากการที่ได้ออกแบบระบบโดยใช้ Microservice Architecture เราจะเห็นได้ว่า แต่ละ Function หรือ Module ถูกแยกออกจากกันอย่างชัดเจนมากขึ้น เวลาจะ Scale หรือ Deploy ก็ทำได้ง่ายขึ้นอีก เพราะเราไม่จำเป็นต้อง Deploy หรือ Scale ทั้งระบบ เราเพียงแค่ทำกับ Module ที่เราสนใจเท่านั้น
เช่นเราบอกว่า วันนี้ Beauty and the Beast เข้าฉาย (ขอพาดพิงหน่อยละกัน เขาไม่ได้จ่ายผมนะ ฮ่า ๆ) ลูกค้าจะเข้ามาจองตั๋วเราเยอะกว่าปกติ ฉะนั้นวิธีที่เราจะรับมือคือ เราเพิ่ม Instance ของแค่ส่วนที่เป็นระบบการรับจองตั๋วเท่านั้น ไม่จำเป็นต้องเพิ่มให้ทั้งระบบ ทำให้เราประหยัดเงิน และตอบสนองต่อการเปลี่ยนแปลงได้รวดเร็วขึ้นอีกด้วย
ซึ่งในปัจจุบันมีระบบที่ช่วยเรา Scale หรือ Deploy Instance ได้อย่างง่ายดาย มากมายไปหมดเช่น Docker Swarm หรือจะเป็นพวก DC/OS ก็ได้เหมือนกัน นอกจากนั้นบน Cloud เองก็มี Service พวกนี้ให้เราใช้งานได้อีกด้วย (เดี๋ยวตอนหน้าจะพาไปดูการทำงานจริง ๆ กันเลยว่า ถ้าเราจะทำงานกับ Microservice บน Cloud ได้อย่างไร และมันทำให้การทำงานของเราง่ายขึ้นอย่างไรด้วย)
นอกจากนี้ ยังทำให้เราสามารถแบ่งงานกันไปพัฒนาได้ง่ายมากขึ้น โดยที่แต่ละ Module แทบไม่ต้องคิดเลยว่า จะใช้ภาษาอะไร จะใช้ Library อะไร ขอแค่ต่อกันให้ได้และมี Backward Compatibility และ Connectivity เท่านั้นเอง ฉะนั้น แต่ละทีมก็สามารถ Deploy หรือปู้ยี้ปู้ยำ หรือจะข่มขืน (ทำไมคำมันน่ากลัวจัง) กับ Module ของตัวเองได้เลย ไม่ต้องรอทีมอื่น ง่าย ๆ คือเป็นอิสระต่อกันมากขึ้นนั่นแหละ
ย้ำ ! ตัวใหญ่ ๆ ว่า ถึงแม้จะเป็นอิสระต่อกันมากขึ้น แต่ก็ยังต้องตั้งมาตราฐานการคุยกันของแต่ละ Module และ Backward Compatibility นาจา
Microservice Architecture เป็นแนวคิดการออกแบบโปรแกรมที่จะแบ่ง App ของเราออกมาเป็นส่วน ๆ แยกกันออกไปอย่างเด็ดขาด ที่จะทำให้การจัดการนั้นเป็นไปได้ง่ายขึ้น ต่างจากวิธีการออกแบบเดิม ๆ ที่จับยัดทุกอย่างเข้าด้วยกัน แต่ไม่ว่าจะใช้แบบไหนในการออกแบบ ทุกวิธีมันมีข้อดีและข้อเสียแตกต่างกันไป ก็หวังว่าผู้อ่านคงจะเป็นภาพมากขึ้น และนำไปปรับใช้ต่อไป สำหรับวันนี้ขอให้เขียนโค๊ตไร้บัค (ฮ่า ๆ) สวัสดีครับ
ปล. จริง ๆ ในเรื่องของการออกแบบ มันยังมีหลายวิธีในการออกแบบแต่ละ Module อีกด้วยนะ ถ้าใครสนใจสามารถศึกษาเพิ่มเติมได้เลยนะ หรือจะเอามาแชร์กันต่อเลยนะ เย้ !
หลังจากเมื่อหลายอาทิตย์ก่อน Apple ออก Mac รัว ๆ ตั้งแต่ Mac Mini, iMac และ Macbook Pro ที่ใช้ M4 กันไปแล้ว มีหลายคนถามเราเข้ามาว่า เราควรจะเลือก M4 ตัวไหนดีถึงจะเหมาะกับเรา...
จากตอนก่อน เราเล่าเรื่องการ Host Website จากบ้านของเราอย่างปลอดภัยด้วย Cloudflare Tunnel ไปแล้ว แต่ Product ด้าน Zero-Trust ของนางยังไม่หมด วันนี้เราจะมาเล่าอีกหนึ่งขาที่จะช่วยปกป้อง Infrastructure และ Application ต่าง ๆ ของเราด้วย Cloudflare Access กัน...
ทุกคนเคยได้ยินคำว่า Mainframe Computer กันมั้ย เคยสงสัยกันมั้ยว่า มันต่างจากเครื่องคอมพิวเตอร์ที่เราใช้งานกันทั่ว ๆ ไปอย่างไรละ และ Mainframe ยังจำเป็นอยู่มั้ย มันได้ตายจากโลกนี้ไปหรือยัง วันนี้เรามาหาคำตอบไปด้วยกันเลย...
เคยมั้ยเวลา Deploy โปรแกรมสักตัว เราจะต้องมานั่ง Provision Infrastructure ไหนจะ VM และ Settings อื่น ๆ อีกมากมาย มันจะดีกว่ามั้ยถ้าเรามีเครื่องมือบางอย่างที่จะ Automate งานที่น่าเบื่อเหล่านี้ออกไป และลดความผิดพลาดที่อาจจะเกิดขึ้น วันนี้เราจะพาทุกคนมาทำความรู้จักกับ Infrastructure as Code กัน...