clojure - X秒后如何让响铃请求超时?
问题描述
有没有办法让我的服务器在 X 秒后自动超时(在服务器上)?
我想这样做是因为 heroku requests在 30 seconds 后超时,并且我不想在这些情况下将服务器资源浪费在计算响应上。我还想杀死任何打开的数据库事务,所以我不会在用户没有得到体面响应的情况下更改数据库。
我正在使用 HTTP-kit 2.3.0 和 compojure 1.6.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 (环 2 规范也是 WIP)
如果您现在需要解决方案,可以尝试使用 Aleph。这为您提供了 Ring 处理程序的便利,但也允许您异步创建响应。 https://github.com/ztellman/aleph
(可能有更多的替代品。想到了 Vert.x。也许还有其他 Clojure 替代品)
推荐阅读
- php - 导出批量数据 - PHP laravel
- reactjs - Fetch API 在 localhost 上运行良好,但在 Heroku 上不行
- javascript - jQuery 圆形菜单
- c# - Blazor:如何在通用组件中将事件传递给 onClick 函数
- html - 从 CSS 列表中删除点
- c# - 如何访问活动公共属性
- ruby-on-rails - Rails 公寓:添加 www。重定向到公共租户
- python - 不了解 Django 的 ORM - 模型
- netsuite - 为什么 NetSuite 不创建付款文件?
- python-3.x - 如何使用启动器而不是从终端运行基于 Tkinter 的 GUI 应用程序