Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure中的同步并行操作_Azure_Parallel Processing_Synchronization_Azure Worker Roles - Fatal编程技术网

Azure中的同步并行操作

Azure中的同步并行操作,azure,parallel-processing,synchronization,azure-worker-roles,Azure,Parallel Processing,Synchronization,Azure Worker Roles,我需要一些关于Azure应用程序的非构造性建议。因此,有一个包含项目的队列,假设它是[a,B,a,B,D] 队列中的每个不同项目将被分配一个随机类别,并且同一项目可能在队列中多次出现。类别分配由一些工作人员角色完成,这些工作人员角色执行以下操作:如果项目已分配类别,则将项目添加到类别中,否则将创建新类别并添加项目。所以它是这样的: D: has category? no. Create category 123. Assign [D, 123] B: has category? no. Crea

我需要一些关于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”可能有两个类别。

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

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