【问题标题】:Too Many Requests ActiveRecordActiveRecord 请求过多
【发布时间】:2023-03-12 11:58:02
【问题描述】:

我在一行中插入大约 4000-5000 条记录,平均而言,插入请求在每条记录的 1 毫秒内连续发送,直到添加所有记录。整个导入包含在一个事务中。作业失败并出现以下错误:

ActionView::Template::Error (Failed.  Response code = 429.  Response message = Too Many Requests.):

我已将错误追溯到我的 model.create 语句。我知道没有办法使用 ActiveRecord 一次插入多条记录,那么是否可以在短时间内增加我可以发出的请求数量?或者,我必须使用 gem 一次插入多条记录吗?即activerecord-import

我很确定我是否捕获了 ActionView::Template::Error 并在重试之前退避了几秒钟,但有没有其他方法可以做到这一点?

【问题讨论】:

  • 您能否提供一些有关您实际尝试解决的任务的详细信息?为什么需要在一个请求中插入 4000 条记录?
  • 这个导入只是偶尔运行一次,它基本上从外部API中获取大量记录并保存到我们的数据库中。来自外部 API 的数据以页面的形式出现,但目前我们正在获取所有页面并将其全部存储起来,因此它是原子的。
  • 如果您经常这样做,您可能需要使用类似的批量插入工具。
  • 对,但是除了批量插入工具之外,我还能做什么?

标签: mysql ruby-on-rails ruby ruby-on-rails-4 activerecord


【解决方案1】:

您是否考虑过使用后台作业来完成此任务?根据您使用的数据库,您可以同时插入新数据。

【讨论】:

  • 不确定我是否理解,但为什么后台作业会帮助解决太多请求错误?您的意思是在后台作业中限制请求吗?
  • 您似乎发现了错误。 :] 如果你愿意,可以使用后台作业来节流。
  • 我肯定会研究后台作业,我正在考虑使用delayed_job,您有什么建议吗?
  • 其实,再想想,我认为设置一个 rake 任务,然后使用 cron 安排它会更容易。
【解决方案2】:

这通常发生在一个方法本身以递归方式调用另一个方法时。

因此,如果我在一个操作中有一个 redirect_to,它再次将 redirect_to 发送到同一操作..那么这反过来会导致 请求过多错误..

同样适用于渲染partials,它本身有部分渲染父视图,其中一个父视图正在渲染子部分,它也渲染了部分parent...所以这变成了一个递归循环。

希望对你有帮助:)

【讨论】:

  • 导入期间没有渲染任何内容,但事实证明它与我们自己的服务器完全无关。不过感谢您的回复!
【解决方案3】:

事实证明,这个错误与我们自己的服务器无关。我们导入的其中一件来自 Shopify。在监控 HTTP 流量后,我意识到当您收到订单并尝试获取与该订单相关的交易时,这是一个额外的请求。因此,我们试图发出过多的请求并达到其 API 限制。

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 2014-09-11
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多