【问题标题】:Concurrent HTTP requests from within a single Sidekiq worker?来自单个 Sidekiq 工作人员的并发 HTTP 请求?
【发布时间】:2018-10-24 14:04:30
【问题描述】:

我正在尝试与 Google 的日历 API 进行交互。到目前为止,我的测试显示插入单个事件的响应时间为 5-10 ,我可能需要一次导出数千个事件[不要问]。这似乎可能会在不合理的时间内从我的队列中发送垃圾邮件。 (此应用中 95% 的当前作业在

我目前在此应用中使用 Faraday 来调用其他更快的 Google API。 Faraday wiki 建议使用 Typhoeus 进行并行 HTTP 请求;但是,截至 2014 年,将 Typhoeus 与 Sidekiq 一起使用被视为 "a bad idea"

Typhoeus 还是个坏主意吗?如果是这样,在 Sidekiq 工作程序中生成 N 个线程,在每个线程中发出 HTTP 请求,然后等待所有线程重新加入是否合理?有没有其他方法可以完成这个极其受 I/O 限制的任务,而不需要更多的工作人员来解决这个问题?我应该要求我的经理增加我们的 Sidekiq Enterprise 支出吗? ;) 或者我应该把这些工作放在一个低优先级队列中,然后告诉我们那些有着荒谬习惯的用户他们只需要等待?

【问题讨论】:

    标签: ruby multithreading sidekiq


    【解决方案1】:

    在 Sidekiq 作业线程中使用线程是合理的。构建自己的线程基础设施是不合理的。您可以将可重用的线程池与concurrent-rubyparallel gem 一起使用,您可以使用线程安全并允许并发请求的http 客户端等。HTTP.rb 是 Tony Arcieri 的一个很好但普通的旧网络/http 也可以:

    https://github.com/httprb/http/wiki/Thread-Safety

    请记住有一些复杂性:作业可能会重试,您如何处理 HTTP 客户端引发的错误?如果您不将这些请求与作业一对一地拆分,您可能需要跟踪每个请求,否则幂等性就会成为问题。

    随时欢迎您增加 Sidekiq Enterprise 线程数。 :-D

    【讨论】:

    • 谢谢,迈克!总是很乐意给你寄更多的钱(尤其是当它不是我的钱时)。 :)
    • 在 Sidekiq wiki 中说 Typhoeus 经常崩溃,所以我知道您不建议将它与 Sidekiq 一起使用?这个说法还有效吗?
    最近更新 更多