これが私のシナリオです:
複数の子アクターからメッセージを受信するマスターアクターがいます。これらのメッセージには、集約されるデータが含まれています。この集計ロジックでは、共有データ構造を使用して集計を収集する場合、同期の問題に対処する必要がありますか?
else if(arg0 instanceof ReducedMsg){
ReducedMsg reduced = (ReducedMsg)arg0;
counter.decrementAndGet();
synchronized(finalResult){
finalResult.add((KeyValue<K, V>) reduced.getReduced());
if(counter.get() == 0){
if(checkAndReduce(finalResult)){
finalResult.clear();
}
else{
stop();
latch.countDown();
}
}
}
}
ご覧のとおり、finalResultがあり、各メッセージが集約されます。処理ロジックの後で、コレクションもクリアする必要があります。
実際、私が実装しようとしているのは、再帰的(連想的)なリダクションmapreduceです。だから私は私が想定している同期ブロックを維持する必要がありますか?それとも、Akkaが一度に1つのスレッドでonReceiveを実行する可能性がありますか?
このロジックは、小さなデータセットで正確で予測可能な結果を生成します。私の問題は、入力データセットが少し大きい場合、コードがハングすることです。これは、同期ブロックのコンテキストスイッチが原因であることを確認したいので、別の設計に踏み込むことができます。