什么是限流器
在网络系统中,速率限制器用于控制客户端或服务发送的流量速率。
HTTP请求中,限流器 限制 在指定时间内允许发送的客户端请求数量。如果API请求计数超过速率限制器定义的阈值,所有超出的调用都将被阻止。
以下是一些例子:
• 用户每秒最多只能发布2篇帖子
• 您可以从同一IP地址每天最多创建10个帐户
• 您可以从同一设备每周最多领取5次奖励
限流器可以带来什么好处?
- 防止DDoS攻击
- 节约计算资源成本,比如产品里调用了第三方收费API
- 防止服务器过载
第一步 理解设计需求
以下对话用A代表面试者,B代表面试官
A: 我们需要设计何种限流器?在客户端 client-side 还是在服务端 server-side 限流?
B: Server-side 限流
A: 基于哪种限流?IP,user ID, 还是其他?
B: 这个需要灵活,保证不同的rules
A: 体量大吗?给初创公司还是有大量用户的大公司?
B: 大公司
A: 需要考虑分布式吗
B: 需要
A: 限流器作为一个单独的服务?还是集成在应用代码里面?
B: 这个你可以自己决定
A: 需要通知用户被限流了吗?
B:需要
需求总结
- 低延迟。速率限制器不应该减慢HTTP响应时间
- 使用尽可能少的内存
- 分布式速率限制,速率限制器可以在多个服务器或进程之间共享
- 异常处理。当用户的请求被限制时,向用户显示清晰的异常信息
- 高容错性。如果速率限制器出现任何问题(例如,缓存服务器离线),它不会影响整个系统。
第二步 架构蓝图
客户端 or 服务端?
- 客户端:不可靠。因为客户端请求可以被伪造,没有办法很好的把控具体实现。
- 服务端:如下图。服务端相对客服端更为可靠。
除此之前,我们也可以独立创建一个 限流器中间件,如下图所示。
假如我们的APT允许 每秒2次请求,当用户在一秒内发送3次请求时,前两次会成功接受,第3次则会被限流,并返回HTTP 429 状态码。429: too many requests. 如下图。
云微服务中,通常在API 网关中包含 限流功能。 除此之外,网关还包含了 SSL中止(SSL Termination),认证(authentication), IP白名单,静态资源服务等等。
SSL终止是指将SSL加密的数据流量进行解密(或卸载)的过程。具有安全套接字层(SSL)连接的服务器可以同时处理许多连接或会话。 SSL连接使用证书进行身份验证,在终端用户的计算机和Web服务器之间发送加密数据。 SSL终止有助于加速解密过程,减轻后端服务器的处理负担。
到底应该放在哪里?
没有绝对的答案。以下有几条准则作为参考:
1. 判断公司当前的技术栈,如编程语言,缓存服务等等。确保当前语言能够快速的搭建服务端限流器
2. 找到合适的限流算法。如果自己在server-side实现,可以有更好把控。如果是第三方限流,则没有太多的选择
3. 如果已经是云微服务,且有一个API网关,可以直接在API网关里添加限流器
4. 自己建限流器比较耗费时间,如果没有足够的开发人员,采用商业API 网关比较方便