golang.org/x/time/rate
ใช้ตัวจำกัดอัตรา
golang.org/x/time/rate เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
แพ็กเกจ rate
golang.org/x/time/rate มี Limiter แบบถังโทเคนที่พร้อมใช้ในงานจริง และเป็นตัวเลือกมาตรฐานสำหรับการจำกัดอัตราในภาษา Go
- การนำไปใช้งานจริงผ่านการทดสอบมาอย่างมาก
- มีเมธอด Allow, Wait และ Reserve
- รองรับบริบท
การสร้างตัวจำกัดอัตรา
rate.NewLimiter รับอัตรา (จำนวนโทเคนต่อวินาที) และขนาดการพุ่งเป็นช่วง ส่วน rate.Limit คือค่า float64 ของจำนวนเหตุการณ์ต่อวินาที
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
หากคุณคิดเป็นช่วงเวลาแทนอัตราต่อวินาที rate.Every จะแปลงระยะเวลาเป็นอัตรา เหตุการณ์หนึ่งรายการทุก 200ms เท่ากับห้ารายการต่อวินาที
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
Allow รายงานว่าขณะนี้มีโทเคนพร้อมใช้งานหรือไม่ โดยจะส่งคืนค่า true และใช้โทเคนหนึ่งรายการ หรือส่งคืนค่า false ทันที ใช้เมธอดนี้เพื่อปฏิเสธคำขอส่วนเกิน
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
Wait จะหยุดรอจนกว่าจะมีโทเคนพร้อมใช้งานหรือบริบทถูกยกเลิก เหมาะสำหรับกรณีที่คุณต้องการควบคุมจังหวะการทำงานแทนการทิ้งงาน
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
Reserve ส่งคืน Reservation ที่ระบุระยะเวลาที่ต้องรอ เรียก Delay() เพื่อดูเวลาที่ต้องรอ และเรียก Cancel() หากตัดสินใจไม่ดำเนินการต่อ
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())หมายเหตุ: แพ็กเกจภายนอก
แพ็กเกจ rate ไม่ได้อยู่ในไลบรารีมาตรฐาน จึงต้องใช้ go get golang.org/x/time/rate และโมดูล ตัวอย่างโค้ดที่นำเข้าแพ็กเกจนี้มีไว้เพื่ออธิบายแนวคิดและจะไม่ถูกรันโดยตรงในบทเรียนนี้
ตัวอย่างเทียบเท่าที่เรียกใช้ได้ด้วยไลบรารีมาตรฐาน
เนื่องจากแพ็กเกจ rate เป็นแพ็กเกจภายนอก ต่อไปนี้คือตัวควบคุมจังหวะด้วยไลบรารีมาตรฐาน ซึ่งเลียนแบบ Wait ด้วยการส่งสัญญาณทุก 200ms
package main
import (
"fmt"
"time"
)
func main() {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
for i := 0; i < 4; i++ {
<-tick.C
fmt.Println("processed event", i)
}
}การปรับขณะทำงาน
คุณสามารถเปลี่ยนขีดจำกัดขณะทำงานด้วย SetLimit และ SetBurst วิธีนี้มีประโยชน์เมื่อโหลดการตั้งค่าใหม่ หรือเมื่อการตอบกลับรหัส 429 จากระบบต้นทางแจ้งให้คุณลดความเร็วลง
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)ตัวจำกัดอัตราต่อไคลเอนต์
เก็บแผนผังจากคีย์ไคลเอนต์ไปยัง *rate.Limiter โดยมีมิวเทกซ์คอยป้องกัน สร้างตัวจำกัดอัตราเมื่อได้รับคำขอแรกสำหรับคีย์นั้น จากนั้นนำกลับมาใช้กับคำขอถัดไป
func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
if l, ok := m[key]; ok {
return l
}
l := rate.NewLimiter(rate.Limit(5), 10)
m[key] = l
return l
}มิดเดิลแวร์ HTTP
ครอบตัวจัดการคำขอเพื่อให้แต่ละคำขอเรียก Allow() ก่อน หากได้ค่า false ให้ตอบกลับด้วย HTTP 429 Too Many Requests นี่คือการจำกัดอัตราที่เป็นมาตรฐานสำหรับฝั่งเซิร์ฟเวอร์
ตรวจสอบอย่างรวดเร็ว
ทดสอบความรู้เกี่ยวกับแพ็กเกจจำกัดอัตราของคุณ
สรุป
คุณได้เรียนรู้ golang.org/x/time/rate:
- NewLimiter(rate, burst) สร้างบักเก็ต
- rate.Every แปลงช่วงเวลาเป็นอัตรา
- Allow ปฏิเสธคำขอ, Wait ควบคุมจังหวะ, Reserve รายงานเวลาหน่วง
- SetLimit และ SetBurst ปรับค่าได้ระหว่างการทำงาน
- ใช้แผนผังต่อไคลเอนต์ร่วมกับ HTTP 429 สำหรับเซิร์ฟเวอร์
คำถามที่พบบ่อย
บทเรียน “golang.org/x/time/rate” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “golang.org/x/time/rate” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “golang.org/x/time/rate”
ใช้ตัวจำกัดอัตรา คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “golang.org/x/time/rate” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิดบักเก็ตโทเค็น
- golang.org/x/time/rate
- การจำกัดความเร็ว Goroutine
- การหน่วงเวลาและลองใหม่