หากบอทของคุณพบข้อผิดพลาดเกี่ยวกับการจำกัดอัตรา ไม่ต้องกังวล นี่เป็นความท้าทายทั่วไปที่สามารถแก้ไขได้ด้วยแนวทางที่ถูกต้อง บทความนี้จะช่วยให้คุณเข้าใจระบบการจำกัดอัตราของ Discord และให้แนวทางการแก้ปัญหาที่เป็นประโยชน์
เนื้อหา
การเข้าใจประเภทการจำกัดอัตราของ Discord
การจำกัดอัตราที่กำหนดเฉพาะแหล่งข้อมูล
วิธีการระบุปัญหาการจำกัดด้านอัตราของคุณ
แนวทางปฏิบัติที่ดีที่สุดในการจัดการกับการจำกัดอัตรา
การพิจารณาเกตเวย์และการแบ่งส่วนเซิร์ฟเวอร์
การเข้าใจประเภทการจำกัดอัตราของ Discord
Discord ใช้การจำกัดอัตราหลายประเภทเพื่อปกป้อง API การระบุประเภทที่คุณกำลังเผชิญอยู่นั้นเป็นสิ่งสำคัญสำหรับการหาทางแก้ไขที่ถูกต้อง:
การจำกัดอัตราทั่วโลก
ข้อจำกัด: 50 คำขอต่อวินาที ในส่วนใหญ่ของจุดสิ้นสุด
ขอบเขต: ใช้กับแอปพลิเคชันทั้งหมดของคุณ
การระบุ: มองหาค่า X-RateLimit-Scope: global ในส่วนหัวของการตอบกลับ
การจำกัดอัตราตามเส้นทาง
ข้อจำกัด: แตกต่างกันไปตามจุดสิ้นสุด
ขอบเขต: เฉพาะแต่ละเส้นทาง API
การระบุ: มองหาค่า X-RateLimit-Scope: user
การจำกัดอัตราตามทรัพยากร
หมายเหตุ: การจำกัดอัตราที่กำหนดเฉพาะแหล่งข้อมูลอาจถูกเข้าถึงโดยหลายแหล่ง (ผู้ใช้คนอื่น ๆ, บอท, เว็บฮุก, ฯลฯ) และอาจไม่บ่งชี้ว่ามีเพียงแค่แอปพลิเคชันของคุณที่รับผิดชอบ
ข้อจำกัด: การจำกัดที่เป็นอิสระสำหรับกิลด์ ช่อง หรือ เว็บฮุก เฉพาะ
ขอบเขต: ใช้กับการดำเนินการที่กำหนดเฉพาะแหล่งข้อมูล
การระบุ: มองหาค่า X-RateLimit-Scope: shared ในส่วนหัว
การจำกัดคำขอที่ไม่ถูกต้อง
ข้อจำกัด: 10,000 คำขอที่ไม่ถูกต้องต่อ 10 นาที
สาเหตุทั่วไป: ข้อผิดพลาดที่ไม่ได้รับการจัดการ (401, 403, หรือ 429) ที่ทำให้เกิดคำขอข้อมูลที่พุ่งสูงขึ้น โปรดทราบว่า ข้อผิดพลาด 429 ที่ส่งกลับพร้อมกับ X-RateLimit-Scope: shared จะไม่นับรวมในข้อจำกัดคำขอที่ไม่ถูกต้องของคุณ
ผลลัพธ์: การระงับชั่วคราวของ Cloudflare
วิธีการระบุปัญหาการจำกัดด้านอัตราของคุณ
วิธีที่เชื่อถือได้ที่สุดในการระบุว่าคุณกำลังชนข้อจำกัดอะไรอยู่คือการตรวจสอบส่วนหัวการตอบสนอง HTTP เมื่อคุณได้รับรหัสสถานะ 429 หัวข้อหลักที่ต้องตรวจสอบ:
X-RateLimit-Limit: การจำกัดอัตราสำหรับจุดสิ้นสุดนั้น
X-RateLimit-Remaining: จำนวนคำขอที่เหลืออยู่ในหน้าต่างปัจจุบัน
X-RateLimit-Reset: เมื่อหน้าต่างจำกัดอัตรารีเซ็ต (ไทม์สแตมป์ Unix)
X-RateLimit-Reset-After: วินาทีจนกว่าจะรีเซ็ตข้อจำกัด
X-RateLimit-Scope: ระบุประเภทของการจำกัดอัตรา (ทั่วโลก, ผู้ใช้, หรือที่ใช้ร่วมกัน)
retry_after: มิลลิวินาทีที่จะต้องรอ ก่อนที่จะส่งคำขอใหม่อีกครั้ง
แนวทางปฏิบัติที่ดีที่สุดในการจัดการกับการจำกัดอัตรา
ดำเนินการกลยุทธ์การหยุดทำงานที่เหมาะสม
เคารพค่า retry_after ในการตอบสนองการจำกัดอัตราเสมอ นี่เป็นการบอกคุณอย่างชัดเจนว่าจะต้องรอนานเท่าไหร่ก่อนที่จะลองอีกครั้ง
พิจารณาใช้การโต้ตอบเมื่อเป็นไปได้
คำสั่งของแอปพลิเคชัน และ ส่วนประกอบข้อความ เป็นทางเลือกที่ดีเยี่ยมสำหรับคำสั่งคำนำหน้า ซึ่งอาจป้องกันคำขอ API และข้อความที่มากเกินไปในช่องต่าง ๆ
เคล็ดลับโบนัส: สร้างข้อความตอบกลับการโต้ตอบและติดตามผลให้เป็นข้อความชั่วคราว เนื่องจากข้อมูลเหล่านี้ไม่นับรวมในการจำกัดอัตรา
จัดเก็บข้อมูลในแคชอย่างมีประสิทธิภาพ
ลดการเรียก API โดยการเก็บข้อมูลที่เข้าถึงบ่อย ๆ ไว้ในแคช เช่น:
- ข้อมูลของกิลด์
- รายละเอียดช่อง
- โปรไฟล์ผู้ใช้
- ข้อมูลบทบาท
การใช้งานการควบคุมคำขอ
การควบคุมปริมาณเป็นแนวทางเชิงรุกในการป้องกันการจำกัดอัตราโดยการควบคุมความเร็วคำขอของคุณก่อนที่จะถึงข้อจำกัด
ตัวอย่างเช่น หากบอทของคุณต้องส่งข้อความต้อนรับไปยังสมาชิกใหม่ 200 ราย แทนที่จะส่งข้อความทั้งหมด 200 ข้อความทันที ให้วางข้อความเหล่านั้นไว้ในคิวที่ปล่อยคำขอ 4 รายการทุก ๆ 100 มิลลิวินาที วิธีนี้จะรักษาระดับอัตราคงที่ที่ 40 คำขอต่อวินาที โดยอยู่ต่ำกว่าขีดจำกัด 50 คำขออย่างปลอดภัย พร้อมทั้งรับประกันว่าข้อความทั้งหมดจะถูกส่งภายในเวลาประมาณ 5 วินาที
การจำกัดอัตราทั่วโลก
หากคุณกำลังประสบกับข้อจำกัดอัตราทั่วโลก โปรแกรมของคุณอาจมีปัญหาพื้นฐานที่จำเป็นต้องได้รับการแก้ไข
นี่คือวิธีการเพิ่มประสิทธิภาพโค้ดของคุณเพื่อให้ไม่เกินขีดจำกัด:
- การใช้แคชที่เหมาะสม
- ย้ายไปยังฟีเจอร์ที่ใช้การโต้ตอบเป็นพื้นฐาน
หากวิธีแก้ไขเหล่านี้ไม่สามารถแก้ไขปัญหาการจำกัดอัตราทั่วโลกของคุณได้ เราขอแนะนำให้คุณติดต่อในช่อง #api-help ของเซิร์ฟเวอร์นักพัฒนา Discord หรือติดต่อ ฝ่ายสนับสนุนนักพัฒนา
การพิจารณาเกตเวย์และการแบ่งส่วนเซิร์ฟเวอร์
สำหรับบอทที่จัดการเหตุการณ์แบบเรียลไทม์ผ่านทางเกตเวย์ของ Discord (การเชื่อมต่อ websocket) การแบ่งส่วนเซิร์ฟเวอร์เป็นสิ่งจำเป็นเมื่อบอทของคุณเติบโตขึ้น
การแบ่งส่วนเซิร์ฟเวอร์ คืออะไร
การแบ่งส่วนเซิร์ฟเวอร์จะทำให้บอทของคุณถูกแบ่งออกเป็นหลายอินสแตนซ์ โดยแต่ละอินสแตนซ์จะจัดการกับกลุ่มย่อยของกิลด์ สิ่งนี้จะกระจายโหลดไปยังการเชื่อมต่อเว็บซ็อกเก็ตหลาย ๆ จุด ช่วยให้คุณอยู่ภายในการจำกัดอัตราได้
แนะนำให้เริ่มวางแผนการใช้งานการแบ่งส่วนเซิร์ฟเวอร์เมื่อใกล้ถึงจำนวน 2,000 กิลด์ เนื่องจากการแบ่งส่วนเซิร์ฟเวอร์ต้องเปิดใช้งานเมื่อมีกิลด์มากกว่า 2,500 กิลด์ เพื่อประสิทธิภาพสูงสุด ควรทำตามหลักปฏิบัติที่ดีที่สุดคือรักษาประมาณ 1 การแบ่งส่วนเซิร์ฟเวอร์ต่อ 1,000 กิลด์
โปรดจำไว้ว่ามีการจำกัดอัตราไว้เพื่อให้มั่นใจว่าผู้ใช้ Discord ทุกคนจะได้รับประสบการณ์ที่เสถียร หากปฏิบัติตามแนวทางปฏิบัติดีที่สุดเหล่านี้ คุณสามารถสร้างบอทที่ปรับขนาดได้อย่างมีประสิทธิภาพโดยยังคงเคารพข้อจำกัดเหล่านี้ได้