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


93

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

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

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

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

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

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

編集する

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


12
私はあなたに賛成票を投じ、近い投票者全員に「立ち去る」と言いました:)
Nerrve '11 / 11/22

@cbmeeksは、あなたが何を選択したのか、そしてあなたの選択でどのように進んでいるのかを聞いてもいいですか?
Jas

回答:


64

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

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

上記はすべてを網羅しているわけではなく、さらに多くの違いがあると思います。


1
安静なWebアプリケーションを構築するためにAKKAを使用することにした場合、PLAY-FRAMEWORKまたはSPRAYを使用するのが最善の方法だと思いますか?
2013年

3
はい、どちらも良い選択です。Playは完全に統合された開発体験を提供するフレームワークとして適していますが、Playがアプリケーションを実行することを意味します。Akkaアプリケーションに薄いRESTレイヤーを埋め込むだけの場合は、スプレーが適しています。スプレーは来月にakka-httpになることに注意してください。
Roland Kuhn

2
また、指摘しておくと、Scala / Javaを使用して静的に型付けされた言語のすべての優れた点が得られ、JavaScriptでコールバックの地獄がなくなります。Java / Scalaは、javascriptよりもデバッグが簡単です。
Chirdeep Tomar

2
ノードとの並列性に関しては、クラスターコアAPIを使用して実行時にプロセスをフォークできることを述べておく必要があります。それはあなたがパラレルアクターによってあなたが意味することをします。
カーネル

2
2012年からのこの回答は、特にNodeに関して多くのものが変更されたため、現在は非常に日付が古いようです。Node でnpmjs.com/package/webworker-threads Webワーカーを確認してください。ブロックしている集中的な作業を並列プロセスに移動できます(すべて同じNodeプロセス内)。
Mark Pieszak-Trilon.io

8

私はまだ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/ 100万は2011年にそうです/

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


では、さまざまなソースからのログファイルを記録する必要があると仮定します。アプリケーションがログエントリを生成するたびに、そのエントリを別のアプリケーションに送信して記録する必要もあります。アプリにDBタイムアウト、http障害などが発生する可能性があるため、これは長時間実行されるプロセスである可能性があります。したがって、この例では、DBへの書き込みがハングすると、ノードシステム全体がハングします。AKKAでも同じ問題が発生するのですか、それとも相関関係が得られないのですか?
cbmeeks

1
このような場合、dbアクセスは通常非同期として実装されるため、どちらも影響を受けません。しかし、どうにかして同期ライブラリを作成することができた場合、それらは両方ともフリーズします。
yetihehe

ありがとう。私はこれをnode vs akka議論に変えないように一生懸命努力していますが、解決しなければならない本当の問題があります。私のJava / JavaScriptスキルはかなり近いと思いますが、Nodeの経験はほとんどなく、AKKA(またはScala)の経験はありません。しかし、私はいくつかのアプリケーション(現時点では内部ですが、後で外部)を使用しており、人々はこれらの膨大なログを検索する方法を探しています。プライバシーの問題により、外部のサードパーティオプションを使用できません。どちらかが仕事を処理するようだ。しかし、私はAKKAのメッセージパッシングが好きなので、それを探求します。さらに、JavaはJSよりもここにプッシュされます。ありがとう。
cbmeeks

大量のログを検索する必要がある場合は、logstashまたはgraylog2を調べてみてください。
Toddius Zho 2013

6

これが描画するのに適切な比較であるかどうかはわかりません。私はこれを「イベントベースのシステムと俳優モデルをどのように比較するのか」と読みます。Nodejsは、AkkaでのScalaやOrleansでのC#と同じように、アクターモデルをサポートできます。実際にはnactorをチェックしてください。

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

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

また、ドラマもご覧ください。これは、別のnodejsアクターモデル実装です。


1
nodejsを使用してクラスターをセットアップしてみてください。docker、kuberneteesが必要で、分散システムを作成します。また、nodejsでもう1つのコアの使用を設定してみてください。アッカはそれらに対処することを切望しています。また、nodejs自体の成熟度、セキュリティ、および何かを実行するために別のフレームワークを必要とするコードの作成方法は、nodejs自体は大きな分散システムでは使用できず、少なくともMSAの方法で使用できる点です。とにかく私の意見。
ラファエロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.