我正在寻找一种在多个辅助角色实例上拥有“Singleton”模块的方法。 我希望在Azure中有一个包含队列和多个辅助角色的并行执行模型。
想法是希望有一个“主”实例,也就是说检查新数据,并通过将其添加到队列来处理它,处理来自特殊队列的所有消息,而不是由没有其他人,并已将blob存储装载为具有读/写访问权限的虚拟驱动器。
我将始终拥有只有一个“主实例”。当主实例由于某种原因而关闭时,已经实例化的实例应该很快被“选举”为主实例(几秒钟)。这应该在Azure环境用新的实例替换破坏的实例之前发生(大约15分钟)。
所以这将是某种自组织,动态的环境。 我想根据存储或表数据进行一些锁定。如果我们可以与微处理器术语交谈,就有机会设置锁定超时和某种“看门狗”计时器。
答案 0 :(得分:5)
您希望实现的目标有一般方法。
首先,您的主实例。您可以根据实例ID进行检查。这很容易。您需要RoleEnvironment.CurrentRoleInstance来获取“当前实例”,现在将Id property与您从Id排序的RoleEnvironment.CurrentRoleInstance.Role.Instances第一个成员的内容进行比较。类似的东西:
var instance = RoleEnvironment.CurrentRoleInstance;
if(instance.Id.Equals(instance.Role.Instances.OrderBy(ins => ins.Id).First().Id))
{
// you are in the single master
}
现在你需要在“治疗”/回收时选出主人。 您需要获取RoleEnvironment的Changed事件。检查它是否为TopologyChange(只是检查它是否是拓扑更改,您不需要拓扑中的确切更改)。如果是拓扑更改 - 根据上述算法选择下一个主站。查看this great blog post有关如何准确执行事件挂钩和更改检测的信息。
忘记添加。
如果你喜欢锁 - blob lease是获取/检查锁的最佳方式。但是,只使用RoleEnvironment事件和基于实例ID的简单主选举,我认为您不需要那种复杂的锁定机制。此外 - 所有内容都存在于队列中,直到成功处理。因此,如果主人在处理某事之前死亡,那么“下一个主人”将处理它。