在节点中并行获取外部资源 - 良好实践?

时间:2014-07-16 18:21:53

标签: node.js

我有一个设置,其中节点服务器充当代理服务器来提供图像。

例如图像" test1.jpg",可以从3个外部来源获取完全相同的图像 - 比方说 -

a. www.abc.com/test1.jpg
b. www.def.com/test1.jpg
c. www.ghi.com/test1.jpg

当nodejs服务器收到" test1.jpg"的请求时它首先从数据库中获取外部URL列表。现在,在这些外部资源中,至少有一个总是落后于CDN,而且预计会出现这种情况。更快地响应,因此是图像的首选来源。

我的问题是从下面两个方面实现这个目标的正确方法是什么(或者如果还有其他方法)

  1. 同时为所有网址发送http请求(使用mikeal的请求客户端模块)。获取他们的承诺对象和任何首先响应的源,将该图像发送回用户(它可以是三个源中的任何一个,不一定是cDN背后的首选源 - 但无关紧要,因为图像完全相同)。我看到的缺点是,对于每个图像,我们都会遇到3个来源。此外,在第一个成功来源的响应发出后,http请求的承诺仍然可以实现。

  2. Fire http从最喜欢的图像开始一次请求一个,等待它失败(即图像上的404),然后继续下一个首选图像。我们的HTTP请求数量较少,但用户的等待时间较长。

  3. 一些伪代码

    方法1

    while(imagePreferences.length > 0) {
       var url = imagePreferences.splice(0,1);
       getImage(url).then(function() {
            sendImage();
       }, function(err) {
            console.log(err);
       });
    }
    

    方法2

    if(imageUrls.length > 0) {
        var url = imageUrls.splice(0,1);
        getImage(url).then(function(imageResp) {
            sendImageResp();
        }, function(err) {
            getNextImage(); //recurse over this
        });
     }
    

    这只是伪代码。我是nodejs的新手。任何帮助/意见将不胜感激。

1 个答案:

答案 0 :(得分:0)

我更喜欢第一种选择,CDN旨在接收大量请求。您的代码完全可以将HTTP请求并行发送到多个源。

如果您想在成功接收第一张图片后停止其他请求,可以使用async.detect:https://github.com/caolan/async#detect