2009-10-21 70 views
2

我想构建一个具有两个工作角色和NO网络角色的Azure应用程序。当辅助角色第一次开始了,我想角色做以下单时间只有一个:如何自动启动Azure队列?

  • 下载并解析一个主文件,然后根据主文件的 内容排队多个“孩子”的任务
  • 排队一个主文件下载“子”任务运行的第二天

每个“孩子”的任务,然后将双方的工作人员来完成,直到任务队列被耗尽。把整个事情想象成“启动泵”

如果我通过调用web角色在队列中手动添加第一个“主”任务,但似乎很难做到这一点真的很容易一个自动启动模式。

在这方面的任何帮助将不胜感激!

感谢.....

回答

2

一种可能性:不是调用Web角色,只需直接加载队列。 (这听起来像是这种应用程序,您希望自动启动以完成一些工作,然后再次关闭......如果将其自动化,那么自动加载队列应该也是微不足道的。)

A(也许)更好的选择:使用某种锁定机制来确保只有一个工作者实例执行初始化工作。一种方法是尝试创建队列(或者一个blob,或者一个表中的实体)。如果它已经存在,那么另一个实例正在处理初始化。如果创建成功,那么就是这个实例的工作。

请注意,如果执行初始化的实例失败,则使用租约比锁更好。考虑使用超时(例如,将时间戳存储在表存储中,或存储在blob的元数据中或队列名称中......)。

+0

感谢您的快速回复!不过,如果我问“如何自动加载队列?”,请原谅我听起来很密集。你能告诉我一些代码吗? 根据你的第二个想法,我可能会错过一些东西,但我很困惑你如何使用像blob这样的实体来创建一个锁,而不会被竞争条件(S)阻塞?像以前一样,一些代码可能会帮助我理解它。 再一次,感谢您的快速回复和帮助.... – 2009-10-21 17:55:36

+0

第一个想法,我只是说,而不是调用web角色启动初始化,运行一些代码在本地进行初始化。(无论该代码会在该Web服务中运行,请将其作为独立的客户端工具运行。) – smarx 2009-10-24 20:41:08

+0

对于第二个想法,请参阅是否可以发现竞争条件,但如何:1)读取实体,该实体应该有一个2)如果完成,则初始化完成,移动到 3)如果leasename为空,则将其设置为随机guid并更新实体(乐观的如果其他人已经编辑过,并发将阻止编辑)。现在做你的初始化。 4)如果设置了leasename,但实体上的时间戳是“旧的”(定义一个很好的超时值,谨慎的时钟漂移),考虑租约可用,如(3)中所述。 有意义吗? – smarx 2009-10-24 20:45:35

2

我们的确遇到了完全相同的问题,这就是为什么我们引入O/C mapper(object to cloud)的原因。基本上,您想要引入两种类型的云服务:

  1. QueueService会在可用时使用消息。
  2. ScheduledService按计划触发操作。

然后,其他人则建议,在云中,你真的喜欢使用租赁!而非锁,以避免您的云应用落得永远冻结由于临时的硬件(或基础设施)问题。