这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战
业务场景
营销任务,大数据圈出很大的一个人群,有很多个不同的任务节点,节点之间有依赖关系串行,每个节点需要调用第三方的服务,第三方服务有限流策略,比如QPS只有20每秒.
忽略调用一些复杂的业务规则限制, 整个流程如上描述,因为数据量大涉及的第三方服务比较多,限流策略是我们必须要考虑的,常见的限流策略,单机分布式都有很多中的限流策略。 针对我们这个场景,我们的资源瓶颈在第三方服务,每秒20的qps,当我们营销任务定时触发,不同的任务调用相同的第三方服务,势必会将第三方接口打爆。
最开始我们考虑了几种方案
- 分布式限流,比如接口调用封装一个nacos的微服务,通过sential做接口层的限流。
- 单机的限流策略,guava 的RateLimiter令牌桶算法
- 分布的锁,保证单机执行
- 信号量smphare 等等。
最终我们选择的是smphare信号量控制并发,不同的接口根据第三方API提供的QPS计算出对应的信号量限制控制并发执行。