我在从S3到EC2实例下载较大的文件(3.5GB)时遇到一些间歇性问题。大约95%的时间,效果很好,而且非常快-大约30秒。但是,它有5%的时间停滞不前,并且可能需要2多个小时才能下载。重新启动作业通常可以解决此问题-表示该问题是暂时的。这使我认为我下载文件的方式存在问题。下面是我的实现-我将读取流通过管道写入磁盘,并返回一个承诺,该承诺在完成时将解决(或因错误而拒绝)。
这是使用node.js从S3下载大文件的首选方法吗?我应该知道任何“陷阱”吗?
@Component
public class Security {
private Security() {}
@Value("${auth.username}")
private String userName;
@Value("${auth.password}")
private String password;
/*
<SOAP-ENV:Header>
<wsse:Security soapenv:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:UsernameToken wsu:Id="UsernameToken-1529498874008" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>test</wsse:Username>
<wsse:Password>password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
*/
public SecurityHeaderType createSecurity () {
ObjectFactory of = new ObjectFactory();
UsernameTokenType usernameToken = of.createUsernameTokenType();
usernameToken.getOtherAttributes().put(new QName("Id"), "UsernameToken-" + System.currentTimeMillis());
usernameToken.getOtherAttributes().put(new QName("Username"), userName);
usernameToken.getOtherAttributes().put(new QName("Password"), password);
SecurityHeaderType securityHeader = of.createSecurityHeaderType();
securityHeader.getOtherAttributes().put(new QName("mustUnderstand"), "0");
securityHeader.getAny().add(usernameToken);
return securityHeader;
}
}
答案 0 :(得分:0)
默认情况下,到s3的默认流量会通过Internet传输,因此下载速度可能变得不可预测。为了提高下载速度并出于安全原因,您可以配置aws端点,这是一个虚拟设备,可用于通过实例的内部网络将实例之间的流量路由到s3(比通过互联网快得多)。
在为s3创建端点服务时,您需要选择托管应用程序实例的路由表。创建后,您将在诸如destination (com.amazonaws.us-east-1.s3)
-> target vpce-xxxxxx
之类的路由表中看到一个条目,因此,当流量流向s3时,它将通过端点而不是通过Internet路由。
或者,您也可以尝试并行化下载,例如并行下载字节范围并合并,但是对于3.5GB以上的方法应该可以。