- Wave เป็นบริษัทมูลค่า $1.7B (2.3 ล้านล้านวอน) ที่มีวิศวกร 70 คน (ให้บริการโมบายแบงก์กิ้งสำหรับแอฟริกา)
- ใช้สถาปัตยกรรมแอป CRUD มาตรฐานแบบ Python monolith บนพื้นฐานของ Postgres
- การเริ่มจากสถาปัตยกรรมที่เรียบง่ายและแก้ปัญหาโดยลดความซับซ้อนให้น้อยที่สุด ทำให้วิศวกรสามารถโฟกัสกับการสร้างคุณค่าให้ผู้ใช้ได้
- Stackoverflow ก็เติบโตได้อย่างประสบความสำเร็จจากการขยาย monolith จนถูกซื้อกิจการที่มูลค่า 1.8 พันล้านดอลลาร์
แม้สถาปัตยกรรมที่เรียบง่ายจะมีประสิทธิภาพ แต่สื่อส่วนใหญ่มักชอบสถาปัตยกรรมที่ซับซ้อน
- ในงานเทคคอนเฟอเรนซ์มีการพูดถึงสถาปัตยกรรมแบบไมโครเซอร์วิสที่ซับซ้อนมากมาย แต่แทบไม่มีการพูดถึง monolith ที่เรียบง่าย
- หลายบริษัทแม้จะมีแอปพลิเคชันขนาดเล็ก ก็ยังเลียนแบบเทคโนโลยีที่ซับซ้อน และได้รับความนิยมจากคอนเฟอเรนซ์และ HN ด้วยสิ่งนั้น
- สถาปัตยกรรมที่เราใช้นั้นเรียบง่ายมากจนไม่จำเป็นต้องวาดแผนภาพสถาปัตยกรรมด้วยซ้ำ
วิธีรักษาความเรียบง่าย
- Wave ใช้ Python แบบ synchronous ซึ่งหมายความว่าโปรเซสของเซิร์ฟเวอร์จะถูกบล็อกระหว่างรอ I/O
- เคยลองใช้เฟรมเวิร์ก asynchronous อย่าง Eventlet แต่มีบั๊กมากเกินไป จึงตัดสินใจว่าต้นทุนนั้นไม่คุ้มกับความเจ็บปวดในการปฏิบัติการ
- แทนที่จะเพิ่มความซับซ้อน งานที่ใช้เวลาทำงานนานจะถูกแยกไปประมวลผลผ่านคิว
- เพื่อให้สอดคล้องกับข้อกำหนดด้าน data residency บางประเทศจำเป็นต้องใช้งานดาต้าเซ็นเตอร์แบบ on-premises
- เซเนกัล/โกตดิวัวร์ใช้คลาวด์ แต่ยูกันดาและประเทศอื่น ๆ ต้องใช้ on-premises เพราะข้อกำหนด
- ในกรณีเช่นนี้ สถาปัตยกรรมที่เรียบง่ายจะง่ายกว่าสถาปัตยกรรมที่ซับซ้อนมาก
สร้างเองแทนการซื้อ
- เพราะเป็นทีมขนาดเล็ก ในช่วงแรกจึงชอบซื้อซอฟต์แวร์มาใช้ แต่หากไม่สามารถแก้บั๊กสำคัญได้ ก็จะพัฒนาเครื่องมือเอง
- การสร้างเครื่องมือเองเป็นความซับซ้อนที่เราไม่อยากแบกรับ แต่ในบางหมวดหมู่ผลิตภัณฑ์ แม้จะสำรวจอย่างกว้างขวางแล้ว ก็ยังหาผู้ขายที่ให้ผลิตภัณฑ์ซึ่งเหมาะกับเราไม่ได้
- นอกจากความสามารถหลักแล้ว บางครั้งก็จำเป็นต้องพัฒนาเครื่องมือเองและรักษาความเชี่ยวชาญภายในองค์กรไว้
ตัวเลือกที่กำลังทบทวน
- กำลังทบทวนการเลือกใช้เทคโนโลยีอย่าง RabbitMQ, Celery, SQLAlchemy และ Python เพราะสิ่งเหล่านี้เพิ่มความซับซ้อนหรือภาระในการบำรุงรักษา
- หากต้องเริ่ม codebase ใหม่ ก็จะพิจารณาทางเลือกเหล่านี้อย่างรอบคอบ
ตัวเลือกที่พอใจ
- พอใจกับการเลือกใช้ GraphQL, โปรโตคอลทรานสปอร์ตแบบกำหนดเอง และ Kubernetes
- GraphQL มีข้อดีอย่างการทำเอกสารได้ด้วยตัวเอง, การสร้างโค้ด, และตัวสำรวจแบบอินเทอร์แอ็กทีฟ GraphiQL
- มองว่าการใช้ GraphQL มีข้อดีมากกว่าข้อเสีย
- ข้อดี
- มีเอกสารในตัวเกี่ยวกับชนิดข้อมูลที่ส่งกลับอย่างแม่นยำ
- ไคลเอนต์ปลอดภัยขึ้นจากการสร้างโค้ดตามชนิดข้อมูลที่ส่งกลับอย่างแม่นยำ
- เพิ่มประสิทธิภาพการทำงานด้วยตัวสำรวจแบบโต้ตอบ GraphiQL
- แอปหลายแบบ (แอปผู้ใช้, แอปซัพพอร์ต, แอปตัวแทน Wave ฯลฯ) สามารถใช้ API เดียวร่วมกันได้เป็นส่วนใหญ่ จึงลดความซับซ้อนลง
- ด้วยภาษา query ที่กำหนดองค์ประกอบได้ ไคลเอนต์สามารถดึงข้อมูลที่ต้องการได้อย่างแม่นยำใน packet round-trip เดียว โดยไม่ต้องสร้าง endpoint เฉพาะทางจำนวนมาก
- ตัดปัญหา bikeshedding เกี่ยวกับสิ่งที่ควรถูกนับว่าเป็น RESTful API
- ข้อเสีย
- ตอนที่นำ GraphQL มาใช้ ไลบรารี GraphQL ยังไม่ดีมากนัก
- การเข้ารหัส GQL แบบพื้นฐานมีความซ้ำซ้อน และเพราะลูกค้าจำนวนมากใช้แบนด์วิดท์ต่ำ จึงให้ความสำคัญกับข้อจำกัดด้านขนาดอย่างมาก
- Kubernetes ถูกใช้เพื่อรองรับข้อกำหนดด้านการดำเนินงานดาต้าเซ็นเตอร์แยกตามประเทศ
บทสรุป
- การรักษาสถาปัตยกรรมแอปพลิเคชันให้เรียบง่ายที่สุดเท่าที่จะเป็นไปได้ ทำให้สามารถใช้งบประมาณด้านความซับซ้อน (และกำลังคน) ไปกับจุดที่ความซับซ้อนนั้นช่วยธุรกิจได้จริง
- ด้วยแนวคิดที่ว่าจะทำทุกอย่างให้เรียบง่ายที่สุดเท่าที่ทำได้ ตราบใดที่ยังไม่มีเหตุผลที่หนักแน่นพอจะเพิ่มความซับซ้อน เราจึงสามารถสร้างธุรกิจขนาดใหญ่พอสมควรได้โดยมีวิศวกรไม่มาก แม้จะดำเนินธุรกิจการเงินในแอฟริกาซึ่งโดยทั่วไปถูกมองว่าเป็นธุรกิจที่ยากก็ตาม
9 ความคิดเห็น
ดูเหมือนว่า “สร้างแทนซื้อ” ควรจะเป็น “ซื้อแทนสร้าง” มากกว่านะครับ
อ๊ะ ตอนแรกกะจะเน้นย้ำ แต่ดันทำให้ชื่อเรื่องออกมาแปลกไปหน่อย เลยแก้ไขแล้วครับ ขอบคุณครับ
เป็นเพราะกระแสเปลี่ยนไปตามวัฏจักรเศรษฐกิจหรือเปล่า? ไม่ว่ากระแสจะเป็นอย่างไร การเริ่มต้นด้วยโมโนลิธย่อมได้เปรียบกว่าในแง่การลดต้นทุนคงที่และการบำรุงรักษา
สถาปัตยกรรมที่เข้าใจง่ายก็ย่อมบำรุงรักษาได้ง่ายเช่นกัน
สำหรับผม ไม่ว่าบริการแบบไหนก็ควรเริ่มต้นด้วยโมโนลิทิกจะดีกว่า ถ้าตั้งธงเป็น MSA ตั้งแต่แรกก็สิ้นเปลืองเงินเปล่าๆ
"เมื่อความซับซ้อนเพิ่มขึ้น ต้นทุน (เงิน คน เวลา...) ก็เพิ่มขึ้นด้วย"
"อย่าพยายามแก้ปัญหาที่แก้ได้ด้วยสถาปัตยกรรมที่เรียบง่าย ด้วยสถาปัตยกรรมที่ซับซ้อน"
ความคิดเห็นจาก Hacker News
คำแนะนำด้านวิศวกรรมเกี่ยวกับไมโครเซอร์วิส
ประเด็นพูดคุยเกี่ยวกับไมโครเซอร์วิส
อคติทางความคิดและความเรียบง่าย
การทำวิศวกรรมเกินความจำเป็นและการขาดประสบการณ์
บริษัทที่ให้ความสำคัญกับสมดุลระหว่างงานกับชีวิต
ประสบการณ์ส่วนตัวเกี่ยวกับ Dan Luu
ความสำคัญของสถาปัตยกรรมที่เรียบง่าย
สถาปัตยกรรมกับโครงสร้างทางสังคมของทีมวิศวกรรม
ความชอบต่อสถาปัตยกรรมที่เรียบง่าย
ขอรบกวนลิงก์ของงานบรรยายที่พูดถึง "เคล็ดลับเกี่ยวกับความล้มเหลวของไมโครเซอร์วิสของ David Schmitz" ได้ไหมครับ
คือ https://www.youtube.com/watch?v=r8mtXJh3hzM