websocket - Akka Websocket 完成,但客户端仍然连接
问题描述
(阿卡 2.6.5,阿卡-http 10.1.12)
Source.queue
我在连接的Sink.actorRef
每一侧都有一个服务器/客户端 websocket 设置。
事实证明我的系统有一个相当严重和意想不到的缺陷(在生产中发现不少):
- Sink Actor 失败并终止(记录了死信)
- 接收器参与者被发送流失败消息(在
Sink.actorRef
构造中配置) - 这也被记录在死信中,因为参与者确实已经死了。
所以我们有一个完成的网络套接字流对吗?这就是Half-closed websockets会说的(虽然,只要注意到标题 id 是“half- closed- client - websockets ...)
取而代之的是……什么都没有。连接的客户端保持连接 - 没有完整的消息或失败。
有什么配置我需要主动告诉akka在这样的失败时完全关闭Http吗?
测试
我在集成测试中重现了这个问题:
- 建立连接
- 休眠 70 秒(只是为了确保保活配置/正常工作)
- 从服务器发送消息
- 确保收到客户
- 杀死服务器参与者接收器(并查看相同的流故障 -> 死信如上)
- 等待客户端确认完成(100 秒)- 要么:
- 如果我什么都不做 -> 超时
- 如果我在等待完成之前将消息从客户端发送到服务器:
- 60后:
Aborting tcp connection ... because of upstream failure: TcpIdleTimeoutException
- 流发送到客户端接收器失败。
- 60后:
笔记
在这个阶段我故意不包含代码,因为我试图正确地理解这项技术——要么我发现了一个错误,要么是对 web 套接字如何工作(和失败)的根本误解。如果您认为我应该包含代码,您需要说服我它可能如何帮助创建答案
在生产中,关闭失败意味着 websocket 客户端等待数据 12 小时(当时它没有尝试发送消息)
解决方案
推荐阅读
- json - jq - 当键/值在不同文件中时组合多个 if 条件
- c# - 在 wpf C# 中禁用自定义父项时启用子控件
- bash - 在 bash 中使用数组来更改每个循环中创建的文件夹的名称
- perl - 詹金斯用反斜杠跑线
- javascript - 谷歌身份验证弹出无法在 React 应用程序中使用 Firebase
- vba - 如何将所有附件保存在 MS Access 表中所有记录的单个字段中?
- node.js - Mongoose Schema.pre insertMany 中间件
- python - Python:json到json数组并在开头附加日期
- c# - C# 异常打印出中断的 SQL 行
- angular - 如何在编译期间使Angular忽略错误