リモート処理

リモート処理

Akkaのリモート処理能力の紹介は、「remoting」を見て下さい。

注釈

前の章で述べたように、Akkaリモート処理はピアツーピア方式での通信用に設計され、クライアントサーバー型には制限があります。 特にAkkaリモート処理はネットワーク アドレス変換やロードバランサ、Dockerコンテナー上の実行に透過的には動作しません。このような状況での対称型通信のために、ネットワークおよび/またはAkka configrationは変更しなけらばならないでしょう。ー『 対称通信 』の記載を参照。

アクターシステムをリモート対応させる準備

Akkaリモート処理は、別々 の jar ファイルです。プロジェクトの次の依存関係があることを確認してください。

<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-remote_@binVersion@</artifactId>
  <version>@version@</version>
</dependency>

'Application.conf' ファイルに以下の変更を追加する必要があります、少なくとも、安家プロジェクト、リモート機能を有効にします。

akka {
  actor {
    provider = remote
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
 }
}

4 つ上の例でわかるようにを開始するを追加する必要があります。

  • 'リモート 'に 'ローカル' からプロバイダーを変更します。

  • アクターシステムを実行するマシンのホスト名を追加します。このホスト名は、まさにこのシステムを識別するためにリモート システムに渡され、その結果を使用する必要がある場合、このシステムに接続するためしたがって設定到達可能な IP アドレスまたは解決可能な名前をネットワーク経由で通信する場合。

  • それを自動的に選択して 0 に設定 - アクターシステムがリッスン ポートのポート番号を追加します。

注釈

ポート番号は、アクターシステムは、異なる名前を持つ場合も同じマシン上の各アクターシステムで一意である必要があります。これは、各アクターシステムがある独自のネットワーク サブシステム接続のリッスンと他アクターシステムと邪魔にならないメッセージを処理するためです。

上記の例はリモート処理を有効にする追加する必要がある最低限のプロパティを示しています。すべての設定については' リモート構成 java'を参照。

リモートアクターを見つける。

'actorSelection(path)' はリモート ノードでアクターを 'ActorSelection ' を取得します。

ActorSelection selection =
  context.actorSelection("akka.tcp://app@10.0.0.1:2552/user/serviceA/worker");

次のパターンを使用してリモート ノードで俳優を検索上記の例からわかるように。

akka.<protocol>://<actorsystemname>@<hostname>:<port>/<actor path>

俳優に選択を取得後と対話できるそれ彼らなど現地の俳優と同じ方法:。

selection.tell("Pretty awesome feature", getSelf());

取得する、: クラス: 'ActorRef' のために: クラス: 'ActorSelection' メッセージを送信選択する俳優からの応答の 'getSender' 参照を使用する必要があります。すべてのアクターが理解し、含まれている 'ActorIdentity' のメッセージを自動的に返信する組み込み '識別' メッセージがある、: クラス: 'ActorRef'。これは 'resolveOne' 法使うこともできます、: クラス: 'ActorSelection' は、一致する '未来' を返します: クラス: 'ActorRef'。

注釈

俳優アドレスとパスが形成され、使用を参照してください方法の詳細について: ref: 'アドレス'。

注釈

送信側の俳優システムでは、実際に俳優にメッセージ送信を行うリモート俳優 ref プロバイダー経由で配信されません。彼らは現地の俳優 ref プロバイダーによってを直接配信しています。

脇より良いパフォーマンスを提供する、これはまた場合はホスト名から非常に同じ俳優システム内で解決することはできません実際に耳を傾けるし、リモート処理を構成すると、このようなメッセージが (おそらく意外なことに) 配信されることだけで罰金を意味します。

俳優をリモートで作成します。

安家リモート処理の作成機能を使用する場合がある (唯一の展開セクションを示す) さらに次のように 'application.conf' ファイルを修正します。

akka {
  actor {
    deployment {
      /sampleActor {
        remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
      }
    }
  }
}

上記の構成パスと俳優の反応する安家に指示します '/sampleActor 'すなわち' system.actorOf (新しい Props(...)、"sampleActor") ' を使用して、作成されます。この特定の俳優が直接インスタンス化されない、しかし、代わりにこのサンプルでは、'sampleActorSystem@127.0.0.1:2553 ' に対応するアクターを作成するリモート システムのリモート デーモンがあります。

上記のプロパティの構成を終えたらコードで、次の操作を行います。

ActorRef actor = system.actorOf(Props.create(SampleActor.class), "sampleActor");
actor.tell("Pretty slick", ActorRef.noSender());

それ、すなわち俳優システム クラスローダを使用してランタイムを使用する 'SampleActor' は俳優クラスは、クラスを含む jar ファイルを持っています。

注釈

俳優の作成中にコンス トラクター引数を渡すとき、「小道具」の直列化可能性を確保するため行わない工場非静的内部クラス: これは、本質的にほとんどの場合、シリアル化可能ではないそのの外側のオブジェクトへ参照をキャプチャします。静的な内部クラスが実装をすることが最善です: クラス:' 作成者 < T は、俳優を拡張> '。

構成項目を設定することによってすべての小道具の直列化可能性をテストことができます ' akka.actor.serialize クリエイターに = '。だけで、小道具が '展開 '' 結び付けます ' はこのチェックから除外されます。

注釈

指定することができるので、俳優のパス セクションのワイルドカードと一致する、アスタリスクを使用できます: '//sampleActor '階層のレベルにあるすべての 'sampleActor' と一致するでしょう。特定のレベルですべてのアクターを一致するように、最後の位置にワイルドカードを使用できますまた: '/someParent/ '。非ワイルドカードの一致が常にあるのでワイルドカードより一致するように優先順位の高い: '/foo/バー ' と見なされます * * 詳細特定の * * よりも '/foo/* '、最も高い優先順位に一致した文字列だけを使用します。それに注意してください * * できません * *] セクションで、このような部分的に合わせて使用する: '/foo */バー '、'/f * o/バー」など。

プログラム導入

動的に展開されているシステムを許可することも可能ですの配置構成が含まれる、: クラス: アクターを作成に使用される ' 小道具': この情報は、構成ファイルから展開部と同等と、両方がある場合外部構成が優先されます。

これらのインポート。

import akka.actor.ActorRef;
import akka.actor.Address;
import akka.actor.AddressFromURIString;
import akka.actor.Deploy;
import akka.actor.Props;
import akka.actor.ActorSystem;
import akka.remote.RemoteScope;

このようなリモート アドレス:

Address addr = new Address("akka.tcp", "sys", "host", 1234);
addr = AddressFromURIString.parse("akka.tcp://sys@host:1234"); // the same

リモート ノードに子を作成するシステムをお勧めすることができます次のよう。

ActorRef ref = system.actorOf(Props.create(SampleActor.class).withDeploy(
  new Deploy(new RemoteScope(addr))));

ライフ サイクルおよび障害復旧モデル

../_images/association_lifecycle.png

リモート システムと各リンクは、上の図の 4 つの状態のいずれかにすることができます。すべての通信が発生する前に、リモート システム指定の 'アドレス 'アソシエーションのステートには' アイドル ' です。初めてリモートに送信されるメッセージが試行されたシステムまたは着信接続が受け入れられる 2 つのシステムがメッセージを送信または受信する「アクティブ」を示すリンク遷移の状態と失敗のないこれまでのところ発生しました。通信エラーが発生して、接続が 2 つのシステム間のリンクを切断になる ' ゲート '。

この状態で、システムがリモート ホストへの接続をしないし、すべての送信メッセージは削除されます。リンクは、' ゲート '状態の時間は、' akka.remote.retry-門-閉鎖-の' 設定によって制御されます。 この時間が経過すると再び '' アイドル' にリンク状態遷移。'ゲート' は意味で一方的に成功するたびに * 受信 * 'ゲート' それ自動的に遷移 'アクティブ' で通信の履歴書にすぐに中にリモート システムから接続が受け付けられます。

参加システムの状態の一貫性がないため回復不可能な通信障害に直面してリモート システムになる「検疫」。'ゲート ' とは異なり検疫は永続的とのいずれか、システムを再起動するまで続きます。再起動後通信を再び再開することができ、リンクがなることができます 'Active' 再び。

リモートの俳優を見てください。

リモート俳優を見ては現地の俳優を見ても別に記載: ref:' デス ・ フロント-java'。

障害検出器

フードの下でリモート死の時計は、ネットワークの障害見た俳優の優雅な契約の終了に加えて、JVM クラッシュから '終了' のメッセージを生成するのにハートビート メッセージとエラー検出器を使用します。

ハートビートの到着時刻は、_ '、ピピ発生障害検出器 < http://www.jaist.ac.jp/~defago/files/pdf/IS_RR_2004_010.pdf >' の実装によって解釈されます。

障害の疑いレベルですと呼ばれる値で与えられた * ピピ *。ピピ障害検出器の基本的な考え方は、の値を表現する * ピピ * 動的に現在のネットワークの状態を反映するように調整はスケールで。

値 * ピピ * として計算されます。

phi = -log10(1 - F(timeSinceLastHeartbeat))

ここで F は平均と歴史的なハートビート相互到着時間から推定した標準偏差の正規分布の累積分布関数です。

: Ref:' 構成-java リモート '、' akka.remote.watch-障害-detector.threshold ' 時期を定義するを調整することができます、* ピピの値はエラーと見なされます。

低「しきい値」は多くの偽陽性を生成する傾向がある実際クラッシュが発生した場合迅速な検出を保証。逆に、高「しきい値」は、間違いを少なくを生成しますが、実際のクラッシュを検出するより多く時間必要があります。既定の「しきい値」10 を、ほとんどの状況に適したです。しかし Amazon EC2 のようなクラウド環境の値まで引き上げられるだろう 12 プラットフォームでこのような時に発生するネットワークの問題に対応するために。

次のグラフを示していますどのように * ピピ * 以前のハートビートから時間の増加とともに増加します。

../_images/phi1.png

ピピは平均から計算され、歴史の標準偏差間の到着時間。以前は 200 さんハートビート到着少ない偏差曲線の場合の標準偏差の例が急になる、すなわち障害をよりすばやく判断することが可能です。カーブは 100 ms の標準偏差を求めるようになります。

../_images/phi2.png

ガベージ コレクションの休止や障害検出器が、余裕を持って構成されている一時的なネットワーク エラーなどの突然の異常を生き残るためにできるように ' akka.remote.watch-障害-detector.acceptable-ハートビート-ポーズ」。調整したい場合があります、: ref:' リモート構成-java' この場合環境によって。これはどのようにカーブの「許容-ハートビート-一時停止 '' 3 秒に設定されているようです。

../_images/phi3.png

シリアル化

俳優のリモート処理を使用する場合 '小道具' と 'メッセージ' これらの俳優のために使用される、シリアル化を確保する必要があります。これを行うに失敗したシステムが意図しない方法で動作するが発生します。

詳細については次を参照してください: ref:' シリアル化-java'。

Java シリアライザーを無効にします。

リリース '2.4.11 ' 以降安家のデフォルト Java シリアル化機構を完全無効にすることが可能です。注意してください: ref:' 新しいリモート処理の実装 (コードネーム動脈) <remoting-artery-java>' 既定で内部メッセージの Java シリアル化は使用しません。互換性の理由から、まだ現在のリモート処理は、いくつかのクラスの Java シリアル化を使用するためしかし無効にできますそれこのリモート処理実装でも以下の手順で。

Java シリアル化は遅くなること知られているであり、さまざまな種類の攻撃を受けやすいそれ決して高スループット メッセージングすべての後。しかし、それは非常に使い便利、従ってそれ残った安家ユーザー メッセージだけでなく、いくつかの以前のバージョンでその内部メッセージをシリアル化するために使用する既定のシリアル化機構です。動脈のリリース以来安家内部 Java シリアル化もう (' java.lang.Throwable ' をされている 1 つの例外) に依存しないでください。

注釈

新しいリモート処理の実装 (コードネーム動脈) を使用している場合、安家はそれの内部メッセージのいずれかの Java シリアル化を使用しません。だから java シリアル化を無効にすることを奨励が、最古の可能性があります、プロジェクト内に計画してください。

1 つは、ネットワークの帯域幅と待機時間を制限するリモート メッセージングのパフォーマンスが、シリアル化はより一般的なボトルネックと思うかもしれません。

ユーザー メッセージの Java シリアル化を使用して実装されている既定のシリアライザーと動脈で有効なままになります。しかしそれを完全に無効にし、効果的に順序の代わりに適切なシリアル化ライブラリを利用をお勧めします利用パフォーマンスの向上と動脈を使用した展開を圧延のための能力を行います。使用するをお勧めしますライブラリなどがあなたのメッセージのスキーマの展開をより細かく制御したい場合に、'Kryo' _ _ 'Akka kryo-シリアル化' ライブラリを使用してまたは 'Google のプロトコルバッファー' _ に限定されません。

俳優システムで Java シリアル化を完全に無効にするために、'application.conf ' に次の構成を追加する必要があります。

akka {
  actor {
    serialization-bindings {
      "java.io.Serializable" = none
    }
  }
}

つまりは、すべてのリモート メッセージを処理することが異なるシリアライザーを構成する必要があるのでご注意ください。参照してください、: ref:' シリアル化スカラー座 ' ドキュメントと同様: ref: 'ByteBuffer ベース シリアル化 <remote-bytebuffer-serialization-scala>' これを行う方法を学習します。

警告

古いリモート処理を使用する場合は、追加のシリアル化バインディングを有効にするとき、に、クラスターに参加しているすべてのノードで整合が取れませんのシリアル化の構成が発生受信ノードでシリアル化解除エラーので行う必要があることに注意してください。

Java のシリアル化を使用していない安家によって提供される追加のシリアルのバインドも簡単にできます。

これらは既定で有効になっていない理由は、2.4.x 俳優システム間線レベルの互換性です。新しいクラスターを展開する場合すべてこれらのシリアライザーを有効にすることができます同じ安家バージョンがお勧めこの設定を有効にします。使用する場合: ref:' リモート処理-動脈スカラー ' これらのシリアライザーが既定で有効になっています。

リモート宛先とルーター

絶対にリモート処理を組み合わせることは不可能です: ref:' ルーティング java'。

リモート配置された routees のプールとして構成できます。

akka.actor.deployment {
  /parent/remotePool {
    router = round-robin-pool
    nr-of-instances = 10
    target.nodes = ["akka.tcp://app@10.0.0.2:2552", "akka.tcp://app@10.0.0.3:2552"]
  }
}

この構成設定は 10 回 'remotePool 'の '小道具' で定義されている俳優のクローンを作成し、2 つの指定されたターゲット ノードに均等に分散展開します。

リモートの俳優のグループとして構成できます。

akka.actor.deployment {
  /parent/remoteGroup {
    router = round-robin-group
    routees.paths = [
      "akka.tcp://app@10.0.0.1:2552/user/workers/w1",
      "akka.tcp://app@10.0.0.2:2552/user/workers/w1",
      "akka.tcp://app@10.0.0.3:2552/user/workers/w1"]
  }
}

この構成設定は、定義されたリモート俳優パスにメッセージを送信します。一致するパスとリモート ノードのターゲット アクターを作成することが必要です。ルーターで実行されていません。

リモート処理のサンプル

' 活性化 Lightbend < http://www.lightbend.com/platform/getstarted >'_ が付属してより広範なリモート例があります。名前 ' 安家リモート サンプル java < http://www.lightbend.com/activator/template/akka-sample-remote-java >'_ チュートリアルは、リモート展開とリモート俳優の検索の両方を示します。

リモートのイベント

購読/購読解除これらのイベントに、単に登録するリスナーとして、安家リモートで発生するイベントをリッスンすることが可能だ、下 'ActorSystem.eventStream ' の型を説明します。

注釈

任意のリモートのイベントを購読する購読する: メタンフェタミン: 'RemotingLifecycleEvent'。 アソシエーションのライフ サイクルに関連するイベントを購読する購読する: meth:'akka.remote.AssociationEvent'。

注釈

「接続」代わりに「協会」言葉の使用、remoting サブシステムは、コネクションレス トランス ポートを使用可能性ありますが、安家プロトコルのエンドポイント間のトランスポート レイヤー接続と同様、関連付け維持に反映されます。

既定では、イベント リスナーが登録されているすべての下記イベントのログします。この既定値は、システムの設定に役立つに選ばれたが、プロジェクトのフェーズが終了したら、このログ出力をオフにすることは珍しくありません。

注釈

ログ記録をオフに設定 'akka.remote.log リモート ライフ サイクル イベント = オフ '、'application.conf' で。

とき、協会に通知するには、が (「切断」) の上に耳を傾ける 'DisassociatedEvent ' 方向 (受信または送信) の協会および関係者のアドレスを保持します。

関連付けが正常に確立されたときに通知するには、(「接続される」) 'AssociatedEvent ' 方向 (受信または送信) の協会および関係者のアドレスを保持するに耳を傾けます。

直接の関連付けに関連するエラーを傍受するには、関係者と「Throwable '' 原因アドレス協会の方向 (受信または発信) を保持している '' AssociationErrorEvent '' を聞きます。

リモート処理サブシステムはアソシエーションを受け入れる準備ができてとき通知を受ける、remoting がリッスンするアドレスを含む、'RemotingListenEvent ' に耳を傾けます。

リモート処理サブシステムのシャット ダウンされているときに通知する、'RemotingShutdownEvent ' に耳を傾けます。

現在のシステムは、リモート システムで検疫されたときに通知される、'ThisActorSystemQuarantinedEvent ' は、ローカルおよびリモートの ActorSystems のアドレスを含むに耳を傾けます。

ジェネリックのリモート処理をインターセプトするには、関連のエラー、'RemotingErrorEvent '' Throwable ' 原因を保持しているに耳を傾けるのです。

リモート セキュリティ

安家は、いくつかのリモート ノード (クライアント/サーバー) 間のセキュリティを強化する方法を提供します。

  • 非信頼関係モード

  • Cookie のセキュリティ ハンドシェイク

非信頼関係モード

俳優システムは別にリモート接続することができますとすぐにそれが原則として可能にメッセージを送ってそのリモート システム内に含まれる任意の俳優。1 つの例を送信する可能性があります、: クラス: システムのシャット ダウン、システム保護者に ' PoisonPill'。これは常に必要がないし、それを次の設定で無効にできます。

akka.remote.untrusted-mode = on

これはシステム ・ メッセージの送信を禁止 (俳優ライフ サイクル コマンド、デス ・ フロント等) および任意のメッセージ拡張: クラス: このフラグが設定されているシステムに ' PossiblyHarmful'。クライアントは、それらを送信する必要がありますそれにもかかわらず彼らは削除され (サービス攻撃の拒否の可能性を減らすためにデバッグ レベル) で記録されます。: クラス: 'PossiblyHarmful' をカバーするような定義済みメッセージ: クラス: 'PoisonPill' と: クラス: '殺す'、しかし、それも追加できますマーカーの特性としてユーザー定義のメッセージを。

俳優の選択によって送信されたメッセージは、既定で信頼関係のないモードで破棄されますが、構成で定義されている特定の俳優に俳優の選択メッセージを受信するアクセス許可を付与できます。

akka.remote.trusted-selection-paths = ["/user/receptionist", "/user/namingService"]

型の実際のメッセージする必要がありますされませんがまだ: クラス: 'PossiblyHarmful'。

要約すると、次の操作はリモート処理層を介して受信信頼関係のないモードで構成されているシステムによって無視されます。

  • リモート ・ デプロイメント (これも遠隔で監視を含みません)

  • リモート デス ・ フロント

  • ' system.stop() ': クラス: 'PoisonPill': クラス: '殺す'

  • メッセージを送信する、: クラス: 含まれています 'PossiblyHarmful' マーカー インターフェイス: クラス: '終了'

  • 俳優の選択 '信頼できる選択パス' のターゲットが定義されていない場合に送信されるメッセージ。

注釈

非信頼関係モードを有効にするしても、そのメッセージのターゲット送信すると、リモート システムのどんな俳優に上記の規則によって禁止されていないメッセージを送信できることを意味を自由に選択するクライアントの機能は削除されません。だけ (多分後で検証を実行する) 実際のワーカー俳優を含む別の俳優システムに要求を転送するエントリ ポイント俳優の明確に定義されたセットを格納するクライアント向けシステムのことをお勧めします。これらの 2 つのサーバー側のシステム間でのメッセージングが行われる場合ローカルを使用して: クラス: 'ActorRef' (彼らをやり取りできる安全に同じ JVM 内で俳優システム)、マークすることによってこのインターフェイスでメッセージを制限することができます: クラス: 'PossiblyHarmful'、クライアントがそれらを築くことができません。

SSL

SSL は、' akka.remote.netty.ssl 'を' 有効なトランスポート ' 構成セクションに追加することによってリモート トランスポートとして使用できます。設定の説明を参照してください、: ref:"リモート-構成-java"セクション。

網状の既定の設定の例ベースの既定値として SSL ドライバー。

akka {
  remote {
    enabled-transports = [akka.remote.netty.ssl]

    netty.ssl.security {
      key-store = "mykeystore"
      trust-store = "mytruststore"
      key-store-password = "changeme"
      key-password = "changeme"
      trust-store-password = "changeme"
      protocol = "TLSv1.2"
      random-number-generator = "AES128CounterSecureRNG"
      enabled-algorithms = [TLS_RSA_WITH_AES_128_CBC_SHA]
    }
  }
}

SSL のサポートは、Java セキュリティで保護されたソケット拡張機能で実装、トラブルシューティングの公式 'Java セキュリティで保護されたソケット拡張機能ドキュメント < http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html >' _ および関連リソースを参照してください。

注釈

Linux はお勧めで SHA1PRNG を使用する場合は、ブロッキングを防ぐ JVM への引数として '-Djava.security.egd=file:/dev/./urandom' を指定します。わけではない種を再利用するため、保護します。使用 '/dev/./urandom' によると動作しないしない '/dev/urandom' と ' バグ ID: 6202721 < http://bugs.sun.com/view_bug.do?bug_id=6202721 >'_。

リモート構成

安家のリモート処理に関連付けられている構成プロパティの多くがあります。我々 を参照してください、: ref: 詳細については「参照構成 <config-akka-remote>」.

注釈

リッスンしている ip アドレスとポート番号のようなプロパティをプログラムによって設定は最高の次のようなものを使用して行われます。

ConfigFactory.parseString("akka.remote.netty.tcp.hostname=\"1.2.3.4\"")
    .withFallback(ConfigFactory.load());

安家に港湾労働者コンテナー、または NAT の後ろです。

設定でネットワーク アドレス変換 (NAT)、ロード バランサーまたは港湾労働者コンテナー安家のバインド先のホスト名とポートのペアを含む「論理的な」ホスト名とは異なること、外からシステムへの接続に使用されるペアをポートします。論理とリモート処理のバインドのペアを設定する特別な構成が必要です。

akka {
  remote {
    netty.tcp {
      hostname = my.domain.com      # external (logical) hostname
      port = 8000                   # external (logical) port

      bind-hostname = local.address # internal (bind) hostname
      bind-port = 2552              # internal (bind) port
    }
 }
}

Contents