如果在前一个工作进程的每个任务完成后必须按顺序调用多个工作进程(有一个包含指向blobs的指针的队列,并且每个工作进程都有多个实例。请参阅我之前的问题。)这应该怎么做呢?Azure fabric会自动执行此操作吗?或者,有没有办法在配置文件中设置它?
发布于 2011-07-17 21:25:10
您只需遵循已有的相同过程,但具有更多的层。如果worker 1从队列1读取了一些内容,并且它需要让worker 2知道是时候开始处理同一文件了,worker 1只需将一条消息放入队列2。
编辑:好的,让我看看我是否完全理解你在这里想要什么。这听起来像是有一批文件需要经过几个过程,但它们不能进入下一步,直到它们都完成了上一步。
如果是这样的话,不,Azure中没有任何东西会自动为你做这件事。
正因为如此,如果可能的话,我会重写我的工作人员,这样每个文件就可以被发送,而不用担心其他文件处于什么状态。
如果这是不可能的,那么您需要一些方法来监视哪些文件已经完成,哪些文件仍处于挂起状态。要做到这一点,一种方法(希望你可以对此进行扩展)是创建批处理的代码,在某个表(SQL Azure或Azure表,这并不重要)中为每个文件创建一个进度行,向worker One发送一条消息,并启动一个后台任务来监控该表。
当worker 1完成对文件的处理时,它会更新监控表中的相关行,以表示"Worker 1已完成“。
上面创建的后台线程将等待,直到所有行的"Worker 1完成“都设置为true,然后为Worker 2创建消息,并开始查看"Worker 2完成”标志。对尽可能多的工作步骤重复冲洗。
当所有步骤都完成后,您可能希望后台任务清理此表,并留出一些超时时间,以防消息在某处丢失。
发布于 2011-07-18 06:37:38
虽然@knightpfhor的建议可以做到这一点,但我会尝试以一种更简单的方式来实现这一点,而不是引用工人的名字:-)
具体地说,如果您已经知道需要处理多少个文档,我将首先在一个表中创建N个行,每个行包含一些与当前批处理相关的信息,每个columnKey都设置为批处理id。然后,我将N个消息放入我的队列中,并让工作进程来获取它们。当每个工作线程完成时,它也会删除表中相应的行。监视进程将简单地知道批处理已启动,并每隔一段时间执行一次计数(如果它不是重要的,或者工作进程将在完成删除行后执行计数),并在相关队列中生成新消息,以供下一个工作进程角色处理。
如果你想要更多的控制,你可以在你的表中有一行来存储进程的状态(处理文件,后处理),等等。在这种情况下,我会将状态转换存储在一个队列中,并确保你只做一次。但这是一个全新的问题。
希望它能帮上忙。
https://stackoverflow.com/questions/6725665
复制