来自单个 Sidekiq worker 的并发 HTTP 请求?
Concurrent HTTP requests from within a single Sidekiq worker?
我正在尝试与 Google 的日历 API 进行交互。到目前为止,我的测试显示插入单个事件的响应时间为 5-10 秒,我可能需要一次导出数千个事件[不要问] 。这似乎很可能会在不合理的时间内让我的队列乱七八糟。 (此应用中 95% 的当前作业在 300 毫秒内完成,因此这将使适当分配资源变得更加困难。)
我目前在此应用程序中使用 Faraday 来调用其他更快的 Google APIs。 Faraday wiki 建议使用 Typhoeus 进行并行 HTTP 请求;然而,截至 2014 年,将 Typhoeus 与 Sidekiq 一起使用被视为 "a bad idea"。
伤寒仍然是个坏主意吗?如果是这样,在 Sidekiq worker 中生成 N 个线程,在每个线程中发出 HTTP 请求,然后等待所有线程重新加入是否合理?有没有其他方法可以完成这个极其 I/O-bound 的任务而不需要投入更多的工作人员来解决这个问题?我应该要求我的经理增加我们的 Sidekiq Enterprise 支出吗? ;) 还是我应该将这些工作放在低优先级队列中,然后告诉我们的用户他们只需要等待即可?
在 Sidekiq 作业线程中使用线程是合理的。构建自己的线程基础结构是不合理的。您可以使用带有 concurrent-ruby
或 parallel
gem 的可重用线程池,您可以使用线程安全并允许并发请求的 http 客户端等。HTTP.rb 是一个很好的Tony Arcieri 但普通老 net/http 也可以:
https://github.com/httprb/http/wiki/Thread-Safety
请记住有一些复杂性:作业可能会重试,您如何处理 HTTP 客户端引发的错误?如果您不将这些请求与作业一对一地拆分,您可能需要跟踪每个请求,否则幂等性就会成为一个问题。
随时欢迎您增加 Sidekiq Enterprise 线程数。 :-D
我正在尝试与 Google 的日历 API 进行交互。到目前为止,我的测试显示插入单个事件的响应时间为 5-10 秒,我可能需要一次导出数千个事件[不要问] 。这似乎很可能会在不合理的时间内让我的队列乱七八糟。 (此应用中 95% 的当前作业在 300 毫秒内完成,因此这将使适当分配资源变得更加困难。)
我目前在此应用程序中使用 Faraday 来调用其他更快的 Google APIs。 Faraday wiki 建议使用 Typhoeus 进行并行 HTTP 请求;然而,截至 2014 年,将 Typhoeus 与 Sidekiq 一起使用被视为 "a bad idea"。
伤寒仍然是个坏主意吗?如果是这样,在 Sidekiq worker 中生成 N 个线程,在每个线程中发出 HTTP 请求,然后等待所有线程重新加入是否合理?有没有其他方法可以完成这个极其 I/O-bound 的任务而不需要投入更多的工作人员来解决这个问题?我应该要求我的经理增加我们的 Sidekiq Enterprise 支出吗? ;) 还是我应该将这些工作放在低优先级队列中,然后告诉我们的用户他们只需要等待即可?
在 Sidekiq 作业线程中使用线程是合理的。构建自己的线程基础结构是不合理的。您可以使用带有 concurrent-ruby
或 parallel
gem 的可重用线程池,您可以使用线程安全并允许并发请求的 http 客户端等。HTTP.rb 是一个很好的Tony Arcieri 但普通老 net/http 也可以:
https://github.com/httprb/http/wiki/Thread-Safety
请记住有一些复杂性:作业可能会重试,您如何处理 HTTP 客户端引发的错误?如果您不将这些请求与作业一对一地拆分,您可能需要跟踪每个请求,否则幂等性就会成为一个问题。
随时欢迎您增加 Sidekiq Enterprise 线程数。 :-D