Amazon s3 过度使用S3会导致插座关闭吗?

Amazon s3 过度使用S3会导致插座关闭吗?,amazon-s3,swisscomdev,Amazon S3,Swisscomdev,这个问题是关于Swisscom应用程序云的,而不是关于Amazon。 我的应用程序使用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/W

这个问题是关于Swisscom应用程序云的,而不是关于Amazon。

我的应用程序使用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)
2016-10-29 14:36:58[APP/PROC/WEB/0]OUT com.amazonaws.AmazonClientException:无法执行HTTP请求:套接字已关闭
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.http.AmazonHttpClient$RequestExecutor.executehelp(AmazonHttpClient.java:956)
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:661)
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:635)
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:618)
2016-10-29 14:36:58[APP/PROC/WEB/0]在com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300上发布(AmazonHttpClient.java:586)
2016-10-29 14:36:58[APP/PROC/WEB/0]在com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute上发布(AmazonHttpClient.java:573)
2016-10-29 14:36:58[APP/PROC/WEB/0]在com.amazonaws.http.AmazonHttpClient.execute上发布(AmazonHttpClient.java:445)
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4041)
2016-10-29 14:36:58[APP/PROC/WEB/0]发布于com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1581)
2016-10-29 14:36:58[APP/PROC/WEB/0]OUT at.putFile(S3Service.java:49)
重新启动应用程序或等待几分钟后,问题就解决了,但一旦我启动并再次加载S3,我在10-30秒后再次遇到这些异常


请求速率有任何限制吗?

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

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

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

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

    所以,第一步你可以自己完成。也许在其他地方部署一个简单的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'
    
    在本例中,我们正在推送一个名为“LoadtestFromCloudFoundry”的应用程序,它没有任何主机名,没有任何路由,也没有任何健康检查类型。此外,我们正在指定一个docker映像(gsmachado/loadtest docker),该映像已经发布在DockerHub上,但是您可以检查源代码(给它一个星号!它是开源的!)。选项'-c'指定要在此docker容器中运行的命令,实际上,docker容器是在Cloud Foundry中运行的应用程序。此docker容器使用项目执行对特定web目标的请求。您可以查看所有文档,并使用自己的'-c'命令。在这个特定的示例中,我们定义,在20秒内,我们希望使用10个并发客户端每秒执行20个请求。cf push命令需要一段时间才能执行,因为CloudFoundry应该部署整个docker容器

    您可以通过检查“cf日志”来检查负载测试的结果:

    cf logs LoadTestFromCloudFoundry
    
    此外,还有一个清单示例,也包含自述文档

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

    但是,现在,如果您认为云计算代工提供商以某种方式阻止了您,那么您必须联系他们的支持人员。一个像样的提供商不应该对向其服务付费的客户施加任何类型的出站RPS限制


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

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

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


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

    感谢您的快速响应!我很快会带着结果回来的@如果您发现您所面临的问题是由于Fyodor Glebov提到的问题,还是纯粹的应用程序问题,AndrásTornai会告诉我。不久前我遇到了一些类似的事情。啊,别忘了至少投票支持我的答案。你使用我们的S3服务(dynstrg)吗?没有出站流量限制或DoS保护,但有DoS保护t