【问题标题】:Failures in streaming handling of requests - what happens to connection?流式处理请求失败 - 连接会发生什么?
【发布时间】:2019-01-24 13:08:17
【问题描述】:

akka-http 的文档解释说,完全使用请求流很重要,因为未拉取的字节将被解释为背压 (https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html)。当您事先知道流可以被忽略时,您应该使用discardEntityBytes,或者完全阅读它。还可以选择通过将流附加到Sink.cancelled 来关闭连接。

我的问题是当流失败时会发生什么。

  • 流已耗尽还是连接已关闭?还是实现的责任是从错误中恢复并耗尽或关闭连接?如果是这样,什么是一个好的代码模式?
  • 使用Future 完成请求或响应是否流式传输是否重要?
  • 如果您在流的中途确定可以忽略流的其余部分,而不是意外失败,该怎么办。抛出异常是停止流处理的好方法吗?

用未来完成的例子:

val route =
    post {
        extractDataBytes { data =>
            complete {
                data
                    .via(flow1)
                    .via(flow2) // say error happens here at some point
                    .runwWith(sink)
            }
        }
    }

【问题讨论】:

    标签: scala akka-stream akka-http


    【解决方案1】:

    如果服务器连接有问题,连接将自动关闭。

    【讨论】:

    • 立即关闭连接:data.runWith(Sink.cancelled)
    • 考虑耗尽连接并使用Connection: Close 标头回复,如果您希望客户端在此请求/回复周期后关闭:respondWithHeader(Connection("close"))
    • 使用data.runWith(Sink.cancelled) 或关闭连接如果你事先知道选择什么选项是有意义的。我的问题是如何处理中途的错误和决策。
    猜你喜欢
    • 2020-01-16
    • 2018-10-11
    • 2014-08-28
    • 2017-12-19
    • 1970-01-01
    • 2021-07-13
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多