过度使用S3会因插座关闭而结束吗?

时间:2016-10-29 13:06:10

标签: amazon-s3 swisscomdev

这个问题是关于Swisscom Application Cloud的,而不是亚马逊。

我的应用程序使用50个线程。总之,他们每秒向S3发出大约25-200个请求。运行10-30秒后,我开始得到这样的例外:

2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT com.amazonaws.AmazonClientException: Unable to execute HTTP request: Socket is closed
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:956)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:661)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:635)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:618)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:586)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:573)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:445)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4041)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1581)
2016-10-29 14:36:58 [APP/PROC/WEB/0] OUT at <my_code_from_here>.putFile(S3Service.java:49)

重新启动应用程序或等待几分钟后,问题就解决了,但是一旦我开始并再次加载S3,我就会在10-30秒后再次获得这些例外。

请求率是否有限制?

2 个答案:

答案 0 :(得分:1)

为什么您自己发现Cloud Foundry提供商是否有任何出站流量限制?此外,您需要排除应用程序存在某种缺陷或缺陷的可能性。

因此,为了发现是否有任何出站请求限制排除了您的应用程序出现某种问题的可能性,我们可以按照以下步骤操作:

  1. 外部服务器中部署任何Web服务应用程序。换句话说,在同一个Cloud Foundry域中没有未部署(即,未部署在Swisscom AppCloud中)。实际上,它不需要是一个合适的Web服务,而是一个&#34; nc -l PORT&#34;已经完成了这项工作 - 只是为了收听TCP端口。
  2. 然后,我们可以在Cloud Foundry(即Swisscom AppCloud)中部署一个应用程序,该应用程序每秒向我们在步骤1中部署的外部Web服务应用程序发出大约300个请求。通过这种方式,我们在Cloud Foundry中模拟一个应用程序(在这种情况下,在Swisscom AppCloud中),其行为与您在场景中提到的行为相同。
  3. 好的,但现在的问题是:如何在技术上/实际上实现这些步骤?是不是很多工作?

    嗯,这是可能的,不,它很多工作。我花了20分钟,想出了一组命令/脚本/码头图像来模拟它。

    所以,第1步你可以自己实现。也许在其他地方部署一个简单的Web服务,就是这样。更简单的步骤2可以简单地通过执行以下CF CLI命令来实现:

    cf push LoadTestFromCloudFoundry --no-hostname --no-route --docker-image gsmachado/loadtest-docker --health-check-type none -c 'loadtest -t 20 -c 10 --rps 10 -k https://IP_ADDRESS_TO_YOUR_EXTERNAL_WEBSERVICE:PORT'
    

    在这个例子中,我们正在推送名为&#34; LoadtestFromCloudFoundry&#34;的应用程序,没有任何主机名,没有任何路由,也没有任何运行状况检查类型。另外,我们指定了一个已在DockerHub上发布的docker镜像(gsmachado / loadtest-docker),但您可以检查源代码here(给它一个明星!它的开源!) 。选项&#39; -c&#39;指定要在此docker容器中运行的命令,实际上,它是在Cloud Foundry中运行的应用程序。此docker容器使用项目loadtest来执行对特定Web目标的请求。您可以查看所有文档并提出自己的&#39; -c&#39;命令。在这个特定的例子中,我们定义了在20秒内,我们希望使用10个并发客户端每秒执行20个请求。 cf push命令需要一段时间才能执行,因为Cloud Foundry应该部署整个docker容器。

    您可以通过查看&#39; cf日志来检查负载测试的结果:

    cf logs LoadTestFromCloudFoundry
    

    此外,还有一个清单示例here,还有README文档here

    如果问题出在您的应用程序中,或者Cloud Foundry提供商(在本例中为Swisscom AppCloud)确实阻止了每秒一定数量的请求(RPS),那么执行针对外部应用程序的此类负载测试可能会给您提供强有力的见解。 )。

    但是,现在,如果您断定Cloud Foundry提供商以某种方式阻止,您必须联系他们的支持。一个体面的提供商不应该向支付其服务的客户施加任何类型的出境RPS限制。

    这是我在这个问题上的2美分。 : - )

答案 1 :(得分:1)

没有出站流量限制或DoS保护。

Swisscom AppCloud具有针对S3(标记为Dynstrg,供应商为EMC Atmos)访问权限的DoS策略,该策略在一定级别后拦截请求。此检测标准当前由每个源IP 200 TPS(每秒事务数,TCP会话)触发,然后此IP被阻止至少120秒。

Swisscom目前正在讨论增加这些触发因素。

相关问题