gpt4 book ai didi

c# - BlobContainerClient.CreateIfNotExistsAsync 方法的替代方法以避免 409 http 错误

转载 作者:行者123 更新时间:2023-12-02 23:05:28 29 4
gpt4 key购买 nike

先决条件

  • WindowsAzure.Storage V 9.3.3
  • Azure.Storage.Blobs V 12.6.0
  • Datadog APM 监控

上下文:

  1. 这是一个已知问题,如果之前已经创建了容器,则 Blob 客户端 CreateIfNotExists(Async) 在执行期间会返回 409
  2. 由于现有的实现,CreateIfNotExists 检查是根据请求执行的,这意味着很多次
  3. 因此,日志和监控系统中出现大量 409 错误
  4. 此外,将逻辑移至应用根目录也是一项挑战,因此要避免每个请求 CreateIfNotExists 检查

正在考虑的可能修复:

为了缓解这个问题,我将用以下内容替换它:

if (!await blobClient.ExistsAsync().ConfigureAwait(false))
{
await containerClient.CreateAsync().ConfigureAwait(false);
}

问题:有一个令我困扰的时刻:

  • 这种替换会成为高并发工作流程中的一个问题吗?

P.s 我已经研究了“Azure.Storage.Blobs”nuget 中的 CreateIfNotExistsAsync 实现。从我的角度来看,并发并没有什么特别的,但也许我错了。请。分享你的经验

enter image description here

最佳答案

您的代码必须处理这个问题。检查是否存在没有帮助。

问题是服务器端的并发,而不是客户端的并发。 The source showsCretaeIfNotExists已经通过简单地忽略异常来处理现有容器的情况。人们可能会问为什么抛出异常而不是检查状态代码,但如果容器存在,代码不会抛出 409:

try
{
response = await CreateInternal(
publicAccessType,
metadata,
encryptionScopeOptions,
async,
cancellationToken,
operationName)
.ConfigureAwait(false);
}
catch (RequestFailedException storageRequestFailedException)
when (storageRequestFailedException.ErrorCode == BlobErrorCode.ContainerAlreadyExists)
{
response = default;
}
catch (Exception ex)
{
ClientConfiguration.Pipeline.LogException(ex);
scope.Failed(ex);
throw;
}
finally
{
ClientConfiguration.Pipeline.LogMethodExit(nameof(BlobContainerClient));
scope.Dispose();
}
return response;

要发生冲突,两个 CreateInternal调用必须尝试创建相同的不存在的容器。这就是为什么检查存在性在这里没有帮助。即使使用了存在性检查,两个客户端仍会尝试执行 Create同时,两者都会得到 409 .

应用程序必须处理这种情况。最好的选择是对每个请求都进行此调用,从而减少发生冲突的可能性。这可以通过使用例如 Lazy<> 来完成。或异步延迟进行此调用。或者使用排队工作人员,减少同时发生的调用数量。

应用程序仍然需要处理偶尔出现的 409。一种方法是简单地重试 CreateIfNotExists延迟一段时间后,直到调用成功。这比打电话 Exists 更好因为容器的创建可能会失败。

关于c# - BlobContainerClient.CreateIfNotExistsAsync 方法的替代方法以避免 409 http 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73803438/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com