用于租户隔离的API流量整形/节流策略
首先,我将提供一些关于我们正在做什么和我们面临的问题的背景用于租户隔离的API流量整形/节流策略,api,throttling,rate-limiting,trafficshaping,Api,Throttling,Rate Limiting,Trafficshaping,首先,我将提供一些关于我们正在做什么和我们面临的问题的背景 我们目前正在构建一个SaaS(托管在AmazonAWS上),它由几个微服务组成,这些微服务位于API网关后面(我们正在使用Kong) 网关处理身份验证(通过具有API密钥的消费者),并公开我提到的这些微服务的API,所有这些服务都是无状态的(没有会话、cookie或类似的) 每个服务都使用ECS服务(一台或多台EC2机器上运行的每个服务一个或多个docker容器)进行部署,并使用Amazon应用程序负载平衡器(ALB)进行负载平衡 所
- 我们目前正在构建一个SaaS(托管在AmazonAWS上),它由几个微服务组成,这些微服务位于API网关后面(我们正在使用Kong)李>
- 网关处理身份验证(通过具有API密钥的消费者),并公开我提到的这些微服务的API,所有这些服务都是无状态的(没有会话、cookie或类似的)
- 每个服务都使用ECS服务(一台或多台EC2机器上运行的每个服务一个或多个docker容器)进行部署,并使用Amazon应用程序负载平衡器(ALB)进行负载平衡
- 所有租户(客户机)共享相同的环境,即相同的机器和资源。考虑到我们的商业模式,我们希望(一开始)只有“大”租户
- 在请求期间,对这些服务的大多数请求都会导致大量资源使用(主要是CPU)。服务一个请求所需的时间在2-10秒之间(不像传统的“web式”应用程序那样需要毫秒)。这意味着我们每分钟处理相对较少的请求,其中每个请求都需要一段时间来处理(后台或批处理不是一个选项)
- 速率限制:定义租户可以发出的最大请求数/m。如果有更多的请求到达,请丢弃它们。Kong甚至有一个插件。遗憾的是,我们使用“按请求付费”的定价模式,业务部门不允许我们使用这种策略,因为我们希望尽可能多地服务请求,以便获得付款。如果多余的请求对承租人来说需要更多的时间,那没关系
- 租户隔离:为每个租户创建一个隔离的环境。这一个也被丢弃了,因为它使维护更加困难,并导致资源使用率降低和成本升高
- 自动缩放:启动更多机器以吸收爆发。根据我们的经验,亚马逊ECS在这方面做得不是很快,到这些新机器准备好的时候,可能已经太晚了
- 请求“节流”:在API网关级别使用诸如泄漏桶或令牌桶之类的算法,以确保请求以我们已知的速度命中服务李>
- 提议的策略是可行的吗?您知道这个用例还有其他可行的策略吗
- 是否有开源、商业或SaaS服务可以提供这种流量整形功能?据我所知,Kong或Tyk不支持这种功能,因此。。。还有其他API网关可以吗
- 如果Kong不支持这一点,那么实现我所描述的插件有多难?我们必须考虑到,当我们使用多个Kong实例(用于负载平衡和高可用性)时,它需要一些共享状态(例如使用Redis)
Mikel.在网关端管理请求队列确实是一件棘手的事情,可能它没有在这个网关中实现的主要原因是很难做到正确。您需要处理所有分布式系统案例,此外,这很难保证它的“安全”,因为“慢”客户端很快就会消耗机器资源 这种模式通常被卸载到客户端库中,所以当客户端达到速率限制状态代码时,它使用类似smth的指数退避技术来重试请求。它更易于扩展和实现 不能说是香港,但在本例中,Tyk提供了两个您可以控制的基本数字,配额-客户端在给定时间段内可以发出的最大请求数,以及速率限制-安全保护。您可以为每个“策略”设置速率限制1),例如为一组消费者设置速率限制(例如,如果您的服务有多个层次,具有不同的允许使用率/速率限制),2)为每个密钥设置速率限制3)为API设置全局速率限制(与密钥速率限制一起工作)。例如,您可以设置一些中等的客户端速率限制,并使用全局API设置来限制总速率限制 如果需要完全动态的方案,请根据集群负载重新计算限制