游戏服务器架构系列 - 网关限流

栏目: 后端 · 发布时间: 7年前

内容简介:在前面我们介绍的游戏服务端架构中,客户端通过Socket连接直连网关,所有请求都需要经过网关,然后由网关统一进行转发,为了避免玩家的DDOS攻击,所以需要在网关进行限流。常见的算法主要有计数器限流、令牌桶限流和漏桶限流,这些算法都是单机的算法,正好可以用在网关限流。

为什么要进行网关限流?

在前面我们介绍的游戏服务端架构中,客户端通过Socket连接直连网关,所有请求都需要经过网关,然后由网关统一进行转发,为了避免玩家的DDOS攻击,所以需要在网关进行限流。

常见的算法主要有计数器限流、令牌桶限流和漏桶限流,这些算法都是单机的算法,正好可以用在网关限流。

算法

1、计数器限流

严格意义上来说计数器限流不属于限流算法,使用计数器来进行限流,主要用来限制总并发数,比如数据库连接数;只要全局总请求数或者一定时间段的总请求数设定的阀值则进行限流,是简单粗暴的总数量限流,而不是平均速率限流。

2、令牌桶算法(Token Bucket)

令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

假设限制1秒钟生成2个令牌,则按照500毫秒的固定速率往桶中添加令牌;

桶中最多存放a个令牌,当桶满时,新添加的令牌被丢弃或拒绝;

当有n个请求到达,将从桶中删除n个令牌,接着请求被发送到网络上;

如果桶中的令牌不足n个,则不会删除令牌,该请求将被限流(要么丢弃,要么缓冲区等待)。

游戏服务器架构系列 - 网关限流

令牌桶算法(图片来自网络)

3、漏桶算法(Leaky Bucket)

漏桶算法是一个存放固定水滴的桶,按照固定速率流出水滴,可以用于流量整形和流量控制,漏桶算法的描述如下:

一个固定容量的漏桶,按照常量固定速率流出水滴;

如果桶是空的,则不需流出水滴;

可以以任意速率流入水滴到漏桶;

如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃,要么缓冲区等待),而漏桶容量是不变的。

游戏服务器架构系列 - 网关限流

漏桶算法(图片来自网络)

对比

令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;漏桶是按照固定速率从桶中流出请求,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝

令牌桶限制的是平均流入速率,允许突发请求,只要有令牌就可以处理,支持一次拿5个令牌,6个令牌,并允许一定程度突发流量;漏桶限制的是常量流出速率,即流出速率是一个固定常量值,比如都是2的速率流出,而不能一次是2,下次又是3,从而平滑突发流入速率

基于Golang的算法实现: https://github.com/MaxwellBackend/Games/tree/master/ratelimit


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

探索需求

探索需求

章柏幸、王媛媛、谢攀、杰拉尔德・温伯格、唐纳德・高斯 / 章柏幸、王媛媛、谢攀 / 清华大学出版社 / 2004-7-1 / 39.00元

本书将与您一起寻找"什么是客户真正想要的"这一问题的答案。 本书着眼于系统设计之前的需求过程,它是整个开发过程(如何设计人们想要的产品和系统)中最有挑战性的那部分。通过对一些需求分析中的常见误区和问题的分析和讨论,从和客户沟通开始,深入研究一些可能的需求,澄清用户和开发者期望值,最终给出了能够大幅度提高项目成功几率的一些建议方法。 本书由该领域内公认的两位作者合著,搜集了他们在大大小小......一起来看看 《探索需求》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码