Suave 停止响应 "Socket failed to accept a client" 错误

Suave stops responding with "Socket failed to accept a client" error

我在 AWS 上通过 ECS(作为 Docker 容器)有一个应用程序 运行,我使用 Suave 接收一些 REST 命令。

代码很原始:

let conf =
    { defaultConfig with bindings = [ HttpBinding.createSimple HTTP "0.0.0.0" 80] }

let app =
    choose
        [
            POST >=> choose
                    [
                    path "/" >=> request (fun m ->
                        // find if this is a subscription confirmation
                        let isConfirmation =
                            m.headers |> List.exists (fun kvp -> snd kvp = "SubscriptionConfirmation")

                        ... more stuff here but that's it for the Suave code

开始于:

let listening, server = startWebServerAsync conf app
server    |> Async.Start
listening |> Async.RunSynchronously |> ignore // wait for the server to start listening

Suave 至少每天一次停止回复任何请求,我在日志中收到以下内容:

(这是一个屏幕截图,因为我无法从(超级烦人的)AWS 日志中获取文本日志 UI)

错误总是一样的,这是一个测试中的应用程序,流量很小。但是,它每 10 秒从另一个应用程序收到一条 ping 消息。

由于这是我的第一个 Suave 项目,我该如何解决这个问题?这是一个已知问题吗?我可以做更多的日志记录来帮助解决问题吗?问题可能是 docker 本身造成的吗?


编辑:

我决定每 1 分钟打印一次使用的连接:

there are 9 connections open
there are 15 connections open
there are 21 connections open
there are 26 connections open
there are 32 connections open
there are 37 connections open
there are 43 connections open
there are 49 connections open
there are 55 connections open
there are 61 connections open
there are 67 connections open

每 10 秒收到一个 ping,作为 POST 消息。

我是这样追踪的:

let p = IPGlobalProperties.GetIPGlobalProperties().GetTcpIPv4Statistics()
terminal.BroadcastMessage $"there are {p.CurrentConnections} connections open"

看起来连接永远不会关闭。

这只是一个猜测,但我现在可以在多个终端上使用 PowerShell Invoke-WebRequest 重现这一点。我打开的每个新终端都会导致打开的连接数增加。事实证明 Invoke-WebRequest 默认使用 Keep-Alive header,所以我可以通过禁用此功能来解决问题。

因此,我想知道您的客户端(发送 ping 的东西)是否正在使用 keep-alive header,但未能重用它打开的连接。如果是这样,您可以通过在客户端中禁用 keep-alive 来解决此问题。