1

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

これは機能しますが、別のノードがクラスターに参加した場合、その機能は新しいノードに決して移動しないようです。その新しいノードでは、新しくスケジュールされた作業のみが処理されます。

また、Orleans Queue にこの余分な作業が大量にある場合、新しいノードがクラスターに参加できなくなるようです。

4

1 に答える 1