私はアクター モデルにまったく慣れていないため、アクターやフューチャーなどの美しい構成可能な抽象化を使用して、私の一般的なシナリオに対処する確立されたパターンが既に存在すると思います。
次の要件を持つ非同期操作があります。
- 低レベルのリクエストを送信し、ポーリングでエンティティの状態を監視することで、レガシー システムを使用します。したがって、実際の操作の結果は延期された方法でのみ利用可能であり、監視された状態が目的の状態に達したときにリクエスターに通知する必要があります。
- これらの操作は、他のいくつかの操作が完了した後にのみ発行できます。これらの操作は、並行して待機する必要があります。
- 操作はキャンセルできます。もちろん、すでに発行された低レベルのリクエストは取り消すことができません。キャンセルとは、依存する操作が終了した後に実際の操作を発行しないことを意味します。もちろん、これは再帰的に伝播する必要があります (依存関係を待っていて、保留中の操作が複数ある場合は、それらを発行しないでください)。
私はFuturesで考えています:最初の要件は、たとえばAkkaのmap
/で解決でき、2番目の要件は、依存関係/依存関係を手続き的に維持することなくflatMap
、コンビネーターで解決できます。しかし、キャンセルtraverse
の解決策が思いつきません。フューチャーはキャンセルできず、構成されている場合、それらのコンポーネントには到達できません。「現在の操作のキャンセル」を機能的な方法でカプセル化する方法は? Scala の Actor フレームワークでこれをサポートしているものはありますか?