0

我们切换到 WebJobs,我们的后台任务在新项目进入 Azure 队列时开始工作。现在我们有一些奇怪的问题,他似乎在访问 Redis RedLock 和 Storage 时遇到了我无法解释的问题。

现在我们遇到的最大问题是RedLock。我们正在使用 RedLock.Net 进行分布式锁定。现在这在我们的生产 Web 应用程序中一切正常,它也适用于我们拥有的后台工作人员,但是一旦我们切换到 WebJobs,他基本上无法获得锁。用一些代码来支持这一点......我们像这样锁定:

        using (var redisLock = await _redLockConnection.RedisLockFactory.CreateAsync(resource, UserLockExpiryTime, UserLockWaitTime, UserLockRetryTime))
        {
            // make sure we got the lock
            if (redisLock.IsAcquired)
            {
                // execute code...
            }
            else
            {
                throw new CouldNotAcquireRedLockException();
            }
        }

这里的问题是,IsAcquired 在 Webjob 中总是错误的,我不知道为什么!?

可能与此问题有关的第二件事是删除 azure 存储中的 blob 文件,该文件仅在 WebJob 中出现 404 失败。

var file = _blobContainer.GetBlockBlobReference("file.txt");
file?.Delete();

这将失败并在 WebJob 中出现 404 Not found 异常。

有什么我错过了设置 webjob 的吗?这可能是写操作的访问问题吗?很高兴有任何帮助!

4

1 回答 1

0

Webjob 中的 IsAcquired 始终为 false

我在 Azure WebJob 中使用RedLock.net对以下代码进行了测试,如果锁定可用,我可以获得资源锁定。

public static void ProcessQueueMessage([QueueTrigger("mymes")] string message, TextWriter log)
{
    var azureEndPoint = new RedisLockEndPoint
    {
        EndPoint = new DnsEndPoint("{YOUR_CACHE}.redis.cache.windows.net", 6380),
        Password = "YOUR_ACCESS_KEY",
        Ssl = true
    };

    var eps = new[] { azureEndPoint };


    var rlf = new RedisLockFactory(eps);

    var resource = "https://{storageaccount}.blob.core.windows.net/{containername}/test.txt";
    var expiry = TimeSpan.FromSeconds(50);
    var wait = TimeSpan.FromSeconds(10);
    var retry = TimeSpan.FromSeconds(1);

    using (var redisLock = rlf.Create(resource, expiry, wait, retry))
    {
        Console.WriteLine("Lock acquired: " + redisLock.IsAcquired);
    }

    log.WriteLine(message);
}

测试结果: 在此处输入图像描述

删除 azure 存储中失败并显示 404 的 blob 文件

正如我在评论中提到的,请通过 Azure 门户或 Azure 存储资源管理器检查 Blob 是否存在,或者在删除之前调用Exists 方法检查 Blob 是否存在。

于 2017-10-17T09:49:47.013 回答