【问题标题】:Rails long running controller action and scaling to 500-1000 requests per secondRails 长时间运行的控制器操作并扩展到每秒 500-1000 个请求
【发布时间】:2021-08-17 05:50:27
【问题描述】:

我目前正在尝试优化和扩展在 AWS ALB 后面基于 Ruby on Rails 构建的 API,该 API 将流量发送到 NGINX,然后将流量发送到 Puma 到我们的 Rails 应用程序。我们的 API 有一个最长 30 秒的超时选项,这是我们最终使请求超时的时间。目前,我们有一个控制器操作,它使 Sidekiq 工作人员排队,然后我们在前 1 秒每 100 毫秒轮询一次 Redis 密钥,然后在剩余的 29 秒内每 500 毫秒轮询一次。我们的许多请求可以在 1 秒内完成,但其中一些请求需要整整 30 秒才能成功或超时,告诉用户稍后重试。

我们目前正在尝试对此 API 进行负载测试并将其扩展到 500-1000 RPS,但我们遇到了较慢的请求会阻塞我们所有连接的问题。当慢请求运行时,Puma 不应该在慢请求的休眠期间接受其他请求吗?

如果这不是 API,我们可以轻松地在后台工作人员排队后立即响应,但在这种情况下,我们需要等待响应并为 API 请求保持连接长达 30 秒。

【问题讨论】:

  • 数据库连接被worker声明并在作业完成时释放回池中。您可以在执行一些长操作(如 http 请求)之前尝试释放连接。

标签: ruby-on-rails nginx concurrency puma


【解决方案1】:

我的第一个想法是你可以有多个redis队列并将特定任务推送到某些队列。

如果您有一个用于快速任务的队列和一个用于较慢任务的队列,那么两者都可以并行运行,而不会让慢速任务阻碍其他所有任务。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2022-06-17
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多