การจำกัดอัตราการเรียก (Rate Limit) และการควบคุมปริมาณ

API การจำกัดอัตรา 429 การควบคุมปริมาณ
บทความนี้เหมาะสำหรับใคร
สำหรับนักพัฒนาที่ต้องการสร้างการประมวลผลแบบแบตช์・การประมวลผลแบบซิงค์ที่เรียก API ของ ReceiptRoller เป็นจำนวนมาก

หน่วยของการจำกัดอัตรา

การจำกัดอัตราจะใช้กับหน่วยของการจับคู่ระหว่างแอป × ร้านค้า แม้จะเป็นแอปเดียวกัน หากร้านค้าต่างกันก็นับแยกกัน

เพดานแยกตามแพลน (แพลนฝั่งร้านค้า)

แพลน ต่อวินาที ต่อวัน
Starter10 req/s100,000 req
Growth50 req/s1,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 กรุณาติดต่อฝ่ายขายหรือฝ่ายสนับสนุน

คู่มือที่เกี่ยวข้อง

このトピックについて
開発者API
機能の詳細を見る
แท็ก
API (22) OAuth (15) Android (10) iOS (9) Webhook (8) api (7) oauth (5) getting-started (4) การลงทะเบียนแอป (4) การแก้ปัญหา (4)
บทความที่เกี่ยวข้อง