Ale*_*ec. 6 azure azure-storage azure-storage-blobs
我有一个应用程序可以将数据库备份上传到 azure 上的 blob 容器。
我上传的文件大小约为 8GB,平均速率为 11Mbps
然而,一切正常,当 blob 被传输到容器时,它绝对会杀死该网络上的所有其他内容。
所以我的问题是,有什么方法可以将上传速度限制为 azure?
您的问题没有指定您希望使用哪种编程语言(或原始 REST)来实现上传速度限制。但是我找到了一种使用官方 azure 存储 .NET SDK (Microsoft.WindowsAzure.Storage) 来做到这一点的方法。
SDK 本身不提供明确的速度限制。然而,这些Upload*Async()功能,例如,UploadFromFileAsync()确实支持进度报告,通过采用一个IProgress<StorageProgress>实现,并Report()定期调用它的方法。并且它似乎是同步调用它的。
所以我们可以设置延迟Report()来限制上传速度。更好的是,它可以Report为您提供有关BytesTransferred. 因此,如果您的进度处理程序跟踪持续时间。然后你可以估计当前的上传速度,并用它来精确节流。
下面是这个想法的说明。请注意,这仅仅是该想法的演示。我在不到 3 分钟的时间内把它拼凑好了。速率估计和节流算法非常粗略,没有经过很好的测试。
这是你将如何使用它
await blob.UploadFromFileAsync(
@"some_file.dat",
null, null, null,
new RateThrottleProgress(300 * 1024), // throttle at 300kb/s
CancellationToken.None);
Run Code Online (Sandbox Code Playgroud)
指数退避节流阀实现
class RateThrottleProgress : IProgress<StorageProgress>
{
private readonly DateTime start = DateTime.Now;
private readonly long maxbps;
private long baseDelay, delay;
public RateThrottleProgress(long maxbps)
{
this.maxbps = maxbps;
baseDelay = 10;
delay = baseDelay;
}
public void Report(StorageProgress value)
{
double duration = (DateTime.Now - start).TotalSeconds;
double bps = value.BytesTransferred / duration;
if (bps > maxbps) delay *= 2;
else delay = Math.Max(baseDelay, delay/2);
Console.WriteLine($"current estimated upload speed: {bps / 1024.0} KB/s. delay: {delay} ms");
Thread.Sleep(TimeSpan.FromMilliseconds(delay));
}
}
Run Code Online (Sandbox Code Playgroud)
节流效果:
current estimated upload speed: 287.486007463505 KB/s. delay: 10 ms
current estimated upload speed: 290.086402388889 KB/s. delay: 10 ms
current estimated upload speed: 292.685419108659 KB/s. delay: 10 ms
current estimated upload speed: 295.28201245662 KB/s. delay: 10 ms
current estimated upload speed: 297.876060423937 KB/s. delay: 10 ms
current estimated upload speed: 300.469027029562 KB/s. delay: 20 ms
current estimated upload speed: 302.927815243916 KB/s. delay: 40 ms
current estimated upload speed: 305.112558483135 KB/s. delay: 80 ms
current estimated upload speed: 306.778888691779 KB/s. delay: 160 ms
current estimated upload speed: 307.367196107083 KB/s. delay: 320 ms <-- speed starts to drop from here...
current estimated upload speed: 305.910611140488 KB/s. delay: 640 ms
current estimated upload speed: 300.564767027164 KB/s. delay: 1280 ms
current estimated upload speed: 288.206861583389 KB/s. delay: 640 ms
current estimated upload speed: 283.672713628354 KB/s. delay: 320 ms
current estimated upload speed: 282.668039190231 KB/s. delay: 160 ms
current estimated upload speed: 283.351226090087 KB/s. delay: 80 ms
current estimated upload speed: 284.861107569046 KB/s. delay: 40 ms
current estimated upload speed: 286.781960850501 KB/s. delay: 20 ms
current estimated upload speed: 288.910675693183 KB/s. delay: 10 ms
current estimated upload speed: 291.140146046991 KB/s. delay: 10 ms
current estimated upload speed: 293.358817316007 KB/s. delay: 10 ms
Run Code Online (Sandbox Code Playgroud)
Azure 存储本身不会提供特定的限制设置。但是:鉴于 Blob 上传本质上是一系列基于 REST 的块 BlobPUT操作,您可以通过执行自己的上传实现并选择将块上传到给定 Blob 的频率来进行自己的限制。
| 归档时间: |
|
| 查看次数: |
5029 次 |
| 最近记录: |