
ในการออกแบบและพัฒนาระบบงานนั้น
มักจะเจอปัญหาที่เรียกว่า Backpressure กันบ่อย ๆ
หรือเรามักจะเรียกว่า ปัญหาคอขวด ของระบบนั่นเอง
มันคือ สิ่งที่ขัดขวางการไหลของน้ำ ทำให้เกิดความดันย้อนกลับ (เหมือนกรดไหลย้อนไหมนะ)
พูดง่าย ๆ คือ ท่อตัน หรือ หนักกว่านั้นคือ ไฟลามทุ่ง !!
คำถามที่ตามมาคือ เราจะจัดการปัญหานี้อย่างไร ?
ซึ่งมีทั้งแบบ proactive และ reactive
หรือบางคนก็ ignore มันไปเลย เช่น ถ้ามีปัญหาก็ restart ไปไง ให้มันจบ ๆ
แต่ไม่น่าจะเป็นวิธีการที่ดีมากนัก
ดังนั้นมาเรียนรู้กันว่า มีวิธีการอย่างไรบ้าง ?
ถ้าระบบงานทำงานเป็นปกติ คงไม่ต้องทำอะไร
แต่เมื่อเกิดปัญหาขึ้นมาแล้ว ก็ต้องจัดการกัน
หรือถ้าเราเรียนรู้มากเพียงพอ ก็สามารถออกแบบและสร้างระบบเพื่อป้องกันไว้ได้
ยกตัวอย่างเช่น ถ้ามี traffic เยอะเกินไป
เช่นมี bot ยิงเข้ามาเยอะ ๆ เราอาจจะใส่ captcha เพื่อป้องกัน bot
หรือทำการกั้นด้วย firewall หรือพวก CDN ต่าง ๆ
แต่ถ้ายังเข้ามาในระบบเยอะ ๆ ก็มักจะทำการกำหนด Rate limit เข้ามา
โดยมี algorithm ที่เลือกได้ เช่น token bucket, fixed windows เป็นต้น
หรือทำการกำหนดจำนวน request ที่รับได้ในช่วงนั้น ๆ
ต่อมาอาจจะทำการกระจาย load traffic ไปยังที่ต่าง ๆ
เพื่อลดการ load เพียงที่เดียวก็ได้
มันคือเรื่อง load balance นั่นเอง
แต่ถ้าหลังบ้านยังมีปัญหา ก็แก้ไขเพัยงทางเข้า ส่วนในบ้านยังมีปัญหา
ดังนั้นถ้า traffic เข้ามาเยอะภายในมากไป
อาจจะต้องปรับเปลี่ยนการทำงาน
เช่น
การเขียน code จาก blocking มาเป็น non-blocking มากขึ้น
การติดต่อสื่อสารจาก synchronous มาเป็น asynchronous ไหม
ยกตัวอย่างเช่น
- batching process
- messaging queue
เพื่อสร้าง buffer ให้กับระบบ แต่จำเป็นต้องทำการปรับเปลี่ยน user/business flow ด้วย
หรือจะนำแนวคิดของ circuite breaker เข้ามาช่วยก็น่าสนใจ
บางครั้งเราอาจจะแยกส่วนการทำงานแบบ realtime process ออกจาก batch process
หรือระบบที่ทำงานได้เร็ว ออกจาก ส่วนการทำงานที่ช้าก็ได้
เพื่อเครื่องทำงานให้ใหญ่ขึ้น หรือ จำนวนมากขึ้น !!
ไม่ว่าทางใด ความซับซ้อนก็จะสูงขึ้นแน่นอน
มันคือ trade-off ที่เราต้องเลือกเช่นกัน
เราเลือกทางไหน ?
โดยรวมแล้วนั้นสิ่งที่เราต้องคำนึงเรื่องปัญหานี้คือ
- การควบคุม (control) การใช้งานจากฝั่งผู้ใช้งาน ว่าสามารถจัดการได้ไหม เช่นถ้าระบบที่เราจะใช้งานมีปัญหา เรายังจะเรียกใช้อยู่ไหม ?
- จัดการ buffer ให้ระบบ เพื่อใช้จำเก็บ request ต่าง ๆ ที่เข้ามา ซึ่งเวลาปกติอาจจะไม่จำเป็น แต่ถ้ามีปริมาณเยอะ ๆ จำเป็นต้องเปิดการใช้งาน
- บางครั้งอาจจะต้องทำการ drop request ต่าง ๆ ออกไปด้วย !!
เราจัดการปัญหาเหล่านี้กันอย่างไรบ้าง ?