问题标签 [http-kit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5903 浏览

clojure - 我可以使用 http-kit 和 core.async 制作一个完全非阻塞的后端应用程序吗?

我想知道是否可以将一个完全非阻塞的 Clojure 后端 Web 应用程序与 http-kit 放在一起。

(实际上任何与 Ring 兼容的 http 服务器对我来说都可以;我提到 http-kit 是因为它声称具有事件驱动的非阻塞模型)。


编辑:TL;博士

这个问题是我对非阻塞/异步/事件驱动系统的性质有一些误解的症状。如果你和我在同一个地方,这里有一些澄清。

只有当所有(比如说,大部分) IO 从头开始​​以非阻塞方式处理时,才能创建一个具有非阻塞性能优势的事件驱动系统(如在 Node.js 中)。这意味着您的所有数据库驱动程序、HTTP 服务器和客户端、Web 服务等都必须首先提供异步接口。尤其:

  • 如果您的数据库驱动程序提供同步接口,则无法使其成为非阻塞的。(您的线程被阻止,无法检索它)。如果你想要非阻塞,你需要使用别的东西。
  • 像 core.async 这样的高级协调实用程序不能使系统成为非阻塞的。它们可以帮助您管理非阻塞代码,但不要启用它。
  • 如果您的 IO 驱动程序是同步的,您可以使用 core.async 来获得异步的设计优势,但您不会获得它的性能优势。您的线程仍将浪费时间等待每个响应。

现在,具体来说:

  • http-kit 作为 HTTP 服务器提供了一个非阻塞的异步接口。见下文。
  • 但是,许多 Ring 中间件,因为它们本质上是同步的,因此与这种方法不兼容。基本上,任何更新返回响应的 Ring 中间件都将不可用。

如果我做对了(而且我不是专家,所以如果我的假设是错误的,请告诉我),这种 Web 应用程序的非阻塞模型的原则如下:

  1. 让几个超快的操作系统线程处理所有 CPU 密集型计算;这些绝不能等待
  2. 有很多“弱线程”处理 IO(数据库调用、Web 服务调用、休眠等);这些主要是为了等待
  3. 这是有益的,因为处理请求所花费的等待时间通常比计算时间高 2(磁盘访问)到 5(Web 服务调用)数量级。

据我所知,Play Framework (Scala) 和Node.js (JavaScript) 平台默认支持此模型,并使用基于 Promise 的实用程序以编程方式管理异步。

让我们尝试在基于 Ring 的 clojure 应用程序中使用 Compojure 路由来执行此操作。我有一个通过调用my-handle函数构造响应的路由:

似乎在 Clojure 应用程序中管理异步的普遍接受的方式是基于 CSP 的,使用core.async库,我完全没问题。所以如果我想接受上面列出的非阻塞原则,我会这样实现my-handle

CPU 密集型construct-my-response任务在go-block 中执行,而等待外部资源在thread-blocks 中完成,正如 Tim Baldridge 在 core.async (38'55'')上的视频中所建议的那样

但这还不足以使我的应用程序不阻塞。无论线程通过我的路线并调用该my-handle函数,都将等待构建响应,对吗?

使这种 HTTP 处理也非阻塞是否有益(我相信),如果是这样,我该如何实现呢?


编辑

正如 codemomentum 指出的那样,对请求进行非阻塞处理的缺失要素是使用 http-kit 通道。结合 core.async,上面的代码会变成这样:

这使您确实可以采用异步模型。

问题在于它与 Ring 中间件几乎不兼容。Ring 中间件使用函数调用来获取响应,这使得它本质上是同步的。更一般地说,事件驱动处理似乎与纯函数式编程接口不兼容,因为触发事件意味着有副作用。

我很高兴知道是否有一个 Clojure 库可以解决这个问题。

0 投票
1 回答
262 浏览

java - http-kit 客户端的最大并发 http 请求数?

我正在使用带有异步回调的http-kit客户端。

我想知道是否有办法对并发传出 http 请求的数量设置限制,以便回调的等待状态不会导致 Out-Of-Memory 异常。

我问是因为,至少在理论上,可能有太多并发的、不完整的请求会消耗内存。由于内存是有限的资源(考虑在Docker等容器中运行),这可能是一个问题。

我知道增加可用 RAM 是一种选择,但我想知道是否可以设置相关限制。

0 投票
0 回答
675 浏览

tomcat - 使用 tomcat7 部署 clojure / http-kit 应用程序

简短的故事:我正在尝试在 tomcat7 上部署一个使用 http-kit 模板构建的应用程序第三步是一个命令(),我完全不知道如何处理它。sh java -jar target/lein-template-standalone.jar --profile prod --port 8000

长话短说:对于一个简单的复合应用程序,我可以这样做:

......它的工作原理。现在 http-kit 模板在此处 ( https://github.com/http-kit/lein-template ) 提供了部署说明,并且完全不同。我删除了 tomcat7/webapps 中的所有内容,然后:

它不起作用,但没有错误,我的本地主机是空白的。这可能并不奇怪,http-kit 模板的 README 包含三个步骤:

  1. lein uberjar 在目标目录下创建一个独立的可执行jar文件
  2. 将 jar 和公共目录复制到您的生产服务器
  3. ```sh java -jar target/lein-template-standalone.jar --profile prod --port 8000

我完全不知道第三步是什么或者我应该把那个命令放在哪里。

0 投票
1 回答
334 浏览

clojure - 将响应正文的字符集从 UTF-8 更改为 CP1251

我评估以下代码

它打印

如果 index.html 在 CP1251 中,并且

如果相同的文档是 UTF-8。

俄语中的 index.html 内容是

http-kit 将响应正文作为 UTF-8 编码的字符串对象返回,但它不考虑 HTML 文档的实际字符集。这会导致身体像垃圾一样

如何使 org.httpkit.client/get 看成文件的字符集?

0 投票
0 回答
98 浏览

http - clojure 上的 http-kit 和 compojure,获取 url 查询中的 # 符号失败

由于 # 符号是查询字符串的一部分,我无法获取 http get 查询婴儿车。

理想情况下,外部方应该对参数进行 URL 编码,但事实并非如此。

因此,当我在收到的请求上调用 :query-string 时,它可以正常工作。

无论如何我可以缓解这个问题吗?

我已经浏览了 http-kit 文档和 ring doc,因为 http-kit 符合 ring 规范但无济于事。如果有人能指出我正确的方向,我将不胜感激。

0 投票
0 回答
161 浏览

clojure - http-kit Clojure 和 Gloss - 解码帧的字节数不足

我正在使用HTTP-KIT编写一个简单的服务器和客户端 HTTP。现在我想发送一些使用光泽编码的数据。

我的光泽代码是这样的:

此代码运行良好:

在我的服务器/客户端 HTTP 代码中,我有:

对于服务器:

对于客户:

然后当我尝试使用客户端发送一些data

感谢您的帮助

0 投票
1 回答
434 浏览

clojure - 使用解析调用函数 - Clojure

我正在使用resolve给定名称(字符串)来调用函数,例如

call功能:

在 REPL 上一切正常。但是当我将项目作为server使用 httpkit http 服务器启动时,我收到了一个 NPE。

在第 41 行http_resources我有这个call功能。

我不知道这里发生了什么。感谢您在这里的任何帮助。我创建了一个项目来帮助重现问题

0 投票
1 回答
267 浏览

clojure - 在运行服务器时注册多个处理程序

有没有办法在运行 http-kit 服务器时注册多个处理程序:

如何将两条路由都传递给运行服务器,例如 rest-main-app 和 rest-events-app ?

0 投票
2 回答
1365 浏览

json - 如何在 httpkit 中将 Content-Type 设置为 application/json

我使用httpkit作为 http 客户端。我尝试了许多解决方案来制作标题Content-Typeapplication/json但都失败了。

这是我的代码:

使用上面的代码发布会得到response status 200but Content-Typeis application/x-www-form-urlencoded

而如果删除该行application/x-www-form-urlencoded,就会得到response status 400

PS:我将flask作为网络服务器。

0 投票
1 回答
838 浏览

clojure - 如何将 http.kit 服务器与吊桥环处理程序一起使用?

我有以下服务器代码:

当我尝试作为开发或生产连接到吊桥 REPL 时:

lein repl :connect http://localhost:10555/repl

我收到以下错误:

问题显然出在drawbridge/ring-handler功能上。这些是我的依赖项:

有人用 drawbrige 开始工作 http.kit 服务器吗?我错过了什么?