如何使用Ruby每秒执行一定数量的操作?

如何使用Ruby每秒执行一定数量的操作?,ruby,Ruby,我想用Ruby测试一个速率限制应用程序,根据每秒的请求数定义不同的行为 例如,如果每秒看到300个或更多请求,我希望它用一个块进行响应 但我如何通过在Ruby中每秒生成300个请求来测试这一点呢?例如,我知道基于CPU有一些硬限制,但如果我将数字保持在该限制之下,我如何发送既超过阈值又保持在该限制之下的内容 仅仅循环N次并不能保证吞吐量。快速而肮脏的方法是启动300个线程,每个线程每秒执行一个请求。更优雅的方法是使用类似的方法以所需的速率创建请求。使用正确的非阻塞HTTP库,它可以轻松地生成该级

我想用Ruby测试一个速率限制应用程序,根据每秒的请求数定义不同的行为

例如,如果每秒看到300个或更多请求,我希望它用一个块进行响应

但我如何通过在Ruby中每秒生成300个请求来测试这一点呢?例如,我知道基于CPU有一些硬限制,但如果我将数字保持在该限制之下,我如何发送既超过阈值又保持在该限制之下的内容


仅仅循环N次并不能保证吞吐量。

快速而肮脏的方法是启动300个线程,每个线程每秒执行一个请求。更优雅的方法是使用类似的方法以所需的速率创建请求。使用正确的非阻塞HTTP库,它可以轻松地生成该级别的活动

您还可以尝试以下工具:

  • Apache基准测试工具,在许多系统中都很常见。它很擅长滥用你的系统
  • 用于负载测试

最简单的自制解决方案如何:

OPS_PER_SECOND = 300
count = 0
duration = 10
start = Time.now

while true
  elapsed = Time.now - start
  break if elapsed >= duration
  delay = (count - (elapsed / OPS_PER_SECOND)) / OPS_PER_SECOND
  sleep(delay) if delay > 0
  do_request
  count += 1
end

这并不是你问题的真正答案,但利率限制宝石,或节流队列,将是一个灵感。基本上,它们会计算某个时间段内的请求数,当您超过设置的限制时,它们的行为会有所不同。我们希望看到您在解决此问题方面的努力/代码。如果没有这一点,您似乎要求我们在不知道您的专业水平或执行此操作所需的代码的情况下编写教程,这两者都是离题的。请阅读“”和“”。明白——除了一个只计算事件数的循环之外,我找不到开始的位置。我认为下面这些答案为我提供了一个进一步思考这个问题的框架。使用为这个问题设计的现有工具比试图重新发明那个特定的轮子要好。@theTinMan这就是为什么我建议将
ab
作为一个安全的默认值。您编写自己的工具的唯一原因要么是作为一个学术练习,要么是因为您正在做一些需要按程序生成每个请求的事情。是的,这有助于开始研究它——我不想编写自己的工具,我最初的努力只是使用一个
循环
,它没有处理每秒的速率。考虑到它太远了,我没有代码可以展示。是ruby工具吗?@Angela
ab
是Apache
httpd
服务器包附带的。对于任何发行版,通常都很容易找到。它不是最灵活的,但它是一个很好的起点。它可能无法每秒生成300个请求,每个请求需要3.33毫秒才能完成。考虑到HTTP的速度有多慢,情况可能就是这样。请注意,这里的延迟代码休眠的时间是固定的,而不是上次迭代剩下的时间。@tadman通过网络,当然。如果服务器是本地的,这取决于它的速度。如果无法获得所需的吞吐量,请运行与服务器线程/进程数量相同的实例。根据需要调整
OPS_PER_SECOND
。即使通过某种魔法,您可以在本地3毫秒内执行HTTP请求,您的限制代码也不会考虑执行请求所需的时间。这样做的目的是将每秒的操作数限制在300次,而不是太多,如果操作花费的时间不多,可能会低得多。是的,这是我最初尝试的——某种循环和睡眠,以防超过阈值。我没有超高的负载要测试,它们是人为的阈值,所以如果需要可以设置得很低。@tadman你说得对。然而,如上所述,这是一个“最小”的解决方案,大约在1分钟内完成。它甚至不想成为工业强国。但有时,你只需要在几分钟内编写出一个快速而肮脏的解决方案,而做得更多只是过度工程。关于3ms以下HTTP请求时间的“魔力”,有很多HTTP服务器可以轻松地运行得更快。如果我们谈论的是典型的Rails应用程序,当然,这需要一些“魔法”。