0Pricing
Go Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิดบักเก็ตโทเค็น
  2. golang.org/x/time/rate
  3. การจำกัดความเร็ว Goroutine
  4. การหน่วงเวลาและลองใหม่
← กลับไปที่ Go Academy