3

我正在尝试使用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);
});
4

1 回答 1

0

速率限制不是一项简单的任务。由于往返时间的原因,很难在第二级找到确切的计数。在您的情况下,由于您已将 100 指定为最大计数,Larval 保证它将在一秒钟内处理最多 100 条消息。

除非您的 Redis 始终以微秒为单位提供响应,否则每个方法调用都会增加 1-5 毫秒的执行时间。

最好的办法是,你对 Redis 调用进行基准测试,看看你可以使用 Laravel 节流原语获得多少锁。作为一项基本测试,将油门设置为 10_000 并简单地运行打印语句并检查您可以进行多少次调用(您应该在生产环境中进行),这个数字将为您提供您在一秒钟内可以获得的最大锁数。

如果您可以在一秒钟内获得超过 100 个锁,那么没有什么可以阻止您使用您提到的原语。

对于测试,你可以做一些事情,比如

  • 查找上述 API 的 p99/p95/p90 响应时间
  • 在您的系统中添加一个虚拟 API/方法,API/方法可以简单地花费 p99/p95/p90 秒。为简单起见,它可以只休眠所需的时间间隔。

现在你可以点击你的虚拟方法/API,在这里你可以做各种计数来识别你是否超过了油门限制,你可以使用毫秒来记录并在几秒钟内聚合来识别任何问题,运行一个小时左右.

于 2021-02-08T17:46:47.140 回答