1

我需要一些帮助来解决涉及带有 Azure 实例的任务并行库的问题。下面是我的工人角色的代码。

每当我上传多个文件时,都会向队列中插入一个请求,并且工作进程会不断处理查询队列并获取消息。检索到消息后,我会执行一些长时间的运行过程。我使用了任务调度器,以便多个请求由多个实例上的多个任务实例提供服务。

现在的问题是,如果一个实例从队列中获取消息并将消息分配给任务并进行处理,现在我看到另一个实例也从队列中检索相同的消息并处理它。因此,我的任务被执行了多次。

请帮我解决这个问题。我的要求是一个 Ccre 的一个 Azure 实例只处理一项任务操作,而不是按任务进行多项操作。

public override void Run()
{
//Step1 : Get the message from Queue

//Step 2:  
Task<string>.Factory.StartNew(() =>
                            {
                              //Message delete from Queue
                  PopulateBlobtoTable(uri, localStoragePath);

                                        }
                                        catch (Exception ex)
                                        {
                                            Trace.WriteLine(ex.Message);
                                            throw;
                                        }
                                        finally
                                        {

                                        }
                                    }
                                    return "Finished!";                                    
                            })

                            catch (AggregateException ae)
                            {
                                foreach (var exception in ae.InnerExceptions)
                                {
                                    Trace.WriteLine(exception.Message);
                                }
                            }
4

2 回答 2

2

我假设您使用的是 Windows Azure 存储队列,在使用存储客户端 API 时,默认不可见超时时间为 90 秒。如果您的消息在该时间段内 未完全处理并明确删除,它将重新出现在队列中。

虽然您可以在将消息添加到队列时将此不可见超时增加到最多 7 天,但您应该使用幂等操作,这意味着消息是否被多次处理并不重要。确保幂等性是您的工作,可能通过记录与每条消息相关联的唯一 ID(在表存储、SQL 数据库等中)并在您第二次看到它并且发现它已被标记为完成时忽略该消息。

您还可以查看Windows Azure 队列和 Windows Azure 服务总线队列 - 比较和对比。您会注意到服务总线队列有一些额外的构造,您可以使用它们来保证最多一次(和至少一次)交付。

于 2012-09-23T22:34:21.337 回答
0

现在的问题是,如果一个实例从队列中获取消息并将消息分配给任务并进行处理,现在我看到另一个实例也从队列中检索相同的消息并处理它。因此,我的任务被执行了多次。

您是否通过“GET”语义获取消息?如果是这种情况,那么您为消息设置的可见性超时是多少。当您“获取”一条消息时,它应该对其他调用者不可见(在您的情况下阅读“实例”),您可以使用可见性超时期限指定特定时间段。在此处查看文档:http: //msdn.microsoft.com/en-us/library/windowsazure/ee758454.aspx

于 2012-09-24T05:05:53.680 回答