Pemasa Golang melaksanakan pengehadan semasa

PHPz
Lepaskan: 2023-05-13 09:12:36
asal
523 orang telah melayarinya

Dalam pembangunan harian, kita sering menghadapi senario konkurensi tinggi, dan pengehadan arus yang ketat amat penting pada masa ini. Di Golang, cara biasa untuk melaksanakan pengehadan semasa ialah menggunakan pemasa (Pemasa) untuk mengehadkan bilangan permintaan serentak dengan mengawal masa pencetus pemasa. Artikel ini akan memperkenalkan cara menggunakan pemasa Golang untuk melaksanakan pengehadan semasa.

1. Apakah pemasa?

Di Golang, Pemasa ialah pemasa peringkat sistem Anda boleh membuat pemasa untuk mencetuskan tugas atau acara dengan kerap. Apabila membuat Pemasa, anda perlu menentukan selang masa dan anda boleh menggunakan kaedah Tetapkan Semula untuk menetapkan semula atau menghentikan pemasa.

Idea asas menggunakan pemasa untuk melaksanakan pengehadan semasa ialah: tetapkan selang masa, seperti 1 saat Setiap kali permintaan datang, kami menetapkan semula pemasa jika bilangan permintaan tiba dalam masa 1 saat Jika ambang yang ditetapkan melebihi, permintaan akan ditolak.

2. Proses menggunakan pemasa untuk melaksanakan pengehadan semasa

Proses menggunakan pemasa untuk melaksanakan pengehadan semasa adalah seperti berikut:

  1. Memulakan pembilang dan pemasa.
  2. Setiap kali permintaan diterima, naikkan nilai pembilang dan tetapkan semula pemasa.
  3. Apabila selang masa tiba, tentukan sama ada nilai kaunter melebihi nilai had Jika tidak, tolak permintaan itu, kosongkan kaunter dan tunggu permintaan seterusnya.

3. Contoh kod pelaksanaan

Di Golang, pakej masa dalam perpustakaan standard menyediakan jenis Pemasa dan jenis Ticker, yang boleh digunakan untuk mencipta pemasa. Berikut ialah kod sampel yang menggunakan Pemasa untuk melaksanakan pengehadan semasa:

package main

import (
    "fmt"
    "time"
)

func main() {
    maxRequests := 100 //最多请求量
    interval := 1 * time.Second //间隔时间
    timer := time.NewTimer(interval)
    counter := 0 //请求计数器

    for {
        select {
        case <-timer.C: // 定时器到期
            fmt.Println("time up")
            if counter > maxRequests { // 如果请求数超出限制
                fmt.Printf("too many requests, counter=%d
", counter)
            } else {
                fmt.Printf("counter=%d
", counter)
            }
            counter = 0 // 重置计数器
            timer.Reset(interval) // 重置定时器
        default:
            time.Sleep(time.Millisecond * 100) // 模拟处理请求的耗时
            counter++ // 计数器加1
        }
    }
}
Salin selepas log masuk

Analisis kod:

Kod sampel ini menetapkan pengawal pengehad semasa dengan bilangan maksimum permintaan 100 dan selang 1 saat. Dalam gelung utama, pantau peristiwa tamat tempoh pemasa melalui pernyataan pilih, dan lakukan pemprosesan pengehadan semasa apabila pemasa tamat tempoh.

Gunakan masa.Tidur di cawangan lalai untuk mensimulasikan masa penggunaan permintaan dan tambah 1 pada kaunter. Apabila pemasa tamat tempoh, tentukan sama ada nilai pembilang melebihi ambang yang ditetapkan Jika ia berlaku, tolak permintaan dan keluarkan mesej segera yang menunjukkan bahawa terdapat terlalu banyak permintaan Jika tidak, keluarkan bilangan permintaan semasa, kosongkan pembilang dan tetapkan semula pemasa.

4. Gunakan Ticker untuk melaksanakan pengehadan semasa

Selain Pemasa, Golang juga menyediakan jenis masa yang dipanggil Ticker, yang serupa dengan jenis Pemasa, tetapi boleh mencetuskan peristiwa secara berkala. Berikut ialah contoh kod yang turut menggunakan pembilang dan pemasa untuk melaksanakan pengehadan semasa Kali ini jenis Ticker digunakan:

package main

import (
    "fmt"
    "time"
)

func main() {
    maxRequests := 100 //最多请求量
    interval := 1 * time.Second //间隔时间
    ticker := time.NewTicker(interval)
    counter := 0 //请求计数器

    for {
        select {
        case <-ticker.C: // 定时器到期
            fmt.Println("time up")
            if counter > maxRequests { // 如果请求数超出限制
                fmt.Printf("too many requests, counter=%d
", counter)
            } else {
                fmt.Printf("counter=%d
", counter)
            }
            counter = 0 // 重置计数器
        default:
            time.Sleep(time.Millisecond * 100) // 模拟处理请求的耗时
            counter++ // 计数器加1
        }
    }
}
Salin selepas log masuk

Perbezaan daripada kod contoh yang dilaksanakan oleh Pemasa ialah kali ini kita menggunakan fungsi NewTicker. untuk mencipta objek Pemasa dan mendengar acara tanda pemasa dalam gelung utama. Apabila acara tanda tiba, kaunter disemak dan dikosongkan, masa pemprosesan permintaan disimulasikan dalam cawangan lalai, dan nilai kaunter dinaikkan.

Perlu diingat bahawa apabila menggunakan Ticker, kaedah Stop mesti dipanggil untuk menghentikan pemasa apabila program keluar. Jika tidak, pemasa akan sentiasa berjalan di latar belakang dan membazirkan sumber.

5. Ringkasan

Artikel ini memperkenalkan cara menggunakan pemasa (Pemasa) dan Ticker Golang untuk melaksanakan pengehadan semasa Dalam senario konkurensi tinggi, kawalan pengehadan arus yang ketat adalah penting. Menggunakan pemasa untuk melaksanakan pengehadan semasa ialah cara yang cekap dan boleh dipercayai, dan merupakan komponen yang amat diperlukan untuk banyak aplikasi web peringkat perusahaan.

Semasa proses pelaksanaan, anda perlu memahami prinsip kerja dan penggunaan pemasa, dan menetapkan parameter yang munasabah seperti selang masa dan bilangan maksimum permintaan untuk memastikan kawalan pengehad semasa boleh mencapai kesan yang optimum.

Atas ialah kandungan terperinci Pemasa Golang melaksanakan pengehadan semasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!