gpt4 book ai didi

scala - 从 socko 迁移到 akka-http websockets

转载 作者:行者123 更新时间:2023-12-01 08:41:42 24 4
gpt4 key购买 nike

我有一个基于 socko websockets 构建的现有 akka 应用程序。与套接字的通信发生在单个 Actor 内部,离开和进入 Actor 的消息(分别是传入和传出消息)都标有套接字 id,这是 socko websocket 的第一类属性(在 socko 中,连接请求到达用 id 标记,所有生命周期转换(例如握手、断开连接、传入帧等)都有类似的标记)

我想使用 akka-http 重新实现这个单一的 actor(由于显而易见的原因,socko 如今或多或少已经被废弃了),但这并不简单,因为这两个库在概念上非常不同; akka-http 隐藏了握手、断开连接等较低级别的细节,只需向绑定(bind)到 http 服务器的参与者发送 UpgradeToWebsocket 请求 header 。 header 对象包含一个方法,该方法采用具体化的 Flow 作为与客户端交换的所有消息的处理程序。

到目前为止,一切顺利;我能够在网络套接字上接收消息并直接回复它们。官方示例都假设某种无状态请求-答复模型,因此我正在努力理解如何下一步为物化流分配标签,管理其生命周期和连接状态(我需要通知其他参与者)当客户端断开连接时应用程序,以及标记消息。)

替代方案(使用 akka-streams 重新建模整个应用程序)是一项太大的工作,因此任何有关如何跟踪套接字的建议将不胜感激。

最佳答案

要与现有的基于参与者的系统交互,您应该查看 Source.actorRefSink.actorRefSource.actorRef 创建一个您可以向其发送消息的 ActorRef,而 Sink.actorRef 允许您使用 actor 处理传入消息并检测 Websocket 的关闭。

要将 Source.actorRef 创建的 Actor 连接到现有的长期 Actor,请使用 Flow#mapMaterializedValue 。这也是为套接字连接分配唯一 ID 的好地方。

这个answer to a related question可能会帮助您入门。

有一点需要注意。当使用 websocket close message 关闭客户端到服务器的流时,当前的 websocket 实现不会关闭服务器到客户端的流。 。有一个issue开放实现这一点,但在实现之前,您必须自己执行此操作。例如通过 something like this在你的协议(protocol)栈中。

关于scala - 从 socko 迁移到 akka-http websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37469235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com