我正在使用visual studio通过SDK访问AWS S3。
我试图找出为什么在几个连续调用GetObjectSync对象检索时间显著减少后。
Eg -我正在访问我的数据从eu-west-2从ap-东南-2与传输加速启用。如果我连续打几个电话(3 -5秒内打3- 4个电话)。我记录的GetObjectAsync时间看起来像这样:
1.91s
1.82s
1.93s
.3s
.29s
.32s
在最初的3-4次调用之后发生了什么,然后实现了超快速访问,我是否可以使后一种调用保持现状?
在这种情况下,我从很远的地方获得数据,但是如果我访问位于同一大洲(AU)的本地机器,也会发生同样的事情。
我的GetObjectAsync调用响应时间可能看起来像:
.29s
.32s
.27s
.03s
.04s
.05s
所以它表现出相同的症状,只是由于地理位置的原因,明显减少了潜伏期。如果我再停几分钟电话,它就会"重置"。再从高延时开始
我对延迟非常敏感,所以需要它总是在低端执行。我在这里还有一个问题,用户可能只是间歇性地对我的服务进行一次调用,所以在这种情况下,他们永远无法实现减少延迟的奢侈。
我通过以下代码获得S3文件:
using (var response = await _s3.GetObjectAsync(request))
{
sw.Stop();
Console.WriteLine($"S3 GetObjectAsync: {sw.Elapsed}");
sw.Reset();
sw.Start();
using (var responseStream = response.ResponseStream)
{
sw.Stop();
Console.WriteLine($"S3 ResponseStream: {sw.Elapsed}");
sw.Reset();
sw.Start();
using (var reader = new StreamReader(responseStream))
{
result = reader.ReadToEnd();
sw.Stop();
Console.WriteLine($"S3 ReadToEnd: {sw.Elapsed}");
}
}
}
您正在使用_s3.GetObjectAsync(...)
,这比_s3.GetObject
好得多,因为它是异步,但随后您使用reader.ReadToEnd();
,这是同步和阻塞。
它加速的原因与AWS无关,因为你已经通过在不同位置运行代码证明了这一点,而且Amazon S3传输加速本质上是通过"缓存"工作的。您的数据在边缘位置
我假设你的应用程序是由于。net CLR的某种形式的StreamReader
对象缓存而加速的,但这只能通过查看你在代码中提到的特定计时输出来证明。
无论如何,我会坚持使用同步或异步,最好是后者,这样可以使用StreamReader.ReadToEndAsync
从流中读取。
这应该产生一致的结果:
using (var response = await _s3.GetObjectAsync(request))
{
sw.Stop();
Console.WriteLine($"S3 GetObjectAsync: {sw.Elapsed}");
sw.Reset();
sw.Start();
using (var responseStream = response.ResponseStream)
{
sw.Stop();
Console.WriteLine($"S3 ResponseStream: {sw.Elapsed}");
sw.Reset();
sw.Start();
using (var reader = new StreamReader(responseStream))
{
result = await reader.ReadToEndAsync();
sw.Stop();
Console.WriteLine($"S3 ReadToEnd: {sw.Elapsed}");
}
}
}
此外,如果您正在读取最终写入文件,那么最好了解GetObjectResponse.WriteResponseStreamToFileAsync
,它将为您封装此逻辑。