使用Redis和Golang实现滑动日志速率限制器 - gitconnected


场景:在与多个支付提供商进行通信的应用程序上工作场景中,每个提供商对我们都有自己的速率限制。我们不想用任何提供商的费率限制,同时也要充分利用我们允许的限制。我们可以承受将付款请求延迟一小段时间的麻烦,因为批量付款是作为异步作业离线处理的。
在平均结算日,我们会在很短的时间内执行大量付款。我们是否违反了付款处理方的费率限制?我们应该为此做些什么吗?我听说了所谓的速率限制器。
什么是速率限制器?速率限制器限制了发件人可以在特定时间范围内发出的请求数。一旦达到限制,它就会阻止请求。
考虑到以下要求,我们开始设计速率限制器:

  1. 它应将给定时间段内对特定付款提供商的请求数量进行限制
  2. 由于我们的系统在集群(而不是单个服务器)上运行,因此速率限制应适用于发出的请求总数,而不是每个应用程序进程。
  3. 我们的后期限制逻辑应该是原子的,即使多个请求同时到达我们的系统,也不应失败

系统架构
在深入研究限速器设计之前,下面是异步支付处理系统的鸟瞰图:


到达付款用户队列的任何消息都将由付款用户处理。支付消费者从持久性数据库中获取一些数据,以便向相应的支付处理器(以下称为PG)发出请求
业界有几种用于速率限制的标准算法,例如漏斗,固定窗口和滑动日志。在不涉及决策细节的情况下,我选择了滑动日志,因为它适合我们的需求并且易于实现。
...

详细点击标题见原文