2017-03-28 21 views
0

データベーステーブルまたはフラットファイルから4000万行(データ行)をフェッチしています。私は行ごとに1人のワーカーを作成することで、Groovy の評価用に各行を処理しています(この場合、私は4000万人のワーカーを作成しています)。 ここでは、AKKAのラウンドロビンプールを使用しています。このアプローチは正しいですか?そうでない場合は、それを行う最善の方法です。Akkaラウンドロビンプール

public class AkkaWay { 

public static void main(String[] args) { 
    System.out.println("************************** start *****************************"); 
    new AkkaWay().run(); 
    System.out.println("************************** END *****************************"); 
} 

private void run() { 
    ActorSystem system = ActorSystem.create("CalcSystem"); 
    ActorRef master = system.actorOf(Master.createMaster(), "master"); 
    master.tell(new Calculate(), ActorRef.noSender()); 
    while(!master.isTerminated()){ 
    try{ 
    //System.out.println("*********************************** Thread *************************************************"); 
    Thread.sleep(100); 
    }catch(Exception e){ 
    e.printStackTrace(); 
    } 
    } 
} 
} 

public class Master extends UntypedActor 
{ 
private final Time time = new Time(); 

public Master() { 
    workerRouter = this.getContext().actorOf(Worker.createWorker().withRouter(new RoundRobinRouter(4)),"workerRouter"); 
} 

@Override 
public void onReceive(Object message) { 
    if (message instanceof Calculate) { 
     time.start(); 
     processMessages(); 
    } else if (message instanceof Result) { 
     list.add(((Result) message).getFactorial()); 
     if (list.size() == messages) 
      end(); 
    } else { 
     unhandled(message); 
    } 
} 

private void processMessages() 
{ 
    //read data from file/database (40 millions rows) 
    for (int i = 0; i < rows; i++) { 

     workerRouter.tell(new Work(), getSelf());// each row send 
    } 
} 

private void end() { 
    time.end(); 
    System.out.println("Done: " + time.elapsedTimeMilliseconds()+"["+time.elapsedTimeMilliseconds()/1000+" secs]"); 
    getContext().system().shutdown(); 
} 

public static Props createMaster() { 
    return Props.create(Master.class, new ArraySeq<Object>(0)); 
} 
} 

public class Worker extends UntypedActor 
{ 

@Override 
public void onReceive(Object message) { 
    if (message instanceof Work) { 
     //evaluate Groovy expression 
     getSender().tell(new Result(bigInt), getSelf()); 
    } else 
     unhandled(message); 
} 

public static Props createWorker() { 
    return Props.create(Worker.class, new ArraySeq<Object>(0)); 
} 
} 
+1

codereviewがこの質問に適しているようですね。 – Quickbeam2k1

答えて

1

私は、これは俳優のメールボックスで待機して、メモリにロードされた40のMIO行を持っているあなたを導く可能性がある中で最悪の場合のように、最善のアプローチではないと思います。

この種の問題は、必要なデータだけが一度に読み込まれるakka-streamを使用する方が適切です。