令牌桶的使用和场景
令牌桶的使用和场景 场景:需要在业务代码中拉取指定第三方平台的报表数据,但是第三方平台有qps限制,平台有实时报表数据需要定期同步到我们的服务器做数据报表和数据分析处理,除了拉取的场景,还有数据操作的场景,我方服务器可能需要频繁操作第三方服务器的某些对象和数据,两部分操作是共享第三方平台的qps限制的。 问:如何设计拉取系统和操作系统的拉取方式,保证所有请求在授权拉取第三方平台时不会超过qps限制,并且能最大程度的拉取最大体量的数据保证数据更新效率和操作时效性 方案1: 没有任何设计和优化的场景 项目最开始是在后端接口api中,直接调用第三方平台进行数据操作和修改,没有任何限制 在这个基础上新增了一个数据同步机制,新启动一个进程同步数据,写入数据库 这个方案没有任何设计,也是最原始的实现方案,比较简单没有任何限制和约束,如果在高峰期做集中数据操作,可能会出现问题,如果超过服务器支持的qps则本地数据同步或者对象操作会出现异常 方案2: queue 在方案1的基础上,将所有与第三方平台交互的操作提前设计publish到队列中,所有与第三方交互的逻辑全部在队列中处理, qps为10则创建10个queue,每个queue中以queue+id为加锁的key名称, 每一个queue中只要操作第三方服务器,都需要获取queue锁,抢到锁才能操作或者拉取数据 这个方案限制了并发数量为要求的并发数量,但是有致命缺点,每一秒的请求有可能请求多次,导致超出qps的请求会操作失败,queue 的方案没有完善的解决并发,并且qps的请求限制 方案3: 令牌桶 在方案1的基础上,将所有与第三方平台的交互操作都加上获取令牌的约束,获取到令牌才可以进行数据交互, 令牌桶做成一个独立的服务,每次请求令牌桶获取令牌时,令牌桶都以秒为单位发放令牌,这1秒只生成8个令牌,获取完了就没有了只能阻塞等待获取令牌桶。 这个方案在该场景下比较合理并且完善,在单位qps的条件下只能允许数量的请求发送,较为完善的实现了场景要求的效果