処理 Node.jsイベントシステムとAkkaのアクターパターンとの違いは?




scala akka (3)

私はNode.jsを使って少し時間をかけてきました。 しかし、私はちょうどAkkaを発見し、即座に(私が理解するところから)その俳優のパターンに興味がありました。

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

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

しかし、Akkaの俳優について読んだら、それは同じことで秀でるでしょう。 そして私は仕事を一口一片に減らすという考えが好きです。 加えて、何年も前、私はErlangで手伝って、それが使うメッセージパッシングシステムに恋しました。

私は複雑なビジネスロジックを扱う多くのアプリケーションを扱っています。私は、より重くなっていく時が来たと考えています。 特に従来のStrutsおよびC#アプリケーションのアップグレード

とにかく、聖なる戦争を避けて、2つのシステムはどう違うのですか? 両方とも同じ目標に向かっているようだ。 多分Akkaの「自己修復」アーキテクチャが有利な場合があります。

EDIT

私は近い票を得ているようです。 この問題を「より良い、ノードまたはakkaですか?」と見なさないでください。 私が探しているのは、NodeやActkaベースのAkkaのようなイベント駆動型ライブラリの根本的な違いです。


私はAkkaをまだ使用していませんが、それはerlangのようですが、javaのようです。 すべてのプロセスはAkkaのアクターのようなもので、メールボックスを持っています。それらの間でメッセージを送信したり、監督者などがいます。

Node.jsは協力的な並行性を使用します。 これは、(例えば、io操作やある種の非同期イベントを呼び出すときに)許可したときに並行性があることを意味します。 あなたが長い操作(長いループで何かを計算する)を持っているとき、システムブロック全体。

Erlangはプリエンプティブなタスク切り替えを使用します。 ループが長いと、システムは他の操作を実行してしばらくしてから続行することができます。 大規模な並行処理の場合Node.jsは短い操作しかしないと良いです。 どちらも数百万のクライアントをサポートしていますhttp://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ : 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が一時停止しますが、これはすべての関数で起こります)。 メッセージ間で実行を一時停止することができます。


私はこれが公平な比較であるとは思わない。 私はこれを「イベントベースのシステムはアクターモデルとどうやって比較するのですか?」と読みました。 NodeJは、ScalaがAkkaで行うのと同じようにアクターモデルをサポートすることができます。あるいは、C#はOrleansで実際にnactorチェックアウトしnactor 。誰かがすでに試しているようです。

イベントを起こしたシステムとアクターモデルをどのように比較すれば、私は賢明な人々にそれを説明させるでしょう。 Actorモデルについてのいくつかの簡単なポイント:

  • アクターモデルはメッセージベースです
  • アクターモデルは、分散システム(クラスター)でうまくいく傾向があります。 確かにイベントベースのシステムを配布することができますが、私はアクターモデルには配分に関する配分が組み込まれていると思います。 新しい要求は、別のサイロ内の新しいアクタにルーティングできますが、イベントベースでこれがどのように機能するかはわかりません。
  • Actorモデルでは、クラスタ1のapperasがダウンしている場合、オブザーバは一般的に作業を行うために別のサイロを見つけることができます

また、 dramaチェックしてください。 それは別のnodejsアクターモデルの実装です。


(Node.jsの場合はほとんど分かりませんが)詳細には触れませんが、主な違いは、Node.jsは並列性を持たない並列性だけをサポートし、Akkaは両方をサポートしています。 両方のシステムは完全にイベント駆動型で大規模な作業負荷に対応できますが、並列性の欠如によりNode.jsでは困難になります(つまり、並列性は複数のノードを起動し、それに応じて要求をディスパッチすることによって明示的にコード化されます。 、調整可能なマルチスレッドエグゼキュータのため、Akkaではかなり簡単です。 小さな独立した作業単位(俳優の呼び出し)が与えられた場合、Akkaは自動的に実行を並列化します。

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

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





actor