Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan konteks untuk melaksanakan pemutus litar permintaan dalam Go

Cara menggunakan konteks untuk melaksanakan pemutus litar permintaan dalam Go

WBOY
WBOYasal
2023-07-25 09:04:541328semak imbas

Cara menggunakan konteks untuk melaksanakan pemutus litar permintaan dalam Go

Dengan populariti seni bina perkhidmatan mikro, komunikasi antara pelbagai perkhidmatan telah menjadi semakin kerap. Dalam komunikasi antara perkhidmatan, rantai panggilan mungkin sangat panjang, dan kegagalan atau tamat masa satu permintaan boleh menyebabkan keseluruhan rantai panggilan gagal, sekali gus menjejaskan ketersediaan keseluruhan sistem. Untuk melindungi keseluruhan sistem daripada kegagalan satu perkhidmatan, kami boleh menggunakan pemutus litar permintaan untuk mengawal dan mengehadkan akses kepada perkhidmatan tertentu. Artikel ini akan memperkenalkan cara menggunakan konteks untuk melaksanakan pemutus litar permintaan dalam Go.

Apakah pemutus litar permintaan?

Permintaan pemutus litar adalah strategi yang digunakan untuk melindungi keseluruhan sistem. Apabila kadar kegagalan permintaan sesuatu perkhidmatan melebihi ambang yang telah ditetapkan, pemutus litar permintaan akan segera menafikan akses kepada perkhidmatan, dengan itu mengelakkan berlakunya kegagalan berlatarkan. Mod pemutus permintaan biasanya digunakan dalam kombinasi dengan corak pemutus litar (Circuit Breaker Pattern) Apabila permintaan gagal, pemutus litar akan dibuka dengan cepat, dengan itu menolak permintaan untuk perkhidmatan dan menghalang sejumlah besar permintaan daripada bertimbun dan. menyebabkan kehabisan sumber sistem.

Kod sampel untuk menggunakan konteks untuk melaksanakan pemutus litar permintaan dalam Go adalah seperti berikut:

package main

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

type CircuitBreaker struct {
    context    context.Context
    cancel     context.CancelFunc
    maxFail    int
    fail       int
    breaker    bool
    resetTime  time.Duration
    breakerMux sync.Mutex
}

func NewCircuitBreaker(maxFail int, resetTime time.Duration) *CircuitBreaker {
    ctx, cancel := context.WithCancel(context.Background())

    circuitBreaker := &CircuitBreaker{
        context:    ctx,
        cancel:     cancel,
        maxFail:    maxFail,
        fail:       0,
        breaker:    false,
        resetTime:  resetTime,
        breakerMux: sync.Mutex{},
    }

    return circuitBreaker
}

func (c *CircuitBreaker) Do(req func() error) error {
    select {
    case <-c.context.Done():
        return fmt.Errorf("circuit breaker is open")
    default:
        if !c.breaker {
            err := req()
            if err == nil {
                c.reset()
            } else {
                c.fail++
                if c.fail >= c.maxFail {
                    c.breakerMux.Lock()
                    c.breaker = true
                    c.breakerMux.Unlock()
                    go time.AfterFunc(c.resetTime, c.reset)
                }
            }
            return err
        } else {
            return fmt.Errorf("circuit breaker is open") 
        }
    }
}

func (c *CircuitBreaker) reset() {
    c.fail = 0
    c.breakerMux.Lock()
    c.breaker = false
    c.breakerMux.Unlock()
    c.cancel()
}

func main() {
    circuitBreaker := NewCircuitBreaker(3, 2*time.Minute)

    // 进行模拟请求
    for i := 0; i < 10; i++ {
        err := circuitBreaker.Do(func() error {
            // 这里执行实际的请求操作,此处只是模拟
            fmt.Println("执行请求...")
            if i%5 == 0 {
                return fmt.Errorf("request failed")
            }
            return nil
        })

        if err != nil {
            fmt.Printf("请求失败: %v
", err)
        } else {
            fmt.Println("请求成功")
        }
    }
}

Dalam kod sampel di atas, kami melaksanakan pemutus litar permintaan ringkas melalui struktur CircuitBreaker. Struktur CircuitBreaker mempunyai atribut berikut:

  • konteks dan batal: digunakan untuk mengawal kitaran hayat pemutus permintaan Selepas fius dibuka, permintaan akan ditolak.
  • maxFail: Tetapkan bilangan kegagalan maksimum Apabila bilangan kegagalan melebihi nilai yang ditetapkan, fius akan terbuka.
  • gagal: Catat bilangan permintaan yang gagal.
  • pemutus: Rekod status fius Apabila benar, ia bermakna fius terbuka.
  • masa semula: masa set semula fius Selepas membuka fius, selepas tempoh masa ini, fius akan ditutup semula.

Operasi permintaan khusus boleh dilakukan melalui kaedah Do Jika permintaan berjaya, kiraan kegagalan akan ditetapkan semula dan tiada akan dikembalikan. Jika permintaan gagal, kiraan kegagalan akan dinaikkan, dan apabila kiraan kegagalan mencapai nilai yang ditetapkan, fius akan dibuka.
Perlu diingat bahawa apabila fius dibuka, permintaan baru akan segera mengembalikan maklumat ralat.

Dalam fungsi utama, kami mencipta sampel CircuitBreaker dan mensimulasikan 10 permintaan. Apabila bilangan kegagalan mencapai nilai yang ditetapkan, fius akan dibuka dan permintaan baharu akan ditolak.

Dengan menggunakan pakej konteks dan struktur CircuitBreaker tersuai, kami boleh melaksanakan fungsi pemutus permintaan dengan mudah dalam Go. Menggunakan pemutus litar permintaan boleh melindungi keseluruhan sistem dengan berkesan daripada kesan kegagalan perkhidmatan tunggal dan meningkatkan ketersediaan dan kestabilan sistem.

Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan pemutus litar permintaan 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