我们使用后台任务切换到WebJobs,当一个新项目到达Azure队列时,这些任务就会开始工作。现在我们遇到了一些奇怪的问题,他似乎在访问Redis、RedLock和存储时遇到了问题,我无法解释。
现在我们遇到的最大的问题是RedLock。我们使用RedLock.Net进行分布式锁定。现在,这在我们的生产web应用程序中工作得很好,它也可以在我们拥有的后台工作者上工作,但当我们切换到WebJobs时,他基本上无法获得锁。要用一些code...we来支持这一点,需要像这样锁定:
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总是假的,我不知道为什么!?
与此问题相关的第二件事可能是删除azure存储中的blob文件,该文件仅在WebJob内出现404失败。
var file = _blobContainer.GetBlockBlobReference("file.txt");
file?.Delete();这将失败,并在WebJob中出现404未找到异常。
有没有什么我在设置webjob时漏掉的东西?这会不会是写操作的访问问题?如果有任何帮助我会很高兴的!
发布于 2017-10-17 17:49:47
在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存储中的blob文件失败,错误为404
正如我在评论中提到的,请通过Azure门户或Azure存储资源管理器检查该Blob是否存在,或者在删除之前调用Exists method检查该blob是否存在。
https://stackoverflow.com/questions/46768895
复制相似问题