Akka Websocket已完成,但客户端仍处于连接状态

Akka Websocket已完成,但客户端仍处于连接状态,websocket,akka,akka-stream,Websocket,Akka,Akka Stream,(Akka 2.6.5,Akka http 10.1.12) 我有一个服务器/客户端websocket设置,在连接的每一侧使用Source.queue和Sink.actorRef 事实证明,我的系统有一个相当严重和意外的缺陷(至少在生产中发现): Sink actor失败并终止(记录死信) Sink actor被发送流失败消息(在Sink.actorRefconstruction中配置)-这也记录在死信中,因为actor确实死了 我们有一个完整的web套接字流,对吗?这就是我们要说的(尽管注意标

(Akka 2.6.5,Akka http 10.1.12)

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

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

  • Sink actor失败并终止(记录死信)
  • Sink actor被发送流失败消息(在
    Sink.actorRef
    construction中配置)-这也记录在死信中,因为actor确实死了
  • 我们有一个完整的web套接字流,对吗?这就是我们要说的(尽管注意标题id是“半封闭客户端websockets…”)

    结果是…什么都没有。连接的客户端保持连接-没有完整的消息或故障

    有什么配置需要我主动告诉akka在出现这种故障时完全关闭Http吗

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

  • 建立联系
  • 睡眠70秒(只是为了确保keep alives配置/工作正常)
  • 从服务器发送消息
  • 确保客户收到
  • 杀死服务器参与者接收器(并查看与上面相同的流故障->死信)
  • 等待客户端确认完成(100秒)-或者:
    • 如果我什么都不做->超时
    • 如果我在等待完成之前将消息从客户端发送到服务器:
    • 60秒后:
      中止tcp连接…因为上游故障:TcpIdleTimeoutException
    • 流发送到客户端接收器失败
  • 笔记 在这一阶段,我故意不包含代码,因为我试图正确理解这项技术——或者我发现了一个bug,或者对web套接字的工作原理有一个根本性的误解(并且失败了).如果您认为我应该包含代码,您需要说服我它如何帮助创建答案


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

    是否有任何日志记录指示Sink.actorRef失败的错误原因?您可以尝试启用日志记录,并配置
    akka.actor.debug.lifecycle=on
    (警告,将产生大量日志输出)以查看日志中是否包含有关actor失败的更多详细信息。@SeanGlover这是一个空指针。actor接收器肯定应该爆炸(良好),死信也记录了流失败消息(良好).但是为什么插座没有关上?它应该是对的?我的期望是它是一个bug,但也许我的期望是错的。