1

我需要一些关于 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 ...

我的困境是:我如何同步工作人员,以便同一个项目没有两个类别?如果两个工人选择 B 项,则“B”可能有两个类别。

4

2 回答 2

2

确保您不会重复的唯一方法是锁定可以从两个实例访问的类别的分配。在 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 租约的一些细节,但希望这足以让您入门。

于 2013-01-03T20:09:24.880 回答
1

将您的项目/类别列表维护在您的工作角色可以访问的天蓝色表中,但这仍然可能会在没有某种限制的情况下以重复的形式结束。例如,对于节流,将您的 GetMessage() 设置为具有合理等待时间(1-3 秒)的计时器循环 - 在每次调用 GetMessage() 之前,调用 PeekMessages(5) 以查看但不使接下来的 5 条消息出队。在调用 GetMessage() 之前,循环遍历它们并为任何未分配的项目分配类别并将它们存储在 Azure 表中。

于 2013-01-03T03:33:48.493 回答