【问题标题】:Work distribution in Orleans奥尔良的工作分配
【发布时间】:2015-07-11 14:22:53
【问题描述】:

在 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);
                });

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

似乎如果奥尔良队列中有大量这种额外的工作,那么新节点就会被卡在加入集群中。

【问题讨论】:

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


    【解决方案1】:

    Orleans 使用固定数量的工作线程来最小化上下文切换和线程的开销。调用Thread.Sleep() 会引起麻烦,因为工作人员会忙于睡觉而无法从队列中拉出新工作。

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

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

    【讨论】:

    • 是的,这确实可以改善事情,并且在您考虑时非常有意义。谢谢。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2021-06-27
    • 2016-06-23
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多