奥尔良的工作分配

时间:2015-07-11 14:22:54

标签: c# cluster-computing distributed-computing orleans

在Microsoft Orleans中,我尝试使用以下代码实现类似可用工作的列表:

        public Task<WorkResponse> PerformWork(WorkRequest request)
    {
        Console.WriteLine("Performing work for id: {0}", request.Param1);
        Thread.Sleep(TimeSpan.FromSeconds(10));                       

        var result = Task.FromResult(new WorkResponse(request.Param1, request.Param2, request.Param3));
        Console.WriteLine("Completed work for id: {0}", request.Param1);

        return result;
    }

但是,如果我使用这样的代码开始执行大量任务,那么这些功能就无法正常运行。

                _work
                .ToList()
                .AsParallel()                    
                .ForAll(x =>
                {        
                    Console.WriteLine("Requesting work for id: {0}", x.Key);
                    var worker = GrainFactory.GetGrain<IWork>(x.Key);
                    var response = worker.PerformWork(x.Value);

                    Console.WriteLine("Response for work id: {0}", x.Key);
                });

但是,如果另一个节点加入群集,则工作似乎永远不会移动到新节点。只在新节点上处理新计划的工作。

似乎如果奥尔良队列中有一堆额外的工作,那么新节点就会加入群集。

1 个答案:

答案 0 :(得分:5)

Orleans使用固定数量的工作线程来最小化上下文切换和线程的开销。调用Thread.Sleep()会导致麻烦,因为工作人员将忙着睡觉以从队列中提取新工作。

当您避开Thread.Sleep(...)并使用await Task.Delay(...)时会发生什么。

奥尔良使用的成员资格算法要求筒仓具有响应性:慢筒仓与死亡筒仓无法区分。