【问题标题】:Upload blob and acquire lease in one transaction在一个事务中上传 blob 并获取租约
【发布时间】:2015-03-20 15:19:13
【问题描述】:

是否可以上传到 blob 存储并在同一事务中获取该 blob 的租约。这是为了避免潜在的竞争条件。

以下代码执行上述操作,但作为两个不同的事务:

blob.UploadText(String.Empty);
blob.AcquireLease(TimeSpan.FromSeconds(60), leaseId);

如果另一个线程/进程/实例必须在上述两个事务之间获取该 blob 的租约,则将抛出 StorageException(HTTP 代码 412)。

可以通过捕获此类异常来缓解这种情况,如下所示,但由于无法在一个事务中执行上传和租用获取,我们无法保证在上传后该线程将租用 blob。

blob.UploadText(String.Empty);

try
{
    blob.AcquireLease(TimeSpan.FromSeconds(60), leaseId);
}
catch (StorageException ex)
{
    if (ex.RequestInformation.HttpStatusCode != 412)
    {
        throw;
    }
}

【问题讨论】:

  • 您能否更详细地描述您的场景,尤其是avoid a potential race condition one?
  • @GauravMantri:我已经更新了我的问题。如果这还不够,请告诉我。

标签: azure azure-blob-storage


【解决方案1】:

AFAIK,今天不可能在一次交易中上传和获取租约。

看看你上面的代码,你不能把blob.UploadText放在同一个try/catch块中吗?如果第一个线程获得了租约,那么第二个线程的上传操作将失败。此外,由于这些操作是按顺序而不是并行发生的,上传 blob 的线程很可能会获得租约。不过,您需要尝试一下。

【讨论】:

  • 也许我不是很清楚。其他线程或进程不上传 blob。他们只要求将其出租(如果存在)。谢谢你的回答。
  • 因此,如果我理解正确,一个进程将上传 blob,然后有单独的进程在等待,任何人都可以获得租约。您想要的是只有上传 blob 的进程才能获得租约。我对么?是否可以使用队列?
  • 是的,你是正确的。我当然不想使用队列,但我知道可能没有其他选择。
  • 我同意你的看法。有了队列,事情会变得容易一些。您有一个将消息写入队列的过程。所有其他进程将尝试Get此消息,但只有一个会成功。该进程成为领导者,然后上传 blob 并获取租约。
  • 还有一个疯狂的想法:)。您是否可以为每个进程分配一个唯一的 ID?然后,您可以在 blob 中写入此进程 ID,而不是写入空字符串。每个进程将读取 blob 内容并与自己的 id 进行比较。如果 id 匹配,则该过程将继续获取租约。
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2023-03-14
  • 2021-06-19
  • 2022-11-05
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多