开发知识

五分钟搞懂分布式流控算法

来源: DeepNoMind  日期:2024-04-29 20:48:10  点击:18  属于:开发知识

流控是任何一个复杂系统都必须考虑的问题,本文介绍并比较了不同的流控算法,从而帮助我们可以基于系统需求和架构选择合适的方案。原文:Distributed Rate-Limiting Algorithms[1]

当我们设计分布式流控系统(distributed rate-limiting system)时,需要用到哪些工具和算法?

Joshua Hoehne @Unsplash

Criteo是全球最大的广告技术公司之一,随着广告市场的不断发展,Criteo在过去几年里一直致力于改进API,帮助客户更好的通过可编程接口访问需要的服务。

随着越来越多的客户使用新的API,很明显,需要实现某种流量控制,以确保所有客户端都能平等访问资源,并保护API免受(恶意或错误的)频繁调用。

流控似乎很简单: 只允许给定的客户端每分钟执行X个调用。在单个服务器实例上实现流控非常容易,可以很容易找到相关的库来实现。但问题是我们的API托管在6个数据中心(欧洲、北美和亚洲),每个数据中心都有多个实例,这意味着我们需要某种分布式流控系统。

流控不仅与调用次数有关,还需要和客户端同步当前被限制的状态(例如,使用专用的报头和状态码)。但是本文将主要关注用于流控的算法和系统。

利用负载均衡

在尝试开发自己的系统之前,更重要的是查看现有的基础设施是否能够提供想要的特性。

那么,部署在数据中心所有实例之前,并且已经在负责检查、路由流量的是什么?负载均衡器。大多数负载均衡器都提供了流控特性或某种可用于实现流控的抽象。例如,HAProxy有现成的可用于设置流控的stick tables[2],可以在实例之间同步状态,并且工作得很好。

不幸的是,负载均衡不支持我们需要的某些特性(动态限制、令牌自省token introspection、……),因此我们需要自己实现这些特定的需求。

初级方案

会话粘连(Sticky sessions)

说到负载均衡,如果给定客户端的负载并不均衡,并且总是与单个实例交互