Cara melaksanakan had harian pengguna dalam Go
Artikel ini ditulis oleh ruangan tutorial golang untuk memperkenalkan cara melaksanakan had harian pengguna dalam Go. Saya harap ia dapat membantu rakan yang memerlukan.
Laksanakan had harian pengguna dalam Go (contohnya, anda hanya boleh menerima faedah tiga kali sehari)
Jika anda menulis sistem pengurusan pepijat dan menggunakan ini
PeriodLimit
anda hanya boleh mengehadkan setiap pepijat setiap hari. Adakah kerja lebih mudah? :P
Sebab penting mengapa seni bina perkhidmatan mikro begitu popular pada masa kini adalah untuk mengurangkan kerumitan keseluruhan sistem, mengagihkan risiko sistem secara sama rata kepada subsistem untuk memaksimumkan kestabilan sistem, dan membahagikannya kepada yang berbeza. kawasan melalui pembahagian domain Selepas subsistem dipasang, setiap subsistem boleh dibangunkan, diuji dan dikeluarkan secara bebas, dan rentak dan kecekapan P&P boleh dipertingkatkan dengan ketara.
Tetapi ia juga membawa masalah, seperti: pautan panggilan terlalu panjang, kerumitan seni bina pelaksanaan meningkat dan pelbagai perisian tengah perlu menyokong senario yang diedarkan. Untuk memastikan operasi normal perkhidmatan mikro, tadbir urus perkhidmatan adalah amat diperlukan, yang biasanya merangkumi: pengehadan semasa, penurunan taraf dan pemutus litar.
Penghadan semasa merujuk kepada mengehadkan kekerapan panggilan antara muka untuk mengelakkan melebihi had beban dan menjatuhkan sistem. Contohnya:
Senario jualan kilat e-dagang
Had semasa API untuk pedagang yang berbeza
Biasa digunakan Algoritma pengehad semasa ialah:
- Penghadan arus tetingkap masa tetap
- Penghadan arus tetingkap masa gelongsor
- Penghad arus baldi bocor
- Penstriman terhad baldi token
Artikel ini menerangkan terutamanya algoritma pengehadan semasa tetingkap masa tetap.
Prinsip Kerja
Bermula dari masa tertentu, setiap permintaan datang dengan kiraan permintaan 1. Pada masa yang sama, ia dinilai sama ada bilangan permintaan dalam tetingkap masa semasa melebihi had Jika ia melebihi had, permintaan itu kemudiannya dikosongkan apabila tetingkap masa berikutnya mula menunggu permintaan.
Kebaikan dan keburukan
Kelebihan
Mudah untuk melaksanakan Ia adalah cekap dan amat sesuai untuk mengehadkan senario seperti pengguna hanya boleh menghantar 10 artikel sehari, hanya boleh menghantar kod pengesahan SMS 5 kali, dan hanya boleh cuba log masuk 5 kali Senario sebegitu sangat biasa perniagaan.
Kelemahan
Kelemahan pengehadan arus tetingkap masa tetap ialah ia tidak dapat mengendalikan senario permintaan bahagian kritikal secara tiba-tiba.
Anggapkan bahawa had semasa ialah 100 permintaan setiap 1 saat, dan pengguna memulakan 200 permintaan dalam masa 1 saat bermula dari 500ms pertengahan Pada masa ini, semua 200 permintaan boleh diluluskan. Ini tidak konsisten dengan jangkaan kami untuk mengehadkan arus kepada 100 kali sesaat Puncanya ialah ketulusan had semasa adalah terlalu kasar.
perlaksanaan kod go-zero
core/limit/periodlimit.go
go-zero Gunakan masa tamat redis untuk mensimulasikan tetingkap masa tetap.
skrip redis lua:
-- KYES[1]:限流器key-- ARGV[1]:qos,单位时间内最多请求次数-- ARGV[2]:单位限流窗口时间-- 请求最大次数,等于p.quotalocal limit = tonumber(ARGV[1])-- 窗口即一个单位限流周期,这里用过期模拟窗口效果,等于p.permitlocal window = tonumber(ARGV[2])-- 请求次数+1,获取请求总数local current = redis.call("INCRBY",KYES[1],1)-- 如果是第一次请求,则设置过期时间并返回 成功if current == 1 then redis.call("expire",KYES[1],window) return 1-- 如果当前请求数量小于limit则返回 成功elseif current limit则返回 失败else return 0end
Takrifan pengehad semasa tetingkap masa tetap
type ( // PeriodOption defines the method to customize a PeriodLimit. // go中常见的option参数模式 // 如果参数非常多,推荐使用此模式来设置参数 PeriodOption func(l *PeriodLimit) // A PeriodLimit is used to limit requests during a period of time. // 固定时间窗口限流器 PeriodLimit struct { // 窗口大小,单位s period int // 请求上限 quota int // 存储 limitStore *redis.Redis // key前缀 keyPrefix string // 线性限流,开启此选项后可以实现周期性的限流 // 比如quota=5时,quota实际值可能会是5.4.3.2.1呈现出周期性变化 align bool } )
Beri perhatian untuk menjajarkan Parameter, apabila align=true, had atas permintaan akan berubah secara berkala.
Sebagai contoh, apabila kuota=5, kuota sebenar mungkin 5.4.3.2.1, menunjukkan perubahan berkala
Logik pengehad semasa
Malah, logik pengehad semasa berada di atas Skrip lua dilaksanakan Perlu diingat bahawa nilai pulangan
- 0: menunjukkan ralat, seperti kegagalan redis atau beban berlebihan
- 1: dibenarkan <. 🎜> 2: dibenarkan Walau bagaimanapun, tetingkap semasa telah mencapai had atas Jika ia adalah perniagaan kelompok, anda boleh tidur dan menunggu tetingkap seterusnya (pengarang telah mempertimbangkannya dengan teliti) 3: Penolakan
// Take requests a permit, it returns the permit state. // 执行限流 // 注意一下返回值: // 0:表示错误,比如可能是redis故障、过载 // 1:允许 // 2:允许但是当前窗口内已到达上限 // 3:拒绝 func (h *PeriodLimit) Take(key string) (int, error) { // 执行lua脚本 resp, err := h.limitStore.Eval(periodScript, []string{h.keyPrefix + key}, []string{ strconv.Itoa(h.quota), strconv.Itoa(h.calcExpireSeconds()), }) if err != nil { return Unknown, err } code, ok := resp.(int64) if !ok { return Unknown, ErrUnknownCode } switch code { case internalOverQuota: return OverQuota, nil case internalAllowed: return Allowed, nil case internalHitQuota: return HitQuota, nil default: return Unknown, ErrUnknownCode } }
// 计算过期时间也就是窗口时间大小 // 如果align==true // 线性限流,开启此选项后可以实现周期性的限流 // 比如quota=5时,quota实际值可能会是5.4.3.2.1呈现出周期性变化 func (h *PeriodLimit) calcExpireSeconds() int { if h.align { now := time.Now() _, offset := now.Zone() unix := now.Unix() + int64(offset) return h.period - int(unix%int64(h.period)) } return h.period }
dan go-zero
bintang untuk menyokong kami!
Atas ialah kandungan terperinci Cara melaksanakan had harian pengguna dalam Go. 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

AI Hentai Generator
Menjana ai hentai secara percuma.

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



Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Faedah menggabungkan rangka kerja PHP dengan perkhidmatan mikro: Kebolehskalaan: Memanjangkan aplikasi dengan mudah, menambah ciri baharu atau mengendalikan lebih banyak beban. Fleksibiliti: Perkhidmatan mikro digunakan dan diselenggara secara bebas, menjadikannya lebih mudah untuk membuat perubahan dan kemas kini. Ketersediaan tinggi: Kegagalan satu perkhidmatan mikro tidak menjejaskan bahagian lain, memastikan ketersediaan yang lebih tinggi. Kes praktikal: Menggunakan perkhidmatan mikro menggunakan Laravel dan Kubernetes Langkah: Buat projek Laravel. Tentukan pengawal perkhidmatan mikro. Buat fail Docker. Buat manifes Kubernetes. Sebarkan perkhidmatan mikro. Uji perkhidmatan mikro.

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Dalam Golang, pembalut ralat membolehkan anda membuat ralat baharu dengan menambahkan maklumat kontekstual kepada ralat asal. Ini boleh digunakan untuk menyatukan jenis ralat yang dilemparkan oleh perpustakaan atau komponen yang berbeza, memudahkan penyahpepijatan dan pengendalian ralat. Langkah-langkahnya adalah seperti berikut: Gunakan fungsi ralat. Balut untuk membalut ralat asal kepada ralat baharu. Ralat baharu mengandungi maklumat kontekstual daripada ralat asal. Gunakan fmt.Printf untuk mengeluarkan ralat yang dibalut, memberikan lebih konteks dan kebolehtindakan. Apabila mengendalikan pelbagai jenis ralat, gunakan fungsi ralat. Balut untuk menyatukan jenis ralat.

Terdapat dua langkah untuk mencipta Goroutine keutamaan dalam bahasa Go: mendaftarkan fungsi penciptaan Goroutine tersuai (langkah 1) dan menentukan nilai keutamaan (langkah 2). Dengan cara ini, anda boleh mencipta Goroutine dengan keutamaan yang berbeza, mengoptimumkan peruntukan sumber dan meningkatkan kecekapan pelaksanaan.

Rangka kerja Java menyokong pengembangan mendatar perkhidmatan mikro Kaedah khusus termasuk: Spring Cloud menyediakan Ribbon dan Feign untuk pengimbangan beban sisi pelayan dan klien. NetflixOSS menyediakan Eureka dan Zuul untuk melaksanakan penemuan perkhidmatan, pengimbangan beban dan failover. Kubernetes memudahkan penskalaan mendatar dengan penskalaan automatik, pemeriksaan kesihatan dan mulakan semula automatik.

Apabila menghantar peta ke fungsi dalam Go, salinan akan dibuat secara lalai dan pengubahsuaian pada salinan tidak akan menjejaskan peta asal. Jika anda perlu mengubah suai peta asal, anda boleh menghantarnya melalui penuding. Peta kosong perlu dikendalikan dengan berhati-hati, kerana ia secara teknikal adalah penunjuk sifar, dan menghantar peta kosong kepada fungsi yang menjangkakan peta tidak kosong akan menyebabkan ralat.

Cipta sistem teragih menggunakan rangka kerja mikro perkhidmatan Golang: Pasang Golang, pilih rangka kerja mikroperkhidmatan (seperti Gin), cipta perkhidmatan mikro Gin, tambah titik akhir untuk menggunakan perkhidmatan mikro, bina dan jalankan aplikasi, buat pesanan dan inventori perkhidmatan mikro, gunakan titik akhir untuk memproses pesanan dan inventori Gunakan sistem pemesejan seperti Kafka untuk menyambung perkhidmatan mikro Gunakan perpustakaan sarama untuk menghasilkan dan menggunakan maklumat pesanan
