99

私はNode.jsしばらくの間 Java と仕事をしてきましたが、Java はかなり得意だと思っています。しかし、私はその俳優パターンを発見Akkaしたばかりで、すぐに興味を持ちました (私が理解していることから)。

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

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

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

私は、複雑なビジネス ロジックを扱う多くのアプリケーションに取り組んでおり、いずれかのアプリケーションにもっと力を入れる時が来たと考えています。特にレガシー Struts および C# アプリケーションのアップグレード。

とにかく、聖戦を避けて、2つのシステムは根本的にどう違うのですか?どちらも同じ目標に向かっているようです。おそらく、Akka の「自己修復」アーキテクチャには利点があります。

編集

僅差で票を集めているようです。この質問を「ノードと akka のどちらが優れているか?」と解釈しないでください。私が探しているのは、Node のようなイベント ドリブン ライブラリと Akka のようなアクター ベースのライブラリの根本的な違いです。

4

3 に答える 3

70

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

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

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

于 2012-12-16T10:10:52.557 に答える
8

私はまだ Akka を使用していませんが、Java で erlang に似ているようです。erlang では、すべてのプロセスは 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/ 100万はまあまあ2011/

Java では、並行処理を行うためにスレッドが必要です。そうしないと、erlang が行うように関数内で実行を一時停止できません (実際には、erlang は関数呼び出し間で一時停止しますが、これはすべての関数で起こります)。メッセージ間で実行を一時停止できます。

于 2012-12-15T09:49:29.433 に答える
6

これが描くのに公正な比較であるかどうかはわかりません。私はこれを「イベントベースのシステムはアクターモデルとどのように比較しますか?」と読みます。Nodejs は、Scala が Akka で行っているように、または C# が Orleans で行っているように、アクター モデルをサポートできます。実際、nactorを確認してください。誰かがすでに試しているようです。

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

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

ドラマも要チェック。これは別の nodejs アクター モデルの実装です。

于 2014-04-08T17:19:04.427 に答える