【问题标题】:How to have ring requests timeout after X seconds?X秒后如何让响铃请求超时?
【发布时间】:2020-04-08 16:35:35
【问题描述】:

有没有什么方法可以在 X 秒后(在服务器上)自动向我的服务器发出请求?

我想这样做是因为在 heroku 请求 time out after 30 seconds 上,我不想在这些情况下将服务器资源浪费在计算响应上。我还想杀死任何打开的数据库事务,所以我不会在用户没有得到适当响应的情况下更改数据库。

我正在使用 HTTP-kit 2.3.0 和 compojure 1.6.1。

(我知道让请求花费这么长时间并不是最佳做法,但这是针对后台项目的,例如当数据库无法访问时会发生这些事情)

【问题讨论】:

    标签: clojure ring http-kit


    【解决方案1】:

    杀死数据库事务并非易事。如果 JDBC 驱动程序正在尝试连接到数据库并等待数据库服务器响应,您可以尝试在 JDBC 驱动程序属性中配置该超时。

    否则,您将不得不尝试杀死 Java 中的阻塞线程,这是不可能的。您可以尝试中断它,但不能保证会一直中断到环处理程序。

    如果您直接使用 HTTPKit API(即不使用 ring),您可以在超时后发送响应(例如使用 core.async)。可以在这里找到一个例子:https://www.braveclojure.com/core-async/

    正在为 HTTPKit https://github.com/http-kit/http-kit/issues/394 提供异步环支持 (Ring 2 规格也是 WIP)

    如果您现在需要解决方案,可以尝试使用 Aleph。 这为您提供了 Ring 处理程序的便利,但也允许您异步创建响应。 https://github.com/ztellman/aleph

    (可能还有更多替代方案。想到了 Vert.x。也许还有其他 Clojure 替代方案)

    【讨论】:

    • 嗯,我相信中断会在我的情况下起作用 - 但我将如何去做呢?
    • 中断需要两个线程:一个负责工作,另一个负责相应的超时和中断。不建议走这条路,因为您不知道 JDBC 驱动程序是否会接受调用(或重试自身等)
    • JDBC(到目前为止)本质上是阻塞的,并且没有任何“异步”(如 Aleph)可以帮助您。他们可以使用标准的 JDBC Statement.cancel 方法;或者只是尝试中断 - 驱动程序可以捕获该异常,但尝试起来很容易,
    • 是的,每个人都明白它是阻塞的。并不意味着您不能在环处理程序级别提供超时。中断和取消都没有保证,因此使用异步 Web 服务器不必将处理请求的线程与处理 JDBC 调用的线程池绑定。您也可以使用阻塞的 http 服务器来实现,但这样会降低可用性。来源:曾经写过一个异步 Postgres 驱动
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2018-08-22
    相关资源
    最近更新 更多