【问题标题】:Postgres c# listen timeoutPostgres c# 监听超时
【发布时间】:2020-06-05 23:14:37
【问题描述】:

我正在使用 Postgres 9.5,它有一个名为 LISTEN/NOTIFY 的功能,允许您设置异步命令通道以从服务器获取通知。在我的应用程序运行并测试通知的前 10 到 15 分钟内,一切似乎都正常,但经过一定时间后,消息似乎被丢弃了。

有人对什么可以防止这种行为有任何建议吗?这与保持活动/ tcp 保持活动设置有关吗?在 pg_state_activity 我看到了相同的连接并且它处于空闲状态。

一般情况

  • 在 c# 中将 npgsql 库用于异地 Postgresql 服务器
  • 使用长时间运行的连接(设置监听、等待)
  • 执行查询以侦听传入的通知和通知
  • 等待(使用取消令牌)直到收到消息(连接时没有其他活动发生)。

查看 StackOverflow 上的其他一些答案,似乎人们也将此归因于池化,尽管我不完全确定这是否能很好地转化为 npgsql,因为它会在连接/断开连接时汇集连接。

我很感激人们对此问题的任何见解,有人知道如何使我的情况发挥作用吗?这是罪魁祸首的代码:https://gist.github.com/phr34k/3a59af154d8ce6636dfc332271052a6a

编辑

针对jjanes的回复,我去进一步调查。当我查看pg_state_activity 时,它会列出处于空闲状态的连接。当我在服务器上用netstat -t 交叉引用客户端端口号时,至少我没有看到列出的连接。

公平地说,在我运行netstat -t 之前,我确实尝试了pg_notify,所以我还不确定运行pg_notify 是否不会导致它终止。然而,奇怪的是连接一直显示在pg_state_activity 中,好像 postgres 甚至没有意识到连接已关闭?

我认为这与防火墙和空闲连接有关。有人知道 ubuntu/digital ocean stack 中是否有任何默认设置会在一段时间后终止连接?

【问题讨论】:

    标签: c# postgresql listen tcp-keepalive


    【解决方案1】:

    我不认为任何事情都会使连接停止侦听,而无需调用 UNLISTEN 或关闭。最可能的解释是连接被切断,然后连接池通过重新建立连接来解决这个问题,在这种情况下,新连接将不会监听。应该在客户端和可能的服务器端记录此事件。您是否在日志中看到在这种情况下似乎有意义的任何内容?

    'idle' 是 pg_stat_activity 中的正常“状态”,除了听之外什么都不做,所以这对你没有帮助。但是“backend_start”列可能会有所帮助,这与关闭和重新打开的连接一致吗? “state_change”一开始可能看起来很有希望,但它似乎并没有仅仅在客户端阅读通知时得到更新。我看不到一个会话检测是否有任何其他会话正在侦听的方法。 pg_listening_channels() 仅适用于发出它的连接。

    等待(使用取消令牌)直到收到消息(连接时没有其他活动发生)。

    取消标记重要吗?你用过吗?可以分享实现这个等待的代码的sn-p吗?

    我认为 10 或 15 分钟不足以让 TCP 确定连接已断开,因此如果连接被切断,则更有可能是某些东西在主动执行此操作,例如防火墙。如果是这种情况,它可能会“看穿”保持活动状态并决定无论如何都要断开连接。

    【讨论】:

    • 这是罪魁祸首gist.github.com/phr34k/3a59af154d8ce6636dfc332271052a6a 我检查了pg_stat_activity,乍一看我真的找不到任何可疑的东西;连接处于空闲状态,所以我手动尝试从 pgAdmin 发送通知,但没有收到任何消息;我还尝试在该状态下终止连接,该连接也没有被拾取。我在连接中启用了 TCP KeepAlive。
    • 取消标记并不重要,我基本上使用该标记,因此当我将其移动到服务组件(启动/停止事件)时,我可以安全地关闭代码。但是,我只进行一次等待/侦听,而不是在超时后定期重入 - 我不确定这是否会使我的代码对这种“遣散”问题更加敏感。
    • 我不明白你做了什么来防止你提到的行为。我也遇到过这个问题。我使用 Tcp Keepalive Time=val1 和 Tcp Keepalive Interval=val2 来设置定义两个连续通知之间的最大间隔的时间。在此时间间隔之后没有收到任何通知。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2018-06-12
    • 2011-06-02
    • 2020-06-24
    相关资源
    最近更新 更多