問題タブ [akka-actor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Akka: 一致しないメッセージをメールボックスに保持する
私はErlang/Elixirに精通しており、プロセスのメールボックスにあるメッセージは一致するまでメールボックスに残ります:
パターン
Pattern
は、メールボックス内の最初のメッセージと時間順に照合され、次に 2 番目のメッセージと照合されます。一致が成功し、オプションのガード シーケンスGuardSeq
が true の場合、対応するBody
ものが評価されます。一致するメッセージは消費されます。つまり、メールボックスから削除されますが、メールボックス内の他のメッセージは変更されません。
( http://erlang.org/doc/reference_manual/expressions.html#receive )
ただし、Akka Actors では、一致しないメッセージはメールボックスから削除されます。たとえば、食事の哲学者のシミュレーションでフォークを実装する場合、これは面倒です。
Take(<philosopher>)
メッセージがフォークに送信されると、フォークが解放されてメッセージが一致するまで、メッセージがメールボックスに留まるようにします。ただし、Akka ではTake(<philosopher>)
、フォークが現在行われている場合、一致がないため、メッセージはメールボックスから削除されます。
現在、この問題を解決するには、Fork アクターのメソッドをオーバーライドしunhandled
、メッセージを再度 fork に転送します。
一致するまでメッセージをフォークに送信し続けるため、これは非常に非効率的だと思います。一致しないメッセージを継続的に転送しないで、この問題を解決する別の方法はありますか?
ここで説明されているように、最悪の場合、Erlang メールボックスを模倣するカスタム メールボックス タイプを実装する必要があると思います: http://ndpar.blogspot.com/2010/11/erlang-explained-selective-receive.html
編集: ティムのアドバイスに基づいて実装を変更し、提案どおりに Stash トレイトを使用します。私Fork
のアクターは次のようになります。
stash()
ただし、 andunstashAll()
呼び出しをどこにでも書きたくありません。代わりに、これを行うカスタムのメールボックス タイプを実装したいと考えています。つまり、未処理のメッセージを隠しておき、アクターによってメッセージが処理されたときにそれらをアンスタッシュします。これは可能ですか?
これを行うカスタム メールボックスを実装しようとしましたが、メッセージが受信ブロックと一致したかどうかを判断できません。
akka-http - Akka HTTP (Java) 経由で Akka アクターと対話する方法
トピック
Akka HTTP 経由で Akka Actor と対話したいと思います。アイデアは、HTTP クライアントが Akka HTTP サーバー メソッドを呼び出し、Akka アクターへの要求を処理するシステムを持つことです。アクターはメッセージを処理し、HTTP クライアントに応答する呼び出し元 (Akka HTTP) に応答します。上記のようにできましたが、実装がブロックされているように見えるため、正しく実行していないと思います。
より適切に説明します。多くの同時 HTTP リクエストを作成すると、Akka HTTP が「キューを作成」し、アクターがリクエストを処理するのを待ってから、次のように送信することがわかります。
代わりに取得したいのは、Akka HTTP サーバーが HTTP クライアントからのリクエストをターゲットの akka アクターに即座に転送することです。アクターが精緻化を終了するのを待つ必要はありません。 アクターのメールボックス容量パラメーターを使用して、メッセージ キューの大きさを判断し、メッセージが多すぎる場合はメッセージを拒否したいと考えています。
したがって、Akka HTTP でアクターの応答を非同期に待機させる方法が必要になります。
メールボックスの容量が正しく機能していることはわかっています。なぜなら、単純なactor2.tell("Prova1", system.deadLetters()) (テスト用)を使用してアクターに多くのリクエストを行うと、メールボックスのサイズを超えるリクエストが正しく処理されるからです。拒否されました。
参考文献
システムをテストするために、akka のドキュメントで提供されている最小限の例に従って、簡単な構成を作成しました。akka http の場合: https://doc.akka.io/docs/akka-http/current/routing-dsl/index.html#minimal-example
そして私のアクターを作成するための以下: https://doc.akka.io/docs/akka/current/actors.html#creating-actors
私のコード
私が最初にしたことは、次のように 1 つのアクター (actor1) が akka HTTP を構成するシステムを作成することでした。
私の ActorTest は次のとおりです。
私のapplication.confは非常に単純です:
予想された結果
ご覧のとおり、mailbox-capacity = 1の場合、複数の同時要求を行った場合、1 つのみが処理され、残りは破棄されることが予想されます。
http://127.0.0.1/mysuburl/actor1/my_msgで HTTP リクエストを受信するために Akka HTTP ルーティングを使用してから、 Inboxを使用してメッセージを送信するため、上記のコードは取得したいものに対して正しくないと思います応答を待ちます。
私の質問は、Akka HTTP リクエストを Akka Actor アクター 1 に非同期でリンクする正しい方法はどれですか?
詳細が必要な場合はお知らせください。
ノート
次の記事も読みました: https://doc.akka.io/docs/akka-http/current/handling-blocking-operations-in-akka-http-routes.html
これは、複数のブロッキング要求に対処するために有限数のスレッドを作成する方法を説明していますが、これは私のコードの影響を「軽減」するだけであり、ブロッキングではなく、ブロッキングではない方法で記述する必要があると思います.