簡體   English   中英

同時在同一天藍色斑點上獲取租約

[英]Acquire lease on the same azure blob at the same time

在我的團隊的應用程序中注意到以下行為:

多個線程嘗試使用以下行在同一blob上獲取租約:

await blob.AcquireLeaseAsync(TimeSpan.FromSeconds(lockTime), null, null, new BlobRequestOptions() { RetryPolicy = RetryPolicy }, null);

多個線程成功獲得租約,每個線程大約在同一時間獲得了不同的租約。 這是因為AcquireLeaseAsync 不是線程安全的嗎? 我以為租約是一種鎖,因此一次只能授予一個線程嗎?

我們試圖添加一個租約ID為null的訪問條件,這似乎很有幫助。

await blob.AcquireLeaseAsync(TimeSpan.FromSeconds(lockTime), null, new AccessCondition { LeaseId = null}, new BlobRequestOptions() { RetryPolicy = RetryPolicy }, null);

但是不確定它是否萬無一失,即嘗試獲取Blob上的租約時,是否有多個線程可以通過此訪問條件?

以下是我用來產生此問題的代碼:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started");
        var storageConnStr = "";
        var client = CloudStorageAccount.Parse(storageConnStr).CreateCloudBlobClient();
        var container = client.GetContainerReference("test");
        var blob = container.GetBlobReference("Program.cs");
        List<Task> list = new List<Task>();

        for (int i = 0; i < 100; i++)
        {
            list.Add(Task.Run(() => AcquireLease(blob)));
        }
        Task.WhenAll(list).Wait();

    }
    static void AcquireLease(CloudBlob blob)
    {
        try
        {
            var id = blob.AcquireLeaseAsync(TimeSpan.FromSeconds(30), null, null, null, null).Result;
            Console.WriteLine($"Successfully acquired lease on thread {Thread.CurrentThread.ManagedThreadId}, lease id {id}, time is {DateTime.UtcNow}");
        }
        catch (Exception)
        {
            Console.WriteLine($"Got exception at {Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

樣本輸出:

在線程86上成功獲取租約,租約ID為dfbd393e-46e2-49dc-98f4-853356fbc255,時間為11/10/2018 2:16:57 AM

在線程22上成功獲取租約,租約ID為f81b3dbf-68f6-401d-b82e-a1c19fb3527c,時間為11/10/2018 2:16:57 AM

在線程54上成功獲取租約,租約ID 6c05c2ee-c5a5-4d4e-83a9-b65688fca6df,時間為11/10/2018 2:16:57 AM

var id = blob.AcquireLeaseAsync更改為var id = await blob.AcquireLeaseAsync

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM