Go實現網站訪問量控制(滑動視窗演算法,類似利用Redis List資料結構屬性)
對於使用者訪問頻率控制,比如每分鐘,只允許訪問多少次,方法很多。較為精準的就有比如“利用Redis實現訪問控制頻率”,還有就是RateLimiter(令牌桶演算法)等。
visitercontrol 介紹:
https://github.com/yudeguang/visitercontrol ,可實現單位時間內,最多允許多少使用者訪問,可以以IP或者使用者名稱等作為區分使用者。與RateLimiter不同,visitercontrol可以實現較為精確的流量限制。與Redis相比,其效率遠遠高於Redis,Redis每秒大致只能實現十萬級別的讀寫。
對於訪問控制,分為兩種,一種是簡單規則,一種是複雜規則,複雜規則其實就是多個簡單規則的疊加,並同時作用在同一使用者身上。
主要核心函式如下:
package visitercontrol
import "github.com/yudeguang/visitercontrol"
Index
typeMultipleVisitercontrol
type MultipleVisitercontrol struct { // contains filtered or unexported fields }
funcNewMultipleVisitercontrol
func NewMultipleVisitercontrol(multipleRule ...<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#Rule">Rule</a>) *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#MultipleVisitercontrol">MultipleVisitercontrol</a>
初始化一個多重規則的頻率控制策略 例: multipleVc := NewMultipleVisitercontrol(Rule{time.Minute * 5, 20, 100}, Rule{time.Minute * 30, 50, 1000}, Rule{time.Hour * 24, 200, 10000}) 它表示: 在5分鐘內每個使用者最多允許訪問20次,並且我們預計在這5分鐘內大致有100個使用者會訪問我們的網站 在30分鐘內每個使用者最多允許訪問50次,並且我們預計在這30分鐘內大致有1000個使用者會訪問我們的網站 在24小時內每個使用者最多允許訪問200次,並且我們預計在這24小時內大致有10000個使用者會訪問我們的網站 以上任何一條規則的訪問次數超出,都不允許訪問,並且我們在匹配規則時,是按時間段從小到大匹配
func (*MultipleVisitercontrol)AllowVisit
func (this *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#MultipleVisitercontrol">MultipleVisitercontrol</a>) AllowVisit(key interface{}) <a href="https://www.godoc.org/builtin#bool">bool</a>
是否允許訪問,允許訪問則往訪問記錄中加入一條訪問記錄 例: AllowVisit("usernameexample")
func (*MultipleVisitercontrol)AllowVisitIP
func (this *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#MultipleVisitercontrol">MultipleVisitercontrol</a>) AllowVisitIP(ip <a href="https://www.godoc.org/builtin#string">string</a>) <a href="https://www.godoc.org/builtin#bool">bool</a>
是否允許某IP的使用者訪問 例: AllowVisitIP("127.0.0.1")
用於NewMultipleVisitercontrol函式的初始化
typeSingleVisitercontrol
type SingleVisitercontrol struct { // contains filtered or unexported fields }
某單位時間內允許多少次訪問
funcNewSingleVisitercontrol
func NewSingleVisitercontrol(defaultExpiration <a href="https://www.godoc.org/time">time</a>.<a href="https://www.godoc.org/time#Duration">Duration</a>, numberOfAllowedAccesses, estimatedNumberOfOnlineUsers <a href="https://www.godoc.org/builtin#int">int</a>) *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#SingleVisitercontrol">SingleVisitercontrol</a>
初始化一個單規則頻率控制策略 例: vc := NewSingleVisitercontrol(time.Minute*30, 50, 1000) 它表示: 在30分鐘內每個使用者最多允許訪問50次,並且我們預計在這30分鐘內大致有1000個使用者會訪問我們的網站
func (*SingleVisitercontrol)AllowVisit
func (this *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#SingleVisitercontrol">SingleVisitercontrol</a>) AllowVisit(key interface{}) <a href="https://www.godoc.org/builtin#bool">bool</a>
是否允許訪問,允許訪問則往訪問記錄中加入一條訪問記錄 例: AllowVisit("usernameexample")
func (*SingleVisitercontrol)AllowVisitIP
func (this *<a href="https://www.godoc.org/github.com/yudeguang/visitercontrol#SingleVisitercontrol">SingleVisitercontrol</a>) AllowVisitIP(ip <a href="https://www.godoc.org/builtin#string">string</a>) <a href="https://www.godoc.org/builtin#bool">bool</a>
是否允許某IP的使用者訪問 例: AllowVisitIP("127.0.0.1")