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:
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!