你说的两件事是:
1)"I would like to rate limit so that only 10,000 requests get processed/day"
2)"while still load balancing those 10,000 requests."
首先,您似乎正在使用分而治之的方法,其中来自最终用户的每个请求都映射到 n 台机器中的一台。因此,为了确保在给定的时间跨度内只处理 10,000 个请求,有两种选择:
1) 实现一个组合器,它将所有 n 台机器的结果路由到
另一个端点,然后外部 API 可以访问该端点。该端点能够记录正在处理的作业数量,如果超过您的阈值,则拒绝该作业。
2) 另一种方法是将您当天处理的作业数量作为变量存储在数据库中。然后,通常的做法是根据作业的初始请求(甚至在您将其传递给您的一台机器之前)检查数据库中的值是否已达到您的阈值。如果已达到阈值,则在开始时拒绝该作业。这与适当的消息相结合,具有为最终用户提供更好体验的优势。
为了确保所有这 10,000 个请求仍然处于负载平衡状态,以便没有一个 CPU 处理的作业比任何其他 cpu 多,您应该使用简单的循环方法将作业分配到 m 个 CPU 上。与 bin/categorization 方法相反,使用循环法,您将确保作业请求尽可能均匀地分布在您的 n 个 CPU 上。循环法的一个缺点是,根据您正在处理的作业类型,当您开始扩大规模时,您可能会复制大量数据。如果这对您来说是一个问题,您应该考虑实现一种形式的局部敏感哈希 (LSH) 函数。虽然一个好的散列函数会尽可能均匀地分布数据,但 LSH 会让你发现一个 CPU 处理的作业比其他 CPU 多。s 如果您选择散列的属性中的偏差很可能发生。与往常一样,两者都有相关的权衡,因此您将最了解您的用例。