私は、あなたが「自分自身のメッセージパッシングのオーバーヘッド」によって何を意味するかわかりません。 ネットワーク/シリアル化が含まれていない場合、オーバーヘッドは無視できます。一方の側はメッセージをキューにプッシュし、もう一方はキューからメッセージをプッシュします。
アッカは、それが単一のマシン上で毎秒早く50万メッセージを行くことができると主張しています。これは、複雑なサブシステムのファサードのようにアクターを使用しないことを意味します。あなたはむしろ、それらを小さな "作業単位"としてモデル化するでしょう。便利なときに、小さなトークオブジェクトに比べて複雑にすることができます。たとえば、KafkaConsumerActor
は内部的にConnection、Configurationなどの他の「通常の」クラスを利用することができますが、これらはアクターである必要はありません。しかし、単純な作業(メッセージを消費し、どこかに送信する)を行う単純な作業単位になるにはまだ十分です。
50百万秒は本当にたくさんあります。
メモリフットプリントも非常に小さくなります。 Akka自身は、ちょうど1GBのヒープで約2.5百万人の俳優を抱えることができると主張しています。典型的なシステムとは対照的に、実際には何もありません。私は本当にそれが重要なことであることを期待していないので、役者を作成ライフサイクルについては
は、クラスのインスタンスとメールボックスを作成するよりもはるかに重いではありません。
通常、システムには1つのメッセージを処理して死ぬアクターがたくさんありません。通常、はるかに長く生きる俳優を育てる。同様に、あなたが提供するパラメータに基づいて住宅ローンの返済額を計算する俳優は、まったく死ぬ理由もありません。
また、Akkaでは、俳優プール(さまざまな種類のもの)を使用するのが非常に簡単です。
ここでのパフォーマンスは非常に微妙です。
最後のポイントは、あなたがコンテキストでアッカのオーバーヘッドを比較するべきであるということです。たとえば、システムがデータベースクエリを実行したり、HTTPリクエストを処理したり実行したり、何らかの大規模IOを実行したりしている場合、これらのアクティビティのオーバーヘッドはAkkaのオーバーヘッドをあまりにも小さくするので、それについて考えることさえありません。 50ミリ秒のDBへのラウンドトリップのように、2.5百万回のakkaメッセージからのオーバーヘッドに相当します。それは問題ですか?
あなたはAkkaがパフォーマンスペナルティを支払うことになるエッジケースのシナリオを見つけることができますか?多分。 Akkaは黄金のハンマーではない(何もない)。
しかし、上記のことをすべて念頭に置いて、特定の状況でパフォーマンスのボトルネックになっているのがAkkaなら、マイクロ最適化に時間を浪費していると考えるべきです。
一部のハード番号ありがとうございます。私は個々のUDP/IPパケットを扱うコンテキストで考えていました。一つのアクターがそれぞれのノートに注意を払う必要があり、会話を認識した後でそれが責任あるアクターに委任されたその場で作られた。競合の単一のポイントを取り除くことは可能ですが、非常に単純なソフトウェアだけを実行できる多数の、しかし小さな低レベルのデバイスであるクライアントには、複雑さが大幅に増加し、クライアントに完全に移行することはありません。 – Turin