nodejs与ruby /了解请求处理顺序

时间:2017-10-18 13:47:01

标签: node.js ruby image-processing concurrency

我有一个简单的实用程序,我用它来通过url params动态调整图像大小。 有一些红宝石图像库的麻烦(cmyk到rvb是,怎么说......"不可用"),我通过nodejs给它一个镜头,这解决了这个问题。

基本上,如果图像不存在,节点或ruby会对其进行转换。否则,当图像已经被请求/转换时,红宝石或节点处理没有被触摸,图像被静态返回

ruby​​工作得很好,如果一次请求很多变换有点慢,但非常稳定,它总是经历任何数量(我看到图像一个接一个到达页面)

使用节点,它也可以完美地工作,但是当请求大量图像时,对于单个页面加载,第一个图像被转换,然后所有其他请求返回相同的图像(最后一个转换的图像)。如果我刷新页面,第一个图像(已经变换)立即返回,第二个图像返回正确变换,但然后返回的所有其他图像与刚刚转换的图像相同。每次刷新都会一样。不是最优的,基本上这些请求是"合并"在某些时候,都返回相同的图像。因为我不明白

(使用'大量',我的意思是超过1)

红宝石版本:

get "/:commands/*" do |commands,remote_path|
    path          = "./public/#{commands}/#{remote_path}"
    root_domain   = request.host.split(/\./).last(2).join(".")
    url           = "https://storage.googleapis.com/thebucket/store/#{remote_path}"
    img           = Dragonfly.app.fetch_url(url)
    resized_img   = img.thumb(commands).to_response(env)
    return resized_img
end

节点js版本:

app.get('/:transform/:id', function(req,res,next){
  parser.parse(req.params,function(resized_img){
    // the transform are done via lovell/sharp
    // parser.parse parse the params, write the file,
    // return the file path
    // then :
    fs.readFileSync(resized_img, function(error,data){
      res.write(data)
      res.end()
    })
  })
})

感觉我在这里错过了节点中的一个关键点。我期望与节点和ruby有相同的行为,但显然在节点区域中转换的相同模式不能按预期工作。节点不是在等待处理请求,而是按照我不清楚的顺序处理那些

我也明白,我没有用正确的词语来描述这个问题,希望它可以与一些有经验的用户说话,让他们提供澄清,以便更好地了解节点场景背后发生的事情

0 个答案:

没有答案