Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara melaksanakan had permintaan menggunakan konteks dalam Go

Cara melaksanakan had permintaan menggunakan konteks dalam Go

PHPz
PHPzasal
2023-07-21 15:05:281198semak imbas

Cara melaksanakan had permintaan menggunakan konteks dalam Go

Apabila membangunkan aplikasi web, had permintaan ialah tugas yang sangat penting, yang boleh membantu kami mengawal penggunaan sumber dan melindungi kestabilan sistem. Pakej konteks disediakan dalam pustaka standard bahasa Go, yang boleh digunakan untuk mengurus konteks permintaan dan melaksanakan fungsi sekatan permintaan. Artikel ini akan memperkenalkan cara menggunakan konteks untuk melaksanakan sekatan permintaan dalam Go dan memberikan contoh kod yang sepadan.

1 Fahami pakej konteks

Pakej konteks ialah perpustakaan standard dalam bahasa Go yang digunakan untuk memindahkan maklumat konteks permintaan. Ia menyediakan beberapa kaedah untuk membantu kami mengurus kitaran hayat permintaan, membatalkan permintaan, lulus nilai permintaan, dsb. Berikut ialah beberapa kaedah yang biasa digunakan dalam pakej konteks:

  1. konteks.Latar Belakang(): Cipta Konteks kosong, biasanya digunakan sebagai nod akar pokok Konteks.
  2. context.WithCancel(parent): Buat Konteks dengan fungsi pembatalan, digunakan untuk membatalkan pelaksanaan Konteks anak.
  3. context.WithDeadline(parent,deadline): Cipta Konteks dengan fungsi tarikh akhir untuk membatalkan pelaksanaan Konteks anak sebelum masa yang ditentukan.
  4. context.WithTimeout(parent,timeout): Cipta Konteks dengan fungsi tamat masa untuk membatalkan pelaksanaan Konteks anak selepas masa yang ditentukan.
  5. context.WithValue(parent,key,value): Cipta Konteks dengan fungsi hantaran nilai untuk menghantar nilai dalam pokok Konteks.

2. Gunakan konteks untuk melaksanakan sekatan permintaan

Di bawah kami akan menggunakan beberapa kaedah pakej konteks untuk melaksanakan fungsi sekatan permintaan yang mudah. Katakan kita ingin mengehadkan antara muka tertentu untuk hanya mengendalikan 10 permintaan sesaat Permintaan yang melebihi had ini akan ditolak. Kita boleh mencapai fungsi ini dengan menggunakan pakej konteks Kodnya adalah seperti berikut:

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    // 创建一个带有取消功能的Context
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // 启动一个goroutine来执行请求处理
    go handleRequests(ctx)

    // 模拟发送100个请求
    for i := 1; i <= 100; i++ {
        select {
        case <-ctx.Done():
            fmt.Println("Too many requests, request", i, "cancelled")
        default:
            // 发送请求
            sendRequest(i)

            // 等待一秒钟
            time.Sleep(time.Second)
        }
    }
}

func handleRequests(ctx context.Context) {
    // 创建一个计数器
    counter := 0

    for {
        select {
        case <-ctx.Done():
            return
        default:
            // 检查当前请求数量是否超过限制
            if counter >= 10 {
                time.Sleep(time.Second)
            } else {
                // 处理请求
                handleRequest(counter)

                // 计数器加一
                counter++
            }
        }
    }
}

func handleRequest(requestID int) {
    fmt.Println("Handling request", requestID)
}

func sendRequest(requestID int) {
    fmt.Println("Sending request", requestID)
}

Dalam kod di atas, kita mula-mula mencipta Konteks dengan fungsi pembatalan dan memulakan goroutine untuk mengendalikan permintaan. Kemudian, dalam gelung yang mensimulasikan penghantaran permintaan, kami menggunakan penyataan pilih untuk menentukan sama ada bilangan permintaan semasa melebihi had Jika ia tidak melebihi had, kemudian hantar permintaan dan tambahkan satu pembilang, jika tidak, tunggu satu kedua. Akhir sekali, dalam fungsi yang mengendalikan permintaan, kami hanya mencetak ID permintaan.

3. Menjalankan hasil

Apabila kita menjalankan kod di atas, hasil output akan serupa dengan yang berikut:

Sending request 1
Handling request 0
Sending request 2
Handling request 1
Sending request 3
Handling request 2
Sending request 4
Handling request 3
Sending request 5
Handling request 4
Sending request 6
Handling request 5
Sending request 7
Handling request 6
Sending request 8
Handling request 7
Sending request 9
Handling request 8
Too many requests, request 11 cancelled
Too many requests, request 16 cancelled
Too many requests, request 21 cancelled
...

Seperti yang dapat dilihat daripada hasil output, 10 permintaan pertama boleh diproses secara normal, tetapi seiring dengan berlalunya masa oleh, menghantar Bilangan permintaan melebihi had, jadi permintaan melebihi had dibatalkan.

4. Ringkasan

Artikel ini memperkenalkan cara menggunakan pakej konteks untuk melaksanakan sekatan permintaan. Melalui contoh kod, kami belajar cara membuat, membatalkan dan lulus konteks serta cara mengehadkan bilangan permintaan semasa menggunakan konteks. Saya berharap melalui pengenalan artikel ini, anda boleh lebih memahami cara menggunakan konteks untuk melaksanakan sekatan permintaan dalam Go.

Atas ialah kandungan terperinci Cara melaksanakan had permintaan menggunakan konteks dalam Go. 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