【问题标题】:Redirect websocket connection with play framework and akka使用 play 框架和 akka 重定向 websocket 连接
【发布时间】:2017-10-09 13:18:32
【问题描述】:

我想将一个 websocket 连接重定向到另一个 play 实例,但还没有弄清楚如何去做。

基本上我有一个在节点和参与者之间进行负载平衡的 akka 集群(使用 akka 路由器),到目前为止一切都很好,它正在工作。

因此,我需要在一个播放实例中接收 websocket 连接,但我想使用路由器(akka actor)将其转发到另一个播放实例。这很重要,因为这样我就达到了我的负载平衡要求。

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

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

问题是这会立即返回一个流(akka 流)并建立 websocket 连接,我需要转发请求并在另一个 Play 实例中建立连接。此转发必须通过参与者以保持负载平衡。我可以转发消息就好了,但我需要转发初始连接。

感谢您的帮助。

【问题讨论】:

    标签: playframework websocket akka


    【解决方案1】:

    在这篇文章中从 botkop 找到了解决方案。而且根据 akka http 文档似乎是正确的(还有其他方法,但要么更复杂,要么被弃用)

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

    以上方法可用于重定向到一个静态 URL,该 URL 可以是另一个播放实例,也可以不是。这个其他实例可以实现 websocket,就好像它是一个独立的解决方案一样。

    在我的情况下,我需要负载平衡,因此,除了上述内容之外,在方法“websocketFlow”中,我首先需要使用 akka actor,它是集群中的路由器并询问它的目的地,这将替换“localhost :9000”。这并不完美,因为我需要向演员发送消息只是为了找出我将代理 websocket 的实例,并且只有在我可以代理请求之后。更好的解决方案是路由器参与者可以完成“websocketFlow”的工作。

    完整的解决方案太大了,无法在此处发布,但 akka 集群和路由在其文档 http://doc.akka.io/docs/akka/current/java/cluster-usage.html 中得到了很好的解释

    【讨论】:

      猜你喜欢
      • 2022-12-13
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多