我需要一些有关 Azure 应用程序的架构建议。因此,有一个包含项目的队列,假设它是 [A, B, A, B, D]。
队列中的每个不同项目都会分配一个随机类别,并且队列中可能会多次出现相同的项目。类别分配由一些辅助角色完成,这些角色执行以下操作:如果该项目已经分配了类别,则它将将该项目添加到该类别中,否则它将创建一个新类别并添加该项目。所以它是这样的:
D: has category? no. Create category 123. Assign [D, 123]
B: has category? no. Create category 435. Assign [B, 435]
A: has category? no. Create category 154. Assign [A, 154]
B: has category? yes. Assign [B, 435] (category already created)
... etc ...
我的困境是:如何同步工作人员以使同一项目不会获得两个类别?如果两个 worker 挑选 B 项,则“B”可能有两个类别。
最佳答案
确保不会重复的唯一方法是锁定可从两个实例访问的类别的分配。在 Azure 中执行此操作的最流行方法是租用存储中的 Blob。如果您的项目属于 Foo 类型,并且您通过队列传递 Foo 的 Id,则伪代码将如下所示:
int fooId = GetIdFromQueue();
Foo myFoo = LoadFooFromStorage(fooId);
if (myFoo.Category == null)
{
CreateLockBlobIfNoExistForFoo(fooId);
while (not GetLockOnBlobForFoo(fooId))
{
WaitForSomeTime();
}
// Need to reload the underlying item as another thread may have
// been assigning the category while we were waiting on the lock
Foo myFoo = LoadFooFromStorage(fooId);
if (myFoo.Category == null)
{
myFoo.Category = GetRandomCategory();
SaveFoo(myFoo);
}
ReleaseLease(fooId);
}
您需要查找有关 blob 租赁的一些详细信息,但希望这足以帮助您入门。
关于azure - 在 Azure 中同步并行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129653/