2017-05-10 13 views
0

websocket接続を別の再生インスタンスにリダイレクトしたいが、まだそれを行う方法を理解していない。再生フレームワークとakkaでwebsocket接続をリダイレクト

基本的には、ノードとアクター(akkaルーターを含む)間の負荷分散を行うakkaクラスターを使用しています。

このため、私は遊びの1つのインスタンスでwebsocket接続を受け取る必要がありますが、私はルータ(akkaアクター)を使用して別の再生インスタンスに転送します。これは私がロードバランシングの要件を達成するため重要です。

のWebSocket接続を受け入れtipicalルートは次のようになります。

def socket = WebSocket.accept[JsValue, JsValue] { request => 
    ActorFlow.actorRef(out => MyWebSocketActor.props(out)) 
} 

問題は、これがすぐに流れを戻す(アッカストリーム)とのWebSocket接続を確立し、私は要求を転送する必要があり、確立されたということですPlayの別のインスタンスでの接続。この転送は、負荷分散を維持するためにアクターを通過する必要があります。私はメッセージをうまく転送できますが、最初の接続を転送する必要があります。

ご協力いただきありがとうございます。

答えて

1

この記事のbotkopから解決策が見つかりました。そして、アッカのhttpドキュメントによれば(そこに他の方法がありますが、どちらかより複雑または廃止予定されている)静的URLにリダイレクトで

Websocket Proxy using Play 2.6 and akka streams

def websocketFlow: Flow[Message, Message, Future[WebSocketUpgradeResponse]] = 
    Http().webSocketClientFlow(WebSocketRequest("ws://localhost:9000/upper-socket")) 

def proxySocket: WebSocket = WebSocket.accept[String, String] { _ => 
    Flow[String].map(s => TextMessage(s)) 
    .via(websocketFlow) 
    .map(_.asTextMessage.getStrictText) 
} 

上記作品正しいものであるように思われたことができます別のプレイのインスタンスかどうか。この他のインスタンスは、まるでスタンドアロンのソリューションであるかのようにWebソケットを実装できます。

私の場合はロードバランシングが必要ですので、上記のメソッド "websocketFlow"に追加する必要があります。まず、クラスタ内のルータであるakkaアクターを使用して宛先を尋ねる必要があります。 localhost:9000 "となります。これは完全ではありません。なぜなら、私は俳優にメッセージを送って、どのインスタンスに私がwebsocketを代理するのかを知る必要があり、要求を代理できるのです。より良い解決策は、ルータアクターが "websocketFlow"の仕事をすることができるところです。

完全な解決策はここに投稿することになりますが、akkaクラスタリングとルーティングについては、そのドキュメントで詳しく説明しています。http://doc.akka.io/docs/akka/current/java/cluster-usage.html

関連する問題