การจำกัดอัตราการเรียก (Rate Limit) และการควบคุมปริมาณ
สำหรับนักพัฒนาที่ต้องการสร้างการประมวลผลแบบแบตช์・การประมวลผลแบบซิงค์ที่เรียก API ของ ReceiptRoller เป็นจำนวนมาก
หน่วยของการจำกัดอัตรา
การจำกัดอัตราจะใช้กับหน่วยของการจับคู่ระหว่างแอป × ร้านค้า แม้จะเป็นแอปเดียวกัน หากร้านค้าต่างกันก็นับแยกกัน
เพดานแยกตามแพลน (แพลนฝั่งร้านค้า)
| แพลน | ต่อวินาที | ต่อวัน |
|---|---|---|
| Starter | 10 req/s | 100,000 req |
| Growth | 50 req/s | 1,000,000 req |
| Enterprise | สัญญาเฉพาะราย | สัญญาเฉพาะราย |
อนุญาตให้เบิร์สต์ในช่วงสั้น ๆ ได้สูงสุด 2 เท่า ด้วยกลไก token bucket
เฮดเดอร์การตอบกลับ
ทุกการตอบกลับของ API จะมีสถานะการจำกัดอัตราปัจจุบันแนบมาด้วย
X-RateLimit-Limit: 10 ← เพดานต่อ 1 วินาที X-RateLimit-Remaining: 7 ← ที่เหลือ X-RateLimit-Reset: 1745740001 ← เวลาที่รีเซ็ต (Unix วินาที) X-RateLimit-Resource: receipts ← รีซอร์สที่ถูกจำกัด
กรณีที่ถึงเพดาน:
HTTP/1.1 429 Too Many Requests
Retry-After: 1
X-RateLimit-Remaining: 0
{ "error": { "code": "rate_limited", "message": "..." } }
การเขียนโค้ดเพื่อไม่ให้ชนเพดาน
1. การควบคุมปริมาณฝั่งไคลเอนต์
ควรมีกลไกจำกัดอัตราการส่งที่ฝั่งไคลเอนต์เองด้วย การควบคุมปริมาณตั้งแต่แรกจะเสถียรกว่าการรอให้เกิด 429 ก่อน
// ตัวอย่าง token bucket อย่างง่าย
class RateLimiter {
constructor(perSecond) {
this.tokens = perSecond;
this.max = perSecond;
setInterval(() => { this.tokens = this.max; }, 1000);
}
async acquire() {
while (this.tokens <= 0) await sleep(50);
this.tokens--;
}
}
2. ใช้เอนด์พอยต์แบบแบตช์
ReceiptRoller มีBatch APIที่จัดการหลายรีซอร์สในหนึ่งรีเควสต์ ซึ่งคุ้มค่ากว่าการเรียกทีละรายการในแง่ของการจำกัดอัตรา
POST /v1/products/batch
{
"products": [
{ "sku": "A001", "name": "..." },
{ "sku": "A002", "name": "..." }
]
}
3. แคช・ดึงเฉพาะส่วนต่าง
- ข้อมูลที่เปลี่ยนแปลงยาก (ข้อมูลร้าน・ข้อมูลหลักของสินค้า) ให้แคชไว้ที่ฝั่งไคลเอนต์
- การดึงเป็นรายการ ให้ดึงเฉพาะส่วนต่างด้วย
updated_after - รับการแจ้งเตือนผ่าน Webhook แล้วค่อยดึงรายละเอียดผ่าน API (เลิกใช้การ polling ทั้งหมด)
4. ควบคุมระดับการทำงานพร้อมกัน
ควบคุมจำนวนรีเควสต์ที่ทำพร้อมกันให้ไม่เกินเพดานต่อวินาที การใช้ Promise.all ยิงทั้งหมดพร้อมกันจะทำให้ชน 429 ในพริบตา กรุณาควบคุมจำนวนที่ทำงานพร้อมกันด้วย p-limit หรือเครื่องมือคล้ายกัน
การขอผ่อนปรนเพดาน
หากด้วยลักษณะงานแล้วยังไงก็เกินเพดาน สามารถขอผ่อนปรนได้ด้วยสัญญาเฉพาะรายของแพลน Enterprise กรุณาติดต่อฝ่ายขายหรือฝ่ายสนับสนุน
คู่มือที่เกี่ยวข้อง
-
วิธีใช้ Reservations APIคู่มือ Reservations API ของ ReceiptRoller (/api/v1/reservations) อธิบายการทำ CRUD และอัปเดตสถานะการจอง การดึง・สร้าง・สร้างชุดของช่องจอง (สล็อต) การดึงข้อมูลโต๊ะ (โต๊ะ・ห้องส่วนตัว・เคาน์เตอร์) ที่ลงทะเบียนไว้ในเลย์เอาต์ร้าน และสถิติการจอง
-
วิธีใช้ In-Store Media Display API (Display API)ภาพรวมของ In-Store Android Display API ของ ReceiptRoller (/api/v1/displays/*) และขั้นตอนการจับคู่・heartbeat・การดึงเพลย์ลิสต์・การรายงานผลการเล่น คู่มือเริ่มต้นสำหรับสร้างแอปเล่นมีเดียลูปบนเครื่อง Android แบบ POS ควบคู่หรือเครื่องไซเนจของร้าน
-
การเชื่อมต่อข้อมูลการซื้อและใบเสร็จอธิบายโครงสร้างข้อมูลการซื้อและใบเสร็จที่ ReceiptRoller จัดการ วิธีการดึงข้อมูล สโคปที่เกี่ยวข้อง Webhook และกรณีการใช้งานที่พบบ่อย
-
สารบัญความช่วยเหลือสำหรับนักพัฒนาสารบัญความช่วยเหลือสำหรับนักพัฒนา ReceiptRoller รวบรวมตั้งแต่การสมัครเป็นนักพัฒนา การลงทะเบียนแอปพลิเคชัน การยืนยันตัวตน OAuth และสโคป คู่มือการพัฒนา (แอปวอลเล็ต, Webhook สำหรับร้านค้า, Survey API) คู่มือแยกตามโดเมนข้อมูล การใช้งานและความปลอดภัย คอมมูนิตี ไปจนถึงการแก้ปัญหา
-
ดึงรายการบัญชีธุรกิจ・ร้านค้า・เครื่อง POSคู่มือสรุปขั้นตอนการดึงรายการบัญชีธุรกิจที่ผู้ใช้สังกัด ร้านค้าภายใต้บัญชีนั้น และเครื่อง POS ของแต่ละร้านผ่าน REST API จากแอปมือถือ/แอปเซิร์ฟเวอร์ของ ReceiptRoller