Golang, sebagai bahasa pengaturcaraan dengan prestasi unggul, selalunya digunakan untuk mengendalikan program sebelah pelayan konkurensi tinggi. Apabila berurusan dengan konkurensi yang tinggi, selalunya perlu mengehadkan aliran permintaan untuk memastikan ketersediaan dan kestabilan perkhidmatan.
Terdapat banyak algoritma pengehad semasa yang popular di Golang, seperti algoritma baldi token, algoritma baldi bocor, dsb. Di bawah ini kami akan menggunakan algoritma baldi token sebagai contoh untuk memperkenalkan pelaksanaan algoritma ini.
1. Prinsip Algoritma Token Bucket
Algoritma Token Bucket ialah algoritma pengehadan semasa yang agak mudah dan berkesan. Prinsipnya agak mudah, kita boleh memahaminya dengan baldi.
Kita boleh menganggap permintaan itu sebagai air, dan token sebagai air dalam baldi. Setiap permintaan perlu mendapatkan token daripada baldi sebelum memasuki sistem. Apabila baldi tidak mempunyai token, permintaan ditolak.
Badi membocorkan air pada kadar tertentu, iaitu sistem memproses bilangan permintaan pada kadar tertentu. Apabila token dalam baldi belum dikeluarkan, lebihan token akan disimpan dalam baldi, menunggu permintaan seterusnya.
2. Golang melaksanakan algoritma baldi token
Di bawah kami akan menggunakan Golang untuk melaksanakan algoritma baldi token yang mudah.
1. Tentukan struktur TokenBucket
Pertama, kita perlu mentakrifkan struktur TokenBucket untuk menyimpan parameter dalam baldi token.
type TokenBucket struct { capacity int // 令牌桶容量 rate time.Duration // 令牌桶填充速率 tokens int // 当前令牌数 lastUpdate time.Time // 上一次更新时间 }
2. Tulis fungsi permulaan TokenBucket
Seterusnya, kita perlu menulis fungsi permulaan TokenBucket untuk memulakan parameter baldi token.
func NewTokenBucket(capacity int, rate time.Duration) *TokenBucket { return &TokenBucket{ capacity: capacity, rate: rate, tokens: 0, lastUpdate: time.Now(), } }
3. Laksanakan kaedah Take() untuk TokenBucket
Seterusnya, kita perlu melaksanakan kaedah Take() untuk TokenBucket. Kaedah ini digunakan untuk mengeluarkan token daripada baldi token, dan mengembalikan palsu jika token tidak boleh diperolehi.
func (tb *TokenBucket) Take() bool { tokens := tb.tokens - 1 if tokens < 0 { return false } tb.tokens = tokens return true }
4. Laksanakan kaedah Isi Semula() untuk TokenBucket
Seterusnya, kita perlu melaksanakan kaedah Isi Semula() untuk TokenBucket untuk pengisian token secara tetap.
func (tb *TokenBucket) Refill() { now := time.Now() diff := now.Sub(tb.lastUpdate) tokens := int(diff / tb.rate) if tokens > 0 { tb.tokens = tb.tokens + tokens if tb.tokens > tb.capacity { tb.tokens = tb.capacity } tb.lastUpdate = now } }
5. Laksanakan kaedah Run() untuk TokenBucket
Akhir sekali, kita perlu melaksanakan kaedah Run() untuk TokenBucket dan mulakan goroutine untuk mengisi dan mengemas kini token.
func (tb *TokenBucket) Run() { ticker := time.NewTicker(tb.rate) go func() { for { select { case <-ticker.C: tb.Refill() } } }() }
6 Gunakan TokenBucket untuk pengehadan semasa
Menggunakan TokenBucket untuk pengehadan semasa adalah sangat mudah. Anda hanya perlu memanggil kaedah Take() pada setiap permintaan. Jika benar dikembalikan, ini bermakna permintaan boleh dibuat, jika tidak aliran perlu dihadkan.
bucket := NewTokenBucket(100, time.Millisecond*10) bucket.Run() // 需要进行限流的请求 if !bucket.Take() { // 进行限流处理,以避免系统负载过高 }
3. Ringkasan
Melalui kod di atas, kita dapat melihat kaedah pelaksanaan mudah algoritma baldi token. Dalam projek sebenar, kami boleh melaraskan dan mengoptimumkan mengikut keperluan khusus, seperti meningkatkan bilangan percubaan mengehadkan semasa, melaraskan kadar pengisian, dsb. Menguasai kaedah pelaksanaan algoritma pengehadan semasa ini sangat membantu untuk memahami reka bentuk dan proses pelaksanaan sistem konkurensi tinggi.
Atas ialah kandungan terperinci Analisis ringkas tentang algoritma pengehadan semasa di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!