Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis ringkas tentang algoritma pengehadan semasa di Golang

Analisis ringkas tentang algoritma pengehadan semasa di Golang

PHPz
PHPzasal
2023-03-30 09:10:41618semak imbas

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn