2

アプリケーションを開発していますが、時々エラーが発生します。複数のワーカー ロールを BLOB のリースと同期する必要があります。

以下は、ワーカーロールの初期化コードです

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageAccount"));
string blobContainerName = RoleEnvironment.GetConfigurationSettingValue("BlobContainer");
CloudBlobContainer blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(blobContainerName);
blobContainer.CreateIfNotExists();
string blobName = RoleEnvironment.GetConfigurationSettingValue("BlobToBeLeased");
_blob = blobContainer.GetBlockBlobReference(blobName);

if (!_blob.Exists())
{
    using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("This is dummy data")))
    {
        try
        {
            _blob.UploadFromStream(ms);
        }
        catch (StorageException storageException)
        {
            if (storageException.RequestInformation.HttpStatusCode != 412)
                throw;
        }
    }
}

そして、ここに私の AcquireLease メソッドがあります:

private void AcquireLease()
{
    try
    {
        var leaseId = _blob.AcquireLease(null, null);
        Trace.WriteLine("==========> Lease acquired! <========== ID => " + leaseId);
        _accessCondition = new AccessCondition {LeaseId = leaseId};
    }
    catch (Exception)
    {
        Trace.WriteLine("==========> Lease rejected! <==========");
    }
}

問題のスクリーンショット: ここに画像の説明を入力

問題は、AcquireLease メソッドを呼び出すと、時々 2 つのリースが発生することです...誰もがこれを解決する方法についてアイデアを持っています...

CloudBlockBlob 操作はアトミックですか?

4

1 に答える 1

2

Microsoft の担当者と話をしたところ、エミュレーターにはストレージ サービス自体との相違点がいくつかあるようです。

Azure で同じコードを実行すると問題なく動作します。

この回答は、エミュレータ v1.8.0.0 で有効です。

于 2013-02-21T08:24:31.370 に答える