Clojure:luminus 框架的默认服务器是什么?

Clojure: What is the default server for the luminus framework?

截至目前(2018 年),当您使用默认设置设置 luminus 模板项目时,使用的 http/tcp 服务器是什么?

我读到 luminus 使用 immutant,但是,immutant 是其他东西的集合。而且我还读到在 immutant 中使用的底层服务器是 undertow。

我假设默认服务器是 undertow 是否正确?如果是这样,默认设置如何执行非阻塞 IO?该服务器是否提供像 nginx/nodejs 这样的非阻塞事件循环架构?

貌似默认使用immutant,不过你可以选择alternative servers

你说得对,Immutant 使用 Undertow 作为它的网络服务器。

Undertow 使用非阻塞 IO 线程(通常每个 CPU 核心一个)并且还管理工作线程池。引用他们的 documentation:

The XNIO worker manages both the IO threads, and a thread pool that can be used for blocking tasks. In general non-blocking handlers will run from withing an IO thread, while blocking tasks such as Servlet invocations will be dispatched to the worker thread pool.

IO threads run in a loop. This loop does three things:

  • Run any tasks that have been scheduled for execution by the IO thread
  • Run any scheduled tasks that that have hit their timeout
  • Call Selector.select(), and then invoke any callbacks for selected keys

此架构与节点架构之间的明显区别是工作线程池的分离,允许阻塞。

恐怕我不能说比较实际的性能,这将是特定于用例的。

截至 2019 年年中,默认 HTTP 服务器是 Jetty 通过 luminus-jetty 包。这是在这里编码的,其他支持的服务器以默认命名:

(set-feature "+jetty" #{"+aleph" "+http-kit" "+immutant" "+war"})

来源:Luminus.

截至 2020 年年中,Liminus 已切换到 ring-undertow 作为默认服务器。