Rumah pembangunan bahagian belakang Golang Cara melaksanakan had harian pengguna dalam Go

Cara melaksanakan had harian pengguna dalam Go

Jan 10, 2022 pm 03:55 PM
go go-zero perkhidmatan mikro

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.

Cara melaksanakan had harian pengguna dalam Go

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.

Cara melaksanakan had harian pengguna dalam Go

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
Salin selepas log masuk

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
  }
)
Salin selepas log masuk

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
  }
}
Salin selepas log masuk
Had semasa tetingkap tetap ini boleh digunakan untuk mengehadkan, contohnya, pengguna hanya boleh menghantar mesej teks kod pengesahan 5 kali sehari Pada masa ini, kita perlu sepadan dengan zon waktu Cina (GMT 8), dan sebenarnya, masa had semasa harus bermula dari sifar, pada masa ini Kami memerlukan penjajaran tambahan (set align to true).

// 计算过期时间也就是窗口时间大小
// 如果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
}
Salin selepas log masuk
Alamat projek

github.com/zeromicro/go-zero

Selamat datang

dan go-zerobintang 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!

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)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan 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)

Bagaimana untuk menghantar mesej Go WebSocket? Bagaimana untuk menghantar mesej Go WebSocket? Jun 03, 2024 pm 04:53 PM

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}).

Rangka Kerja PHP dan Perkhidmatan Mikro: Penerapan dan Pengkontenaan Asli Awan Rangka Kerja PHP dan Perkhidmatan Mikro: Penerapan dan Pengkontenaan Asli Awan Jun 04, 2024 pm 12:48 PM

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.

Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Jun 04, 2024 pm 12:27 PM

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.

Bagaimana untuk menggunakan pembungkus ralat Golang? Bagaimana untuk menggunakan pembungkus ralat Golang? Jun 03, 2024 pm 04:08 PM

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.

Bagaimana untuk mencipta Goroutine yang diutamakan dalam Go? Bagaimana untuk mencipta Goroutine yang diutamakan dalam Go? Jun 04, 2024 pm 12:41 PM

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.

Bagaimanakah rangka kerja Java menyokong penskalaan mendatar perkhidmatan mikro? Bagaimanakah rangka kerja Java menyokong penskalaan mendatar perkhidmatan mikro? Jun 04, 2024 pm 04:34 PM

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.

Perkara yang perlu diambil perhatian apabila fungsi Golang menerima parameter peta Perkara yang perlu diambil perhatian apabila fungsi Golang menerima parameter peta Jun 04, 2024 am 10:31 AM

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 perkhidmatan mikro Golang Cipta sistem teragih menggunakan rangka kerja perkhidmatan mikro Golang Jun 05, 2024 pm 06:36 PM

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

See all articles