欢迎转载,请支持原创,保留原文链接:blog.ilibrary.me

rails怎么利用多线程请求内网服务。

需求

有一个api,是一个聚合API,它会调用内网十几个api,然后把结果聚会后返回给客户。十几个API是串行的。

结果就是,冷启动(用户第一次请求,未上cache)的时候,这个请求耗时可以达到惊人的40s以上。

陈年老代码,没人愿意动,大概也不敢动。

现在还要不停地往里塞API请求,不停地膨胀。

没办法了,还是改多线程请求吧。

注意,这不是高并发的东西,因为只是在服务单个请求的过程中做局部优化,把对外的请求做一个多线程处理。 我们平常说的高并发一般是把外部进来的请求做多线程处理,和本文的情况不太一样。

Rails 多线程

Notes

  1. API: must be called with a block
    thread_group = ThreadGroup.new
    
     # some permission
     thread_group.add Thread.new do
       Rails.application.executor.wrap do
         # check permission
       end
     end
    
     thread_group.list.map &:join
    

    改成

  2. ``
    thread_group = ThreadGroup.new
    
     # some permission
     thread_group.add( Thread.new do
       Rails.application.executor.wrap do
         # check permission
       end
     end)
    
     thread_group.list.map &:join
    
  3. request controller卡死. 客户端请求过来以后,请求卡死了。

links

  1. 详解 Rails Controller 中的 Callback, 多线程避不开callback, 事情做完了总得回调一下。
  2. Threading and Code Execution in Rails, rails官方文档.