如何仅在多实例Azure Cloud Service Classic中的一个实例中进行初始化?
我有1个网络角色。我在启动时运行初始化代码。现在我想拥有N个实例,但是我只希望其中一个运行初始化代码,而其他所有其他实体都要等待。如何仅在多实例Azure Cloud Service Classic中的一个实例中进行初始化?
在我看来像主节点 - 从属节点。
我该如何做到这一点?有没有已知的模式?
正如我以为这个问题很早以前由Alexandre Brisebois解决。
通过结合两个他的课Blob lease manager和Job Reservation Service的他两个博客文章解释了一切:
我知道链接的答案是不优选的SO,但粘贴所需的所有编码并在此处解释也不是一个好主意。
一个简单的方法让所有的实例等待,而一个正在做一些工作是让主实例放置一个lease on a blob in Azure storage。 主实例的WorkerRole.cs在启动时会在某个Azure容器中创建一个blob文件,并在其上具有租约。初始化完成后释放租约。 从机实例尝试在启动过程中读取同一个文件,并等待租约释放。如果它被释放,blob文件应该包含某种初始化完成的指示
您是否知道想要成为主控的云角色的哪个实例?它是第一个启动的,还是第一个按字母顺序排列的? 如果它是第一个启动,问题更简单 - 因为每个实例都应该尝试创建/租用该文件,除了一个之外的所有实例都会失败。
如果它是第一个字母,然后检查RoleEnvironment.Instance.Id(从内存中去),并把它旋转起来动初始化代码,如果它是“RoleName_IN_1”只有
由于实例可以随意重启,做确保它们不会尝试重新初始化 - 您需要考虑如何最好地处理它 - 可能需要在blob文件中添加某种时间戳。
问题出现在“实例应该尝试创建/租用文件,除了一个都会失败”。 - 这是不正确的,因为实例N可能在整个初始化完成后产生并且它不知道它 - 如果初始化已经完成或者它是第一个应该这样做的实例 - 初始化文件在那里并且它没有被锁定也是因为第一个来的人已经完成了工作并发布了这个文件。这是可能的,因为实例仅在第一个请求之后生成。 我需要一些标识服务本身重新启动的东西。 –
如果存在公用服务存储或“可靠字典”或RoleEntryPoints之间的任何常见操作,则在环境以外的每次服务重新启动时删除/重新实例化的操作都将执行该任务。 –