我正在寻找一种在多个辅助角色实例上拥有“单例”模块的方法。
我希望在 Azure 中拥有一个带有队列和多个辅助角色的并行执行模型。
这个想法是希望有一个“主”实例,也就是说检查新数据,并通过将其添加到队列来调度它,处理来自特殊队列的所有消息,该队列不被其他人处理,并将 blob 存储安装为虚拟驱动器,具有读/写访问权限。
我永远都会有only one“主实例”。当该主实例由于某种原因关闭时,已经实例化的实例中的另一个实例应该很快被“选举”为主实例(几秒钟)。这应该在 Azure 环境将损坏的实例更换为新实例之前发生(大约 15 分钟)。
所以这将是某种自组织的动态环境。
我正在考虑基于存储或表数据进行一些锁定。如果我们能用微处理器术语来讨论的话,就有机会设置锁定超时和某种“看门狗”计时器。
对于您想要实现的目标,有一个通用的方法。
首先,您的主实例。您可以根据实例 ID 进行检查。这相当容易。你需要RoleEnvironment.CurrentRoleInstance http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.currentroleinstance.aspx要获取“当前实例”,现在比较属性 ID http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.serviceruntime.roleinstance.id.aspx与你从中得到的RoleEnvironment.CurrentRoleInstance.Role.Instances http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.serviceruntime.role.instances.aspx第一个会员由 Id 订购。就像是:
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 http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironment.changed.aspx事件。检查是否是拓扑变化 http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleenvironmenttopologychange.aspx(只需检查是否是拓扑变化,不需要确切的拓扑变化)。如果是拓扑变化 - 根据上述算法选举下一个主机。查看这篇很棒的博文 http://brentdacodemonkey.wordpress.com/2011/09/24/leveraging-the-roleentrypoint-year-of-azure-week-12/关于如何准确执行事件挂钩和更改检测。
忘记补充了。
如果您喜欢锁 - blob 租赁是获取/检查锁的最佳方式。然而,仅使用 RoleEnvironment 事件和基于实例 ID 的简单主选举,我认为您不需要那种复杂的锁定机制。此外 - 一切都存在于队列中,直到它被成功地处理。因此,如果主服务器在处理某些内容之前死亡,“下一个主服务器”将处理它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)