WEB API: Quota

Introduce

กลับมาอีกบท ที่มีตัวหนังสือเยอะๆ 😀

ตอนนี้จะพูดถึงการจัดการ Quota ของ Service API ทั้งแนวคิดและการเขียนโค้ดแนะนำเบื้องต้น โดยใช้ ASP.NET WEB API ทำเดโม  เพราะนับได้ว่าเป็น Rest API ของทางฝั่ง Microsoft และใช้งานได้ดีทีเดียว ซึ่งรองรับการเขียนโค้ดเข้าไปเพิ่มเติมแทบทุกส่วนของขั้นตอนการทำงานได้

เนื้อหาหลักคือเรื่องการทำ Quota   ซึ่งเราสามารถพบได้แทบทุกระบบบริการขนาดใหญ่ ที่ให้บริการเข้าใช้ทรัพยากรของตนนั้น จะมี Quota Manager เข้ามาช่วยในการจัดการสัดส่วนให้แก่ผู้ใช้ตามเงื่อนไขต่างๆ

ส่วนใหญ่การทำ Quota จะกำหนดขอบเขต จำนวน หรือระยะเวลา ในการอนุญาตให้เข้าถึงทรัพยากรระบบ ไม่ว่าจะเป็น Bandwidth, Disk Space, CPU, Memory, API หรือ Cloud Service ต่างๆ   และหากใช้งานเกินกำหนดช่วงเวลานั้น ก็อาจจะแจ้งเตือนก่อนหรือหยุดการเข้าใช้งานทันทีตาม policy ที่ตกลงกันไว้ตั้งแต่ก่อนเข้าใช้บริการ

ตัวอย่างระบบที่ใช้งาน Quota และรายละเอียดอื่นๆ

 

Problem and Solution

ปัญหาที่พบเห็นบ่อยๆ ของ Service API คือ จัดการทรัพยากร โดยกำหนดการใช้งานตามสมควรและสมเหตุสมผลต่อผู้ใช้งาน  ตามต้นทุนและกำไรที่เกิดขึ้น

หากเราไม่มีการกำหนด Quota การใช้งาน Service API ขึ้นมาควบคุม ให้มองเห็น ต้นทุนชัดเจน (Exploit Cost) เราก็จะมีต้นทุนแฝง (Implicit Cost) เกิดขึ้นและอาจจะผันแปรตามจำนวนการใช้งาน

ต้นทุนทางด้าน IT ค่อนข้างมีมูลค่าสูง หากจำนวน request เข้ามามีจำนวนมหาศาล และเริ่มมี response กลับไปช้าลง คน IT ส่วนใหญ่ก็จะบอกให้เพิ่ม Server เพิ่ม Network Bandwidth หรือกระทั่งกลับไปรื้อโค้ดมานั่ง Tuning กันทั้งที่เค้นกันสุดๆแล้ว  เรื่องพวกนี้ก็ใช้ COST ในการทำทั้งหมด

ถ้าเล่าต้นตอสาเหตุก็มาจาก User  ผมขอมอง User ที่เข้าใช้งาน Service API ทั่วไป แบ่งออกเป็นกลุ่มคร่าวๆ

กลุ่ม B2B   –  partner ที่มีผลประโยชน์ระหว่างกัน โดยมี request เข้าใช้ API ของคู่ค้าผู้ให้บริการหลัก โดยจำนวน request เข้าใช้บริการ ในกลุ่มนี้จะมีจำนวนมาก  มองในปัญหากรณีที่ partner บางรายทำรายได้ให้เจ้าของ API ได้น้อย แต่กลับมีการเรียกใช้บริการเกินจำนวนที่เหมาะสมตามจริง ทำให้ Partner อีกรายที่เป็นรายได้หลักมีปัญหาในการเข้าใช้บริการ API  เนื่องจากทรัพยากร ณ ช่วงเวลานั้นไม่เพียงพอให้บริการ

กลุ่ม C2B  – กลุ่มนี้จะเป็นรายย่อย จำนวน request ของแต่ละ customer จะมีปริมาณน้อย แต่เนื่องจากเป็นกลุ่ม customer ซึ่งมักจะมีจำนวนมากกว่า รวมถึงลักษณะการเข้าใช้งานก็จะแตกต่างกันด้วย และรวมไปถึงรายได้ต่อรายมีจำนวนไม่มากเท่ากลุ่มแรก

SOLUTION ในการแก้ปัญหาก็ค่อนข้างชัดเจนว่าเราต้องมีการกำหนด Quota ขึ้นแต่ละ API   ส่วนแนวทางการกำหนดตัวเลขนั้นขึ้นอยู่กับว่า

หากการเข้าใช้ API ด้วยการจ่ายเงิน เราก็สามารถกำหนด Quota ได้ง่ายทั่วไป

การเข้าใช้่ API มีกำไรเกิดขึ้นจากการแลกเปลี่ยนข้อมูลกัน Quota ที่จะกำหนดให้นั้นก็ต้องดูจากผลกำไรที่เกิดขึ้นจากผู้ใช้แต่ละรายไป

 

Add Quota Request Handler to WEB API

มาถึงโค้ดกันซักทื

ตัวอย่าง requirement สมมติของระบบ

“ต้องการจัดการควบคุม quota จาก IPAddress ของผู้ใช้งาน API  โดยกำหนดให้แต่ละ IP Address เข้าใช้งาน API รวมทั้งหมดไม่เกิน 10 requests/ minute (*ใช้ 10 เพื่อง่ายต่อการเทส)”

แล้วเราก็มาถึงส่วนของ CODE กัน โดยสิ่งที่ต้องมีคือ

  • Visual Studio 2013 or later
  • Chrome and PostMan  or another rest tool

 

เริ่มต้นด้วยการสร้างโปรเจค ASP.NET ตามภาพด้านล่าง

2015-04-25_032507

 

เลือก Empty -> กดเช็ค Web API

2015-04-25_032522

ติดตั้ง Nuget Package

PM> install-package WebApiContrib

ต่อมาเปิด App_Start/WebApiConfig.cs  ขึ้นมาแก้ใน Register() วาง code นี้ลงไป

  • line 1  ThrottlingHandler เป็นคลาสที่มากับ WebApiContrib โดยการทำงานของคลาสเพื่อช่วยควบคุมจำนวน โควต้าในการส่ง request เข้ามา
  • line 2 เป็นการใช้ InMemory Store เพื่อเก็บจำนวน request ที่เข้ามาในระยะเวลานั้น  ***บทต่อไปจะ custom sql store เก็บลง database เพื่อง่ายต่อการสเกลระบบ
  • line 3 กำหนด โควต้าที่อนุญาติให้เข้าใช้งาน  ***ในบทต่อไปจะอ่านค่าจาก database กรณีที่เก็บลง database
  • line 4 กำหนดระยะเวลาของโควต้า
  • line 5 error message เมื่อเกินกำหนดโควต้า
  • line 6 แอดลง message handler ของ web api

ต่อไปสร้าง APIController ขึ้นมาไว้เทสการทำงาน

 TESTING

กด F5 ใน Visual Studio แล้ว copy url address มา

2015-04-25_042417

แล้วเปิด Postman ขึ้นมา แล้วใส่   http://URL/api/balance
จากนั้นใส่ค่า Content-Type : application/json และ Accept : application/json
เสร็จแล้วกด Send

2015-04-25_042557

จะได้ json result กลับมาจาก web api และเมื่อกดต่อไปอีก 10 ครั้ง

2015-04-25_042609

จะได้ HTTP STATUS 409 Exceed the limit 10 requests per minute! 

2015-04-25_042618

 

Conclusion

บทนี้ได้พูดภาพโดยรวม เพื่อให้เข้าใจและมองเห็นความสำคัญของการจำกัดโควต้าของแต่ละ user  ในตอนหน้าหากสะดวกจะกลับมาเพิ่มเติมส่วนที่ใช้งาน Web API ด้วยการเก็บข้อมูลการเข้าใช้งานลง Database และผูกข้อมูลกับ User Account

😀

(Visited 1,236 times, 1 visits today)

Leave a Reply