首页 文章

将WebSocket从Play移动到Akka HTTP

提问于
浏览
0

我在Play应用程序中有一个WebSocket服务器,我想将它移动到akka-http服务 . 我目前正在使用 ActorFlow.actorRef ,这是Play中不存在的一部分 .

当WebSocket被接受时,我订阅了RabbitMQ队列,并将每条消息转发给WebSocket . 当我收到来自WebSocket的消息时,我会在本地处理一些消息并将其他人转发到RabbitMQ交换机 .

我如何使用akka-http做同样的事情?我可以使用 Sink.actorRef 创建一个接收器并在那里处理入站消息,但是源代码呢?

我可以创建一个带有 Source.actorRef 的源代码,但是如何访问该actor以在其实现时发送消息?我应该使用不同类型的源来从我的RabbitMQ订阅的 foreach 发送消息吗?

一旦我有了这些,看起来我可以使用 Flow.fromSinkAndSource 返回所需的流程 .

1 回答

  • 0

    我会解释你的要求

    你有一个需要的websocket终点

    • 在本地处理一些请求并将响应发送回客户端

    • 将一些请求转发给RabbitMQ

    • 订阅rabbitMQ,并将来自rabbitMQ的消息转发给websocket客户端 .

    我的建议是,除非必要,避免演员,演员是强大的,但我发现流更容易阅读和理由何时它适合模型

    下面是如何在没有actor的情况下将Source和Sink一起管道

    def wshandler: Flow[Message, Message, _] = {
        val rabbit = new Rabbit()
        val src =
          Source
            .actorRef(100, OverflowStrategy.dropBuffer)
            .mapMaterializedValue(ref => {
              rabbit
                .subscribe[String]("updates", queueName, topics) { 
                  (body, topic) =>
                    log.debug("Received from rabbit")
    
                    // here you forward everything from rabbitmq to    
                    // client using materialized actorRef
                    ref ! TextMessage(body)
                }
            })
    
        // you need to implement your own pattern matching logic to differentiate between request to process 
        // locally and request to route to rabbitMQ
        val sink = Sink.foreach[Message](m => m match {
          case localReq => // your request response processing logic
    
          case rabbitMq => // publish to rabbitMQ
        })
    
        Flow.fromSinkAndSource(sink, src)
      }
    

    这个片段没有实现你展示的任何要点,希望它能解决你的问题

相关问题