【问题标题】:Rails threads limit in production生产中的 Rails 线程限制
【发布时间】:2019-01-06 16:45:45
【问题描述】:

我正在开发超级喜欢/出租车预订应用程序。为此,我正在使用 Action Cable。创建新的订单服务器后,获取最近的 10 个司机的列表并依次发送每个司机的订单详细信息(暂停 40 秒)。

Thread.new do
  nearest_drivers.each do |id|
    order_data_for_driver = { ... }
    ActionCable.server.broadcast("driver_#{id}", order_data_for_driver)

    sleep 40

    Thread.exit if order.reload.canceled_by_user || order.trip
  end

  cancel_data = {canceled_by_timeout: true }
  ActionCable.server.broadcast("order_#{order.id}", cancel_data )
end

生产模式下的rails可以同时运行的线程数有限制吗?例如,如果 100 个用户将创建新订单。有什么更优雅的解决方案可以使用?

【问题讨论】:

  • “还有什么更优雅的解决方案可以使用?”——支持原生并发的语言,比如erlang甚至golang
  • 你考虑过sidekiq gem吗?您只需通过简单的配置即可更改进程和线程的数量。但是,您的代码需要与 aync 兼容。 github.com/mperham/sidekiq
  • 尝试使用github.com/tidwall/tile38 获取最近的一个。 @ViT-Vetal-你能分享你的 github repo 吗?我很想知道它是如何工作的。

标签: ruby-on-rails ruby ruby-on-rails-5 ruby-thread


【解决方案1】:

通常这类任务被称为背压。 UNIX 系统上的最大线程数可能从大约 10K 到允许的最大 500K 不等。

处理背压最常见的方法是在两者之间插入一个快速队列(如 RabbitMQ 或其他东西),并随着请求负载的增加增加队列消费者的数量。

100/s 不算什么,但如果您计划处理数千个并发连接,我强烈建议您重新考虑两次选择的语言。 Rails 不是为此类任务创建的软件。 Ruby 也不是。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多