我有一个设置,其中节点服务器充当代理服务器来提供图像。
例如图像" 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,而且预计会出现这种情况。更快地响应,因此是图像的首选来源。
我的问题是从下面两个方面实现这个目标的正确方法是什么(或者如果还有其他方法)
同时为所有网址发送http请求(使用mikeal的请求客户端模块)。获取他们的承诺对象和任何首先响应的源,将该图像发送回用户(它可以是三个源中的任何一个,不一定是cDN背后的首选源 - 但无关紧要,因为图像完全相同)。我看到的缺点是,对于每个图像,我们都会遇到3个来源。此外,在第一个成功来源的响应发出后,http请求的承诺仍然可以实现。
Fire http从最喜欢的图像开始一次请求一个,等待它失败(即图像上的404),然后继续下一个首选图像。我们的HTTP请求数量较少,但用户的等待时间较长。
一些伪代码
方法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的新手。任何帮助/意见将不胜感激。
答案 0 :(得分:0)
我更喜欢第一种选择,CDN旨在接收大量请求。您的代码完全可以将HTTP请求并行发送到多个源。
如果您想在成功接收第一张图片后停止其他请求,可以使用async.detect:https://github.com/caolan/async#detect