Menggunakan corak Degupan Jantung di Golang
Melaksanakan Degupan Jantung dalam Go for Application Monitoring
Semasa pengembaraan saya dalam mengimbangi Jurutera Data & Perisian, saya sentiasa mencari sesuatu yang sedikit berbeza dalam GoLang untuk belajar, memahami cara ia berfungsi dan mengaplikasikannya pada perkara yang lebih kompleks daripada beberapa kursus dan artikel tradisional asas yang saya temui di internet . Dalam artikel pendek ini, saya akan melaporkan dan menunjukkan cara saya melaksanakan melalui Go Routines, pakej masa menggunakan Ticker untuk mensimulasikan degupan jantung ("Saya masih hidup") aplikasi, selain penggunaan saluran, dsb.
Bukan berita kepada ramai bahawa adalah amat penting untuk memastikan sesiapa yang memanggil fungsi tertentu tahu sama ada fungsi itu mengambil masa, memproses atau terkunci. Walau bagaimanapun, beberapa istilah lain telah muncul seperti Jejak, Metrik, ketersambungan, dsb., yang telah diperkenalkan dalam aplikasi pemantauan yang dalam kebanyakan kes menggunakan ejen yang dipasang pada pelayan aplikasi yang mengumpul metrik dan menghantarnya ke antara muka yang menggambarkan semua (atau hampir) status permohonan anda. Antara alatan ini, kami mempunyai DataDog, NewRelic, Slack, Grafana, Jaeger, dll.
Apa yang Kita Akan Ada Di Sini?
Sambil saya mengkaji dan berfikir tentang mencipta sesuatu yang pantas dan ringkas yang menangani beberapa konsep Go yang lebih maju, saya mencipta aplikasi yang agak mudah yang menggunakan corak degupan jantung. Sesiapa yang menghubungi saya menerima keputusan dan, pada masa yang sama, maklumat sama ada saya masih aktif atau tidak. Dalam senario yang lebih maju, ini mungkin menarik untuk menyesuaikan apa sebenarnya aplikasi aktif dari segi beberapa kekhususan perniagaan, kerana pelaksanaan mudah Prometheus menyelesaikan kes ini (adakah aplikasi itu aktif? CPU, Memori, goroutine terbuka), tetapi bukan dengan maklum balas serentak dan boleh disesuaikan.
Jam Kod!
Dari segi struktur, saya hanya mencipta tiga fail dalam pakej saya dengan mod go:
- dictionary.go: Mengandungi kamus nama untuk fungsi carian.
- task.go: Tugasan yang mengandungi fungsi mengimbas nama daripada kamus dan, pada masa yang sama, memaklumkan sama ada ia aktif atau tidak melalui pasukan. Ticker's channel beat.
- task_test.go: Melaksanakan ujian unit bagi fungsi yang terdapat dalam task.go untuk melihat kedua-dua respons daripada data kamus dan juga maklum balas sama ada aplikasi masih Naik!
kamus.pergi
Bahagian kod Go ini mentakrifkan pembolehubah yang dipanggil "kamus" iaitu peta yang mengaitkan aksara jenis rune dengan rentetan.
Setiap entri peta ialah kunci (rune) dan nilai (rentetan). Dalam contoh di bawah, kekunci adalah huruf kecil abjad dan nilainya ialah nama yang dikaitkan dengan setiap huruf. Contohnya, huruf ‘a’ dikaitkan dengan nama “airton”, huruf ‘b’ dikaitkan dengan nama “bruno”, dan seterusnya:
package heartbeat var dicionario = map[rune]string{ 'a': "airton", 'b': "bruno", 'c': "carlos", 'd': "daniel", 'e': "eduardo", 'f': "felipe", 'g': "gustavo", }
tugas.pergi
Saya menerangkan dengan lebih baik di bawah selepas kod lengkap setiap bahagian kod:
package heartbeat import ( "context" "fmt" "time" ) func ProcessingTask( ctx context.Context, letras chan rune, interval time.Duration, ) (<-chan struct{}, <-chan string) { heartbeats := make(chan struct{}, 1) names := make(chan string) go func() { defer close(heartbeats) defer close(names) beat := time.NewTicker(interval) defer beat.Stop() for letra := range letras { select { case <-ctx.Done(): return case <-beat.C: select { case heartbeats <- struct{}{}: default: } case names <- dicionario[letra]: lether := dicionario[letra] fmt.Printf("Letra: %s \n", lether) time.Sleep(3 * time.Second) // Simula um tempo de espera para vermos o hearbeats } } }() return heartbeats, names }
Mengimport Ketergantungan
package heartbeat import ( "context" "fmt" "time" )
Di sini saya mempunyai pakej degupan jantung saya yang akan bertanggungjawab untuk melaksanakan fungsi yang menghantar "degupan jantung" pada selang masa tertentu, sambil memproses tugas. Untuk ini, saya memerlukan konteks (Pengurusan Konteks), fmt (untuk pemformatan rentetan) dan masa untuk kawalan masa.
Definisi Fungsi Awal
func ProcessingTask ( ctx context.Context, letras chan rune, interval time.Duration, ) (<-chan struct{}, <-chan string) {
Ini ialah takrifan fungsi ProcessingTask yang mengambil konteks ctx, saluran huruf (saluran yang menerima aksara Unicode) dan selang masa sebagai argumen. Fungsi ini mengembalikan dua saluran: saluran degupan jantung yang menghantar struct kosong untuk setiap "degupan jantung" dan saluran nama yang menghantar nama huruf yang sepadan dengan setiap aksara yang diterima.
Saluran
heartbeats := make(chan struct{}, 1) names := make(chan string)
Dua baris ini mencipta dua saluran: degupan jantung ialah saluran penimbal dengan kapasiti satu elemen dan nama ialah saluran tanpa penimbal.
Pergi Rutin yang melakukan pengangkatan berat
go func() defer close(heartbeats) defer close(names) beat := time.NewTicker(interval) defer beat.Stop() for letra := range letras { select { case <-ctx.Done(): return case <-beat.C: select { case heartbeats <- struct{}{}: default: } case names <- dicionario[letra]: lether := dicionario[letra] fmt.Printf("Letra: %s \n", lether) time.Sleep(3 * time.Second) // Simula um tempo de espera para vermos o hearbeats } } }() return heartbeats, names
Ini ialah goroutine tanpa nama (atau fungsi tanpa nama yang dijalankan dalam urutan baharu) yang melaksanakan logik utama fungsi ProcessingTask. Ia menggunakan gelung untuk julat untuk membaca aksara daripada saluran huruf. Di dalam gelung, gunakan pilih untuk memilih tindakan yang akan dilakukan daripada pilihan yang tersedia:
- case <-ctx.Done(): Jika konteks dibatalkan, fungsi keluar serta-merta, menggunakan penyataan pulangan.
- case <-beat.C: Jika penanda rentak menghantar nilai, goroutine cuba menghantar struct kosong ke saluran degupan jantung menggunakan pilihan dengan lalai kosong.
- nama kes <- kamus[surat]: Jika surat diterima, goroutine mendapatkan nama surat yang sepadan daripada kamus kamus, menghantarnya ke saluran nama, mencetak surat ke skrin menggunakan pakej fmt dan menunggu tiga saat sebelum meneruskan ke watak seterusnya. Penantian simulasi ini adalah supaya kita dapat melihat "degupan jantung" dihantar.
Akhir sekali, fungsi ini mengembalikan degupan jantung dan menamakan saluran.
Menguji Aplikasi
task_test.go
package heartbeat var dicionario = map[rune]string{ 'a': "airton", 'b': "bruno", 'c': "carlos", 'd': "daniel", 'e': "eduardo", 'f': "felipe", 'g': "gustavo", }
Di sini saya mencipta ujian unit Go untuk fungsi ProcessingTask yang telah dijelaskan sebelum ini. Fungsi ujian TestProcessingTask mencipta konteks dengan tamat masa 20 saat dan paip aksara Unicode (huruf). Goroutine tanpa nama kemudiannya menghantar lirik ke saluran lirik. Fungsi ProcessingTask kemudiannya dipanggil dengan konteks, saluran aksara Unicode, dan selang masa. Ia mengembalikan dua saluran, saluran degupan jantung dan saluran perkataan.
Kemudian fungsi ujian menjalankan gelung tak terhingga dengan pilihan, yang dibaca daripada tiga saluran: konteks, saluran degupan jantung dan saluran perkataan.
Jika konteks dibatalkan, gelung ujian ditamatkan. Jika degupan jantung diterima, "Permohonan Naik!" dicetak kepada output standard. Jika perkataan diterima, ujian menyemak sama ada perkataan itu terdapat dalam kamus huruf. Jika ia tidak hadir, ujian gagal dan mesej ralat dipaparkan.
Oleh itu, ujian unit ini menguji fungsi ProcessingTask kami, yang menerima aksara daripada satu saluran, menghantar nama huruf ke saluran lain dan mengeluarkan "degupan jantung" semasa berjalan dalam konteks di mana saya menggunakan had masa. Ahhh... dan ia juga menyemak sama ada nama huruf yang dihantar ke saluran perkataan terdapat dalam kamus.
Kesimpulan Saya
Kod Go ini menggambarkan beberapa konsep penting bahasa Go dan ujian unit:
- Konteks
- Gorutin
- Saluran
- Ujian unit (menggunakan pilih untuk memantau berbilang saluran)
Projek penuh pada GitHub saya: https://github.com/AirtonLira/heartbeatsGolang
LinkedIn - Airton Lira Junior
Atas ialah kandungan terperinci Menggunakan corak Degupan Jantung di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Golang lebih baik daripada Python dari segi prestasi dan skalabiliti. 1) Ciri-ciri jenis kompilasi Golang dan model konkurensi yang cekap menjadikannya berfungsi dengan baik dalam senario konvensional yang tinggi. 2) Python, sebagai bahasa yang ditafsirkan, melaksanakan perlahan -lahan, tetapi dapat mengoptimumkan prestasi melalui alat seperti Cython.

Golang lebih baik daripada C dalam kesesuaian, manakala C lebih baik daripada Golang dalam kelajuan mentah. 1) Golang mencapai kesesuaian yang cekap melalui goroutine dan saluran, yang sesuai untuk mengendalikan sejumlah besar tugas serentak. 2) C Melalui pengoptimuman pengkompil dan perpustakaan standard, ia menyediakan prestasi tinggi yang dekat dengan perkakasan, sesuai untuk aplikasi yang memerlukan pengoptimuman yang melampau.

GoisidealforbeginnersandSuekableforcloudandnetworkservicesduetoitssimplicity, kecekapan, danconcurrencyfeatures.1) installgofromtheofficialwebsiteandverifywith'goversion'.2)

Golang sesuai untuk pembangunan pesat dan senario serentak, dan C sesuai untuk senario di mana prestasi ekstrem dan kawalan peringkat rendah diperlukan. 1) Golang meningkatkan prestasi melalui pengumpulan sampah dan mekanisme konvensional, dan sesuai untuk pembangunan perkhidmatan web yang tinggi. 2) C mencapai prestasi muktamad melalui pengurusan memori manual dan pengoptimuman pengkompil, dan sesuai untuk pembangunan sistem tertanam.

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golangisidealforbuildingscalablesystemsduetoitseficiencyandcurrency, whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.golang'sdesignencouragescouragescouragescouragescourageSlean, readablecodeanditsouragescouragescourscean,
