位置透過性

位置透過性

前節ではアクターパスを使用して、どのようにして位置透過性を有効にするかを述べました。 “リモート透過性” という用語はプログラミング言語、プラットフォーム、技術それぞれの文脈で全く異なった使われ方がされますので、 この特別な機能にはさらなる説明を行う必要があります。

デフォルトでの分散

Akka は全ての場所で分散設定で動作するように設計されています。アクターの全ての相互作用は純粋ナメッセージパッシングを用い、また全てが非同期です。この努力は全ての機能が単一の JVM でも数百のマシンから成るクラスタ上でも動作可能であることを実現するために行われています。これを可能にする鍵は、一般的な方法であるローカルからリモートへ向かうことの代わりに、最適化された方法でリモートからローカルへ向かうようにすることです。1つめのアプローチがなぜ失敗に向かうのかについては、 こちらの昔の文書 を見てください。

透過性を使いこなすには

分散実行を行うための設計では、それを可能にするためにいくつかの制約が課されるので、通常のアプリケーションでの常識が Akka では常識にならないことがあります。 最も明示的なものの一つは通信する全てのメッセージがシリアライゼーション可能でなけれなばならないことです。一方わかりづらいものとして、 アクターがリモートノードとして作成される場合は、アクターのファクトリ ( Props の内部 ) として使用されるクロージャが含まれていることが挙げられます。

他の結果として、全ての作業が完全に非同期で行われることを認識しておく必要があり、(設定にもよりますが) コンピュータネットワーク越しでは受信者にメッセージが届くまで数分を要する可能性があります。これはまた、メッセージが失われる可能性が JVM内では 0 に近くなりますが (それでも完全には保証されていません) 、そうでない場合は非常に高くなることを意味します。

リモーティングをどうやって使用するか

透過性の考え方は、Akka のリモートレイヤのための API を可能な限り制限し、純粋に設定によって動かすことに専念しています。前節で示した原則に従ってアプリケーションを書くと、設定ファイルにアクターのサブツリーのリモートデプロイを明記できます。この場合、コードに触れることなくアプリケーションをスケールアウトさせることができます。リモートデプロイをプログラム的に行うことができる唯一の API は、特定の Deploy インスタンスをフィールドに含む Props です。これは設定ファイル内のデプロイと同等の作用をします(両方とも設定がある場合は、設定ファイルを優先します)。

ピアツーピア 対 クライアントサーバー

Akka リモーティング は ピアツーピア風のアクターシステムどうしを接続するための通信モジュールで、Akka クラスタリングの基盤にもなっています。リモーティングの設計は、2つの(関連している)設計上の方針によって進めています。

  1. 関係のあるシステム間の通信は対称性があり、もしシステムAがシステムBと通信できるなら、システムBもまたシステムA に個別に通信できる必要があります。

  2. 通信システムの役割は、通信パターンに関する対象性です。接続を受け付けるだけのシステムや、接続を発信するだけのシステムはありません。

この方針の結果。予め定義された役割を持つ安全に純粋なクライアントサーバーの構成を作ることはできません(仮説2 に違反します)。 クライアントサーバーの構成には、HTTP や Alla I/O を使う方がよいでしょう。

重要: ネットワークアドレス変換を含む構成では、追加のネットワーク設定によりシステム間の対称通信を許可しない限り、ロードバランサーや Docler コンテナは仮説1 に違反します。そのような状況では Akka は Akka ノード間での通信を成立させるために1つ以上の異なるネットワークアドレスを結びつけるように設定します。 詳細は、Akka behind NAT or in a Docker container を見てください。

ルーターによるスケープアップの要点

クラスター内の複数のノード上のアクターシステムで複数の部品を実行することに加えて、並列性をサポートするアクターのサブツリーを掛け合わせてより多くのコアの上でスケールアップすることができます(例えば、サーチエンジンが異なるクエリを並列で処理するのを想像してみてください)。クローンは、ラウンドロビンなど複数の方法でルーティングされます。開発者がこれを実行するのに唯一必要なのは、 “withRouter” としてアクターを宣言することです。すると、アクターの代わりにルーターアクターが作成され、設定済みの数の子供を要求した型で産み出し、設定した方法でルーティングさせます。そのようなルータを一度宣言すると、その設定を設定ファイルで自由に上書きでき、(いくつかの)子供をリモートデプロイに含めるようなことも可能になります。これについてより詳しくは、 Routing (Scala)Routing (Java) を読んでください。

Contents