Playframework 使用play framework和akka重定向websocket连接

Playframework 使用play framework和akka重定向websocket连接,playframework,websocket,akka,Playframework,Websocket,Akka,我想将websocket连接重定向到另一个play实例,但还没有找到方法 基本上,我有一个akka集群,在节点和参与者之间使用akka路由器进行负载平衡,到目前为止,一切正常 因此,我需要在一个play实例中接收websocket连接,但我想使用路由器akka actor将其转发到另一个play实例。这一点很重要,因为通过这一点,我实现了负载平衡需求 接受websocket连接的典型路由如下所示: def socket = WebSocket.accept[JsValue, JsValue] {

我想将websocket连接重定向到另一个play实例,但还没有找到方法

基本上,我有一个akka集群,在节点和参与者之间使用akka路由器进行负载平衡,到目前为止,一切正常

因此,我需要在一个play实例中接收websocket连接,但我想使用路由器akka actor将其转发到另一个play实例。这一点很重要,因为通过这一点,我实现了负载平衡需求

接受websocket连接的典型路由如下所示:

def socket = WebSocket.accept[JsValue, JsValue] { request =>
    ActorFlow.actorRef(out => MyWebSocketActor.props(out))
}
问题是,这会立即返回一个流akka streams并建立websocket连接,我需要转发请求并在另一个Play实例中建立连接。为了保持负载平衡,此转发必须经过参与者。我可以转发消息,但是我需要转发初始连接


非常感谢您的帮助。

在本文中找到了botkop提供的解决方案。根据akka的说法,http文档似乎是正确的,还有其他方法,但要么更复杂,要么被弃用

上述方法可以重定向到静态URL,该URL可以是另一个play实例,也可以不是。另一个实例可以实现WebSocket,就像它是一个独立的解决方案一样

在我的例子中,我需要负载平衡,因此,除了上面的方法之外,在方法websocketFlow中,我首先需要使用akka actor,它是集群中的一个路由器,并向它请求一个目的地,这将取代localhost:9000。这并不完美,因为我需要向参与者发送一条消息,以确定我将代理websocket到哪个实例,并且只有在代理请求之后才可以。更好的解决方案是路由器参与者可以完成websocketFlow的工作

完整的解决方案是在这里发布,但是akka集群和路由在其文档中有很好的解释

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)
}