1

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

我的应用程序使用 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 秒后再次遇到这些异常。

请求率有限制吗?

4

2 回答 2

1

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

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

  1. 在外部服务器中部署任何 Web 服务应用程序。换句话说,它没有部署在同一个 Cloud Foundry 域中(即,没有部署在 Swisscom AppCloud 中)。实际上,它不需要是一个适当的 Web 服务,但“nc -l PORT”已经可以完成这项工作 - 只是为了侦听 TCP 端口。
  2. 然后,我们可以在 Cloud Foundry(即 Swisscom AppCloud)中部署一个应用程序,该应用程序每秒向我们在步骤 1 中部署的外部 Web 服务应用程序发出大约 300 个请求。这样,我们在 Cloud Foundry 中模拟了一个应用程序(在此情况下,在 Swisscom AppCloud 中)具有与您在场景中提到的相同的行为。

好的,但是,现在的问题是:如何在技术上/实践上实现这些步骤?这不是很多工作吗?

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

因此,您可以自己完成第 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'

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

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

cf logs LoadTestFromCloudFoundry

此外,这里有一个清单示例,这里还有 README 文档。

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

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

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

于 2016-10-30T23:45:45.610 回答
1

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

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

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

于 2016-10-31T09:34:22.643 回答