ข้อกำหนดการจำกัดการเรียกใช้งาน API เพื่อป้องกันการใช้งานเกินขีดจำกัดของระบบ
เพื่อให้ระบบมีเสถียรภาพและสามารถให้บริการผู้ใช้งานทุกคนได้อย่างมีประสิทธิภาพ
API นี้มีการกำหนด Rate Limiting และ Concurrency Control
หาก Client ส่ง request เกินกว่าข้อจำกัดที่กำหนด ระบบจะตอบกลับด้วย
HTTP 429 Too Many Requests
Limit Summary
| Policy | Scope | Limit |
|---|---|---|
| ClientTokenLimit | POST /api/v1/clienttoken | 10 requests per minute |
| InsertFile/FileVault | POST /api/v1/{transaction}/insertFile,POST /api/v1/fileVault | 2 requests per minute |
| GetConcurrencyLimitByUserToken | GET ต่อ User Token | 10 concurrent requests |
| PostConcurrencyLimitByUserToken | POST ต่อ User Token | 5 concurrent requests |
Note: Concurrency limit จะนับเฉพาะ request ที่ยังประมวลผลไม่เสร็จ หรือยังไม่ได้รับ response เท่านั้น
Rate Limit Policy
Rate limit ใช้เพื่อจำกัดจำนวน request ภายในช่วงเวลาที่กำหนด
Client Token Scope
| Endpoint | Rate Limit |
|---|---|
| POST /api/v1/clienttoken | 10 requests per minute |
Example
หาก client ส่ง request มากกว่า 10 ครั้งภายใน 1 นาที
ระบบจะตอบกลับ
HTTP 429 Too Many Requests
ตัวอย่าง response
{
"error": "RATE_LIMITED",
"type": "rate",
"policy": "ClientTokenLimit",
"retryAfterSeconds": 60,
"message": "Too many requests. Please retry later.",
"path": "/api/v1/clienttoken",
"timestamp": "2026-03-12T14:20:00+07:00"
}Concurrency Limit Policy
Concurrency limit คือการจำกัดจำนวน request ที่กำลังประมวลผลพร้อมกัน (in-flight requests)
Concurrency limit ถูกกำหนด ต่อ User Token
| HTTP Method | Concurrent Limit |
|---|---|
| GET | 10 concurrent requests |
| POST | 5 concurrent requests |
ความหมาย
- สามารถมี GET requests ที่กำลังประมวลผลพร้อมกันได้สูงสุด 10 requests ต่อ User Token
- สามารถมี POST requests ที่กำลังประมวลผลพร้อมกันได้สูงสุด 5 requests ต่อ User Token
หากมี request ใหม่เข้ามาในขณะที่จำนวน concurrent request เกินกว่าที่กำหนด
ระบบจะปฏิเสธ request นั้นทันที
Concurrency Scope
Concurrency limit ถูกกำหนด ต่อ User Token
หมายความว่า
- User Token แต่ละตัวมี limit ของตัวเอง
- การใช้งานของ token หนึ่งจะไม่กระทบ token อื่น
Example
| User Token | Concurrent GET Requests |
|---|---|
| token-A | 10 |
| token-B | 10 |
หาก
- token-A ยิง GET 10 requests พร้อมกัน
- token-B ยังสามารถยิง GET ได้อีก 10 requests
เมื่อ request ถูกปฏิเสธเนื่องจากเกิน limit ระบบจะตอบกลับเป็น JSON ดังนี้
HTTP 429 Too Many Requests
ตัวอย่าง response
{
"error": "RATE_LIMITED",
"type": "concurrency",
"policy": "GetConcurrencyLimitByUserToken",
"retryAfterSeconds": null,
"message": "Too many concurrent requests. Please wait until the previous request completes before retrying.",
"path": "/api/v1/resource",
"timestamp": "2026-03-12T14:20:00+07:00"
}Response Fields
| Field | Type | Description |
|---|---|---|
| error | string | Error code |
| type | string | Limit type (rate หรือ concurrency) |
| policy | string | Rate limit policy ที่ถูก trigger |
| retryAfterSeconds | number/null | ระยะเวลาที่ควรรอก่อน retry |
| message | string | รายละเอียดของ error |
| path | string | API endpoint |
| timestamp | string | เวลาที่เกิดเหตุการณ์ |
Example Scenario
GET Request Example
Limit
10 concurrent GET requests per User Token
สถานการณ์
UserToken-A ส่ง GET request พร้อมกัน 15 requests
ผลลัพธ์
- 10 requests แรก → ระบบประมวลผล
- 5 requests ที่เหลือ → ได้รับ
429 Too Many Requests
POST Request Example
Limit
5 concurrent POST requests per User Token
สถานการณ์
UserToken-A ส่ง POST request พร้อมกัน 10 requests
ผลลัพธ์
- 5 requests แรก → ระบบประมวลผล
- 5 requests ที่เหลือ → ได้รับ
429 Too Many Requests
Recommended Client Behavior
เมื่อ client ได้รับ HTTP 429
| Scenario | Recommended Action |
|---|---|
| Rate limit exceeded | รอเวลาที่กำหนดใน retryAfterSeconds ก่อน retry |
| Concurrency limit exceeded | รอให้ request ก่อนหน้าประมวลผลเสร็จก่อนส่ง request ใหม่ |
Warning: ไม่ควร retry ทันทีหลังได้รับ
429เพราะอาจทำให้ชน limit ซ้ำและเพิ่มภาระให้ระบบ
Best Practices
Limit Parallel Requests
หลีกเลี่ยงการยิง request พร้อมกันจำนวนมาก
Implement Request Queue
ให้ client จัดการ queue ของ request
Use Retry with Backoff
เมื่อ request ล้มเหลวจากข้อจำกัดชั่วคราว เช่น HTTP 429 Too Many Requests
client ไม่ควร retry ทันที เพราะอาจทำให้ชน limit ซ้ำและเพิ่มภาระให้ระบบ
ควรรอระยะเวลาหนึ่งก่อน retry และเพิ่มระยะเวลาการรอในแต่ละรอบที่ retry ไม่สำเร็จ
ตัวอย่าง:
- ครั้งที่ 1 รอ 1 วินาที
- ครั้งที่ 2 รอ 2 วินาที
- ครั้งที่ 3 รอ 4 วินาที
- ครั้งที่ 4 รอ 8 วินาที
หาก response มี header Retry-After
client ควรรอตามเวลาที่ server ระบุก่อน retry
Tip: ถ้ามี
Retry-Afterให้ยึดค่าจาก server ก่อนใช้ backoff ที่ client กำหนดเอง
Monitor API Usage
ติดตามการใช้งาน API ของ client อย่างสม่ำเสมอ
Troubleshooting & Support
ทำไมถึงได้ HTTP 429
สาเหตุที่เป็นไปได้
- ส่ง request ถี่เกิน limit ที่กำหนด
- ส่ง request พร้อมกันเกิน concurrency limit
- request ก่อนหน้ายังประมวลผลไม่เสร็จ
ควรส่งอะไรให้ทีม Support
- Request timestamp
- API endpoint
- Response body
- Correlation ID (ถ้ามี)
ข้อมูลเหล่านี้จะช่วยให้ทีมสามารถตรวจสอบปัญหาได้รวดเร็วขึ้น
