web-dev-qa-db-ja.com

Node.jsイベントシステムは、Akkaのアクターパターンとどのように異なりますか?

私はしばらくNode.jsを扱ってきましたが、自分はJavaにかなり優れていると考えています。しかし、私はAkkaを発見したばかりで、すぐにそのアクターパターンに興味を持ちました(私が理解したことから)。

ここで、私のJavaScriptスキルがScala/Javaスキルと同等であると仮定して、どちらかのシステムの実用性に焦点を当てたいと思います。特にWebサービスの面では。

Nodeは多くの同時操作の処理に優れているというのが私の理解でした。アセット管理システムに適したNode Webサービスは、多くのユーザーが同時に変更を送信する(大規模でトラフィックの多いアプリケーションで)処理に優れていると思います。

しかし、アッカの俳優について読んだ後、それは同じことでエクセルになるでしょう。そして、仕事を一口サイズに減らすアイデアが好きです。さらに、数年前、私はErlangに手を出して、Erlangが使用するメッセージパッシングシステムに夢中になりました。

私は複雑なビジネスロジックを扱う多くのアプリケーションに取り組んでおり、どちらか一方に重くのしかかる時期だと思っています。特に、レガシーStrutsおよびC#アプリケーションのアップグレード。

とにかく、神聖な戦争を避けて、2つのシステムは根本的にどのように異なるのでしょうか?両方が同じ目標に向けられているようです。 Akkaの「自己修復」アーキテクチャに利点があるかもしれません。

[〜#〜] edit [〜#〜]

私は近い票を得ているようです。この質問を「ノードとakkaのどちらが良いですか?」と受け取らないでください。私が探しているのは、Nodeのようなイベント駆動型ライブラリとAkkaのようなアクターベースのライブラリの根本的な違いです。

92
cbmeeks

詳細については説明しませんが(Node.jsの場合はあまり知りません)、主な違いは、Node.jsは並行性なしで同時実行のみをサポートし、Akkaは両方をサポートすることです。両方のシステムは完全にイベント駆動型であり、大きなワークロードに拡張できますが、Node.jsでは並列処理がないため困難になります(つまり、並列処理は複数のノードを開始し、それに応じてリクエストをディスパッチすることで明示的にコーディングされます。したがって、実行時に柔軟性がありません) 、調整可能なマルチスレッドエグゼキューターにより、Akkaでは非常に簡単です。孤立した小さな作業単位(俳優の呼び出し)が与えられると、Akkaは自動的に実行を並列化します。

重要なもう1つの違いは、Akkaには構造化された方法で障害を処理するシステムが含まれていることです(各アクターをその親によって監視することは必須です)が、Node.jsは作成者がコールバックからコールバックにエラー条件を渡すための規則に依存しています。根本的な問題は、コールバックのエラーが発生するまでに「呼び出し」コードが別のタスクに移行するため、非同期システムは同期スタックベースのシステムで採用されている例外の標準アプローチを使用できないことです。システムにフォールト処理が組み込まれていると、そのシステム上に構築されたアプリケーションが堅牢になる可能性が高くなります。

上記は完全なものではありません。もっと多くの違いがあると確信しています。

62
Roland Kuhn

私はまだAkkaを使用していませんが、アーランに似ていますがJavaのようです。アーランでは、すべてのプロセスはAkkaのアクターに似ており、メールボックスがあり、メッセージを送信したり、スーパーバイザーなどがいます。

Node.jsは協調的並行性を使用します。つまり、許可すると並行性が得られます(たとえば、io操作または非同期イベントを呼び出すとき)。長い操作(長いループで何かを計算する)がある場合、システム全体がブロックされます。

Erlangはプリエンプティブタスクスイッチングを使用します。長いループがある場合、システムはそれを一時停止して他の操作を実行し、しばらくしてから続行できます。大規模な同時実行の場合、Node.jsは短い操作のみを行う場合に適しています。どちらも数百万のクライアントをサポートしています: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/http://blog.whatsapp .com/index.php/2012/01/1-million-is-so-2011 /

Java並行性を行うにはスレッドが必要です。そうでない場合、erlangが実行する関数内で実行を一時停止できません(実際、erlangは関数呼び出し間で一時停止します。メッセージ間の実行。

8
yetihehe

これが公平な比較になるかどうかはわかりません。これを「イベントベースのシステムとアクターモデルとの比較」と読みます。 NodejsはScalaはAkkaで、C#はOrleansで行うように、実際にチェックアウト nactor のように、アクターモデルをサポートできます。

イベントシステムとアクターモデルの比較については、賢明な人々に説明させていただきます。アクターモデルに関するいくつかの簡単なポイント:

  • アクターモデルはメッセージベースです
  • アクターモデルは、分散システム(クラスター)でうまく機能する傾向があります。確かにイベントベースのシステムは配布できますが、アクターモデルには計算の配布に関して配布が組み込まれていると思います。新しいリクエストは、異なるサイロ内の新しいアクターにルーティングできますが、イベントベースでどのように機能するかはわかりません。
  • アクターモデルは失敗をサポートします。クラスター1のアプリケーションが停止した場合、オブザーバーは通常、作業を行うために別のサイロを見つけることができます。

また、 ドラマ も確認してください。もう1つのnodejsアクターモデルの実装です。

6
stevebot