首页 > 解决方案 > Akka Websocket 完成,但客户端仍然连接

问题描述

(阿卡 2.6.5,阿卡-http 10.1.12)

Source.queue我在连接的Sink.actorRef每一侧都有一个服务器/客户端 websocket 设置。

事实证明我的系统有一个相当严重和意想不到的缺陷(在生产中发现不少):

  1. Sink Actor 失败并终止(记录了死信)
  2. 接收器参与者被发送流失败消息(在Sink.actorRef构造中配置) - 这也被记录在死信中,因为参与者确实已经死了。

所以我们有一个完成的网络套接字流对吗?这就是Half-closed websockets会说的(虽然,只要注意到标题 id 是“half- closed- client - websockets ...)

取而代之的是……什么都没有。连接的客户端保持连接 - 没有完整的消息或失败。

有什么配置我需要主动告诉akka在这样的失败时完全关闭Http吗?

测试

我在集成测试中重现了这个问题:

  1. 建立连接
  2. 休眠 70 秒(只是为了确保保活配置/正常工作)
  3. 从服务器发送消息
  4. 确保收到客户
  5. 杀死服务器参与者接收器(并查看相同的流故障 -> 死信如上)
  6. 等待客户端确认完成(100 秒)- 要么:
    • 如果我什么都不做 -> 超时
    • 如果我在等待完成之前将消息从客户端发送到服务器:
      1. 60后:Aborting tcp connection ... because of upstream failure: TcpIdleTimeoutException
      2. 流发送到客户端接收器失败。

笔记

在这个阶段我故意不包含代码,因为我试图正确地理解这项技术——要么我发现了一个错误,要么是对 web 套接字如何工作(和失败)的根本误解。如果您认为我应该包含代码,您需要说服我它可能如何帮助创建答案

在生产中,关闭失败意味着 websocket 客户端等待数据 12 小时(当时它没有尝试发送消息)

标签: websocketakkaakka-stream

解决方案


推荐阅读