我正在尝试使用 Redis 实现速率限制。我需要调用一个 TPS 为 100 或每秒可调用 100 次的 API。我有一个限制,我不能调用 API 进行测试。如何测试我的 API 在一秒钟内被调用的次数不超过 100 次?
Redis::throttle('key')->allow(100)->every(1)->then(function () {
// API called that has rate limit
}, function () {
// Could not obtain lock...
return $this->release(10);
});
最佳答案
速率限制不是一项微不足道的任务。由于往返时间的原因,很难在第二层找到准确的计数。在您的情况下,由于您已将 100 指定为最大计数,Larval 保证它将在一秒钟内处理最多 100 条消息。
除非您的 Redis 始终以微秒为单位提供响应,否则每个方法调用都会增加 1-5 毫秒的执行时间。
最好的办法可能是,您对 Redis 调用进行基准测试,看看使用 Laravel throttle 原语可以获取多少锁。作为基本测试,将 throttle 设置为 10_000 并简单地运行打印语句并检查您可以进行多少次调用(您应该在生产中进行),这个数字将为您提供每秒可以获得的最大锁数。
如果您可以在一秒钟内获得超过 100 个锁,那么没有什么可以阻止您使用您提到的原语。
为了测试,你可以做一些事情,比如
- 找到所述 API 的 p99/p95/p90 响应时间
- 在您的系统中添加虚拟 API/方法,API/方法只需花费 p99/p95/p90 秒。为简单起见,它可以只休眠所需的时间间隔。
现在您可以使用您的虚拟方法/API,在这里您可以进行各种计数以确定您是否超过节流限制,您可以使用毫秒进行记录并按秒聚合以识别任何问题,运行此一个小时左右。
关于laravel - 查看一秒内处理了多少个Job?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66102802/