首页 > 解决方案 > X秒后如何让响铃请求超时?

问题描述

有没有办法让我的服务器在 X 秒后自动超时(在服务器上)?

我想这样做是因为 heroku requests在 30 seconds 后超时,并且我不想在这些情况下将服务器资源浪费在计算响应上。我还想杀死任何打开的数据库事务,所以我不会在用户没有得到体面响应的情况下更改数据库。

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

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

标签: clojureringhttp-kit

解决方案


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

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

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

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

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

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


推荐阅读