私はワーカープールを持つCalculationSupervisor
アクターを持っています。
計算を行う度に、CalculationSupervisor
はルータを使用してCalculationRequest
をワーカーにブロードキャストします。Akkaブロードキャスト:最初の返信を取得して他の人を破棄します
最も速い計算結果を得て、他の結果を無視する必要があります。次のように
CalculationSupervisor
に見えます:
public class CalculationSupervisor extends AbstractActor {
private Router router = new Router(new RoundRobinRoutingLogic());
public static Props props() {
return Props.create(CalculationSupervisor.class, CalculationSupervisor::new);
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(RegisterWorker.class, registration -> {
final String workerName = registration.name();
final ActorRef worker =
context().actorOf(Worker.props(workerName), workerName);
router = router.addRoutee(worker);
})
.match(CalculationRequest.class, (request) -> {
router.route(new Broadcast(request), self());
})
.match(CalculationResult.class, (result) -> {
// process only the first (the fastest) result
})
.build();
}
}
(最速)最初の後に来るのメッセージを廃棄するロジックを実装するための最良のパターンが入って来何を引き起こすのですか?
CalculationSupervisorには多くのリクエストがあり、それらのすべてを処理したいと考えています。あなたのアプローチでは、CalculationRequestのいずれかのCalculationResultを取得した場合、他のリクエストの処理結果は停止します。あなたのソリューションは、いくつかのマップ計算要求識別子とそれらのステータスを使用して拡張することができます。これは私の元々の考えですが、私はよりエレガントなソリューションを探しています:) –