扩展RESTAPI-体系结构

扩展RESTAPI-体系结构,rest,architecture,redis,restful-architecture,api-design,Rest,Architecture,Redis,Restful Architecture,Api Design,我们的产品是一个RESTAPI,我们需要扩展它并使其冗余。我们的计划是使用nginx作为负载平衡器和代理,将api请求转发到三个不同的服务器,所有服务器都将连接到同一个MongoDB副本集 我们的api具有基于用户api密钥的速率限制。用户将有多个客户端,所有客户端都将使用相同的api密钥对其请求进行签名 关于这一点,我有两个问题: 需要对数据库执行多个cron作业。怎么可能 我们确保只有一台服务器运行cron,但如果 服务器关闭,另一个服务器运行它们? 我们如何在所有服务器上强制执行合并的速率

我们的产品是一个RESTAPI,我们需要扩展它并使其冗余。我们的计划是使用nginx作为负载平衡器和代理,将api请求转发到三个不同的服务器,所有服务器都将连接到同一个MongoDB副本集

我们的api具有基于用户api密钥的速率限制。用户将有多个客户端,所有客户端都将使用相同的api密钥对其请求进行签名

关于这一点,我有两个问题:

需要对数据库执行多个cron作业。怎么可能 我们确保只有一台服务器运行cron,但如果 服务器关闭,另一个服务器运行它们? 我们如何在所有服务器上强制执行合并的速率限制。怎么办 我们允许一个api密钥每天在所有三个api上获得1000个请求 服务器组合? 需要对数据库执行多个cron作业。我们如何确保只有一台服务器运行cron,但如果 服务器关闭,另一个服务器运行它们

考虑使用队列。所有cron作业都可以从队列中提取

我们如何在所有服务器上强制执行合并的速率限制?我们如何允许一个api密钥在所有三台服务器上每天获得1000个请求 合二为一


考虑持久化一个计数器,该计数器在服务器每次收到租户用户使用api密钥发出的请求时都会更新。当服务器收到请求时,请检查计数器<1000,查看他们是否已使用配额。

关于第2点的问题:如果每秒有多个请求,该怎么办?您不能在一秒钟内转到数据库更新计数器10次。为True,但计数器更新可以异步进行。不要等待数据库更新完成,写入队列并使用后台作业处理队列以抵消任何性能影响。我们还可以考虑内存数据库,因为我们还有其他可能需要更快的读写功能。