Rumah pembangunan bahagian belakang Golang Pemutus Litar dalam apl Go

Pemutus Litar dalam apl Go

Sep 03, 2024 pm 02:15 PM

Hari ini adalah perkara biasa untuk aplikasi kami mempunyai beberapa kebergantungan, terutamanya apabila bekerja dalam persekitaran perkhidmatan mikro. Tidak jarang apabila apl kami melaporkan ralat, kami mendapati bahawa satu pergantungan telah berkurangan.

Satu amalan baik untuk meningkatkan daya tahan kita ialah mematikan komunikasi dengan apl yang tidak berkelakuan baik. Melihat ke dalam bidang lain, kami mempelajari konsep pemutus litar daripada kejuruteraan elektrik, di mana suis dimatikan apabila kegagalan berlaku. Di Brazil, semua rumah mempunyai suis ini yang akan ditutup secara automatik jika rangkaian elektrik kita menjadi tidak stabil.

Dalam sains komputer, pemutus litar kami sedikit lebih kompleks kerana ia juga mempunyai keadaan perantaraan. Lukisan di bawah menerangkan lebih lanjut tentang cara ia berfungsi:

Circuit Breaker in Go apps

Ringkasnya, keadaan yang mungkin adalah:

  • terbuka: tiada komunikasi antara apl. Apabila mencapai keadaan ini, pemasa bermula, membenarkan kebergantungan untuk mewujudkan semula dirinya. Apabila pemasa tamat, kami beralih ke separuh terbuka.
  • ditutup: terdapat komunikasi antara aplikasi. Pada setiap permintaan yang dilakukan dengan kegagalan, kaunter dikemas kini. Jika kami mencapai ambang kegagalan, kami menggerakkan litar untuk dibuka.
  • separuh terbuka: ia adalah keadaan penyembuhan sehingga kita boleh bekerja seperti biasa. Semasa di atasnya, jika kita mencapai ambang kejayaan kita beralih ke ditutup. Jika permintaan terus gagal, kami kembali untuk membuka.

Cukup keren, bukan? Untuk menerangkan konsep dengan lebih baik, mengapa tidak menciptanya?

Pertama, mari kita bina perkhidmatan kami A. Ia akan bertanggungjawab untuk menerima semua permintaan, dengan kata lain, ia akan menjadi perkhidmatan yang bergantung pada aplikasi utama kami. Untuk memudahkan, kami akan mendedahkan dua titik akhir: a /kejayaan yang akan sentiasa bertindak balas dengan 200 dan /kegagalan yang akan sentiasa bertindak balas dengan 500.

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/success", func(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusOK) })
    http.HandleFunc("/failure", func(w http.ResponseWriter, r *http.Request) { 
    w.WriteHeader(http.StatusInternalServerError) })

    fmt.Println("Server is running at http://localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
Salin selepas log masuk

Perkhidmatan B kami akan bertanggungjawab untuk memanggil perkhidmatan A dan akan membina pemutus litar kami. Komuniti Go sudah mempunyai lib gobreaker yang sudah melaksanakan corak. Pertama sekali, kami mentakrifkan sifat pemutus kami:

var st gobreaker.Settings
st.Name = "Circuit Breaker PoC"
st.Timeout = time.Second * 5
st.MaxRequests = 2
st.ReadyToTrip = func(counts gobreaker.Counts) bool {
    return counts.ConsecutiveFailures >= 1
}
Salin selepas log masuk

Walaupun lib membolehkan kami menyesuaikan lebih banyak sifat, kami akan menumpukan pada tiga sahaja:

  • Tamat masa: berapa lama ia akan berada dalam keadaan terbuka. Dalam contoh ini, kami memilih lima saat.
  • MaxRequests: berapa banyak permintaan yang berjaya sebelum ia ditutup. Dalam contoh ini, kami memutuskan dua permintaan.
  • ReadyToTrip: mentakrifkan syarat untuk beralih dari tertutup ke terbuka. Memudahkan, satu kegagalan sudah memadai.

Sekarang kita hanya menyalakan pemutus dan menghantar permintaan:

cb := gobreaker.NewCircuitBreaker[int](st)

url := "http://localhost:8080/success"
cb.Execute(func() (int, error) { return Get(url) })
fmt.Println("Circuit Breaker state:", cb.State()) // closed!

url = "http://localhost:8080/failure"
cb.Execute(func() (int, error) { return Get(url) })
fmt.Println("Circuit Breaker state:", cb.State()) // open!

time.Sleep(time.Second * 6)
url = "http://localhost:8080/success"
cb.Execute(func() (int, error) { return Get(url) })
fmt.Println("Circuit Breaker state:", cb.State()) // half-open!

url = "http://localhost:8080/success"
cb.Execute(func() (int, error) { return Get(url) })
fmt.Println("Circuit Breaker state:", cb.State()) // closed!
Salin selepas log masuk

Kita dapat perhatikan bahawa gobreaker berfungsi seperti pembalut di sekeliling fungsi. Jika fungsi mengembalikan ralat, ia akan meningkatkan pembilang kegagalan, dan jika tidak, ia akan meningkatkan pembilang kejayaan. Mari kita takrifkan fungsi itu:

func Get(url string) (int, error) {
    r, _ := http.Get(url)

    if r.StatusCode != http.StatusOK {
        return r.StatusCode, fmt.Errorf("failed to get %s", url)
    }

    return r.StatusCode, nil
}
Salin selepas log masuk

Dan itulah cara kita boleh mempunyai aplikasi Go dengan pemutus litar! Apabila menggunakan corak ini, anda boleh meningkatkan daya tahan apl anda dengan menjadikannya lebih bertolak ansur terhadap kegagalan daripada kebergantungan anda. Selain itu, menggunakan lib ini mengalih keluar kebanyakan kerumitan, menjadikannya lebih mudah untuk menggunakan corak dalam apl harian kami. Jika anda ingin melihat kod bukti konsep ini, semak di sini.

Jika anda masih ingin tahu tentang corak daya tahan yang lain, Elton Minetto turut menerbitkan catatan blog yang hebat mengenainya!

Anda juga boleh menyemak ini dan siaran lain di blog peribadi saya. Beritahu saya pendapat anda tentang catatan blog ini dalam ulasan dan satu soalan: adakah anda pernah menggunakan pemutus litar sebelum ini?

Atas ialah kandungan terperinci Pemutus Litar dalam apl Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Bagaimana anda menulis ujian unit di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

See all articles