使用 Jetty 12 演示 Ktor 中的虚拟线程支持

💡 原文中文,约1000字,阅读约需3分钟。
📝

内容提要

Jetty 12在Ktor中展示了虚拟线程支持,通过线程调度器将Jetty 12与Ktor集成。但与Ktor 2.x.x不兼容,不支持新的kotlinx IO库,HTTPX/websocket支持无法正常工作,仅限Java 21+。

🔎

延伸解读

虚拟线程集成的核心机制

该演示通过线程调度器将 Jetty 12 与 Ktor 集成,使请求能在虚拟线程上调度。这允许开发者在不阻塞操作系统线程的情况下使用 runBlocking {},以及依赖 ThreadLocal 的库。这种机制为高并发场景提供了新思路,但文章也指出 vthread 调度器虽然可用,其实际效果和合理性尚不明确。

版本兼容性与依赖限制

该集成基于 Ktor 3.0.0-beta1 构建,因此与 Ktor 2.x.x 版本不兼容,也不支持 Kotlin 4 中计划引入的新 kotlinx IO 库。这意味着现有项目若想采用此方案,可能需要升级 Ktor 版本,并关注未来 Kotlin 生态的变动。此外,它仅限 Java 21 及以上版本运行。

协议支持与稳定性风险

文章指出,大多数 HTTP 1.1 请求似乎能正常工作,但 HTTPX 和 websocket 支持几乎肯定无法正常工作。同时,initializeServer() 方法被描述为一团糟,暗示代码质量或可维护性存在隐患。因此,该演示更适合作为概念验证,而非直接用于生产环境。

❓

Q&A

Jetty 12 在 Ktor 中如何实现虚拟线程支持?

通过线程调度器将 Jetty 12 与 Ktor 集成,并在虚拟线程上进行调度。

这个 Jetty 12 与 Ktor 的集成有哪些已知限制?

基于 Ktor 3.0.0-beta1 构建,与 2.x.x 不兼容,不支持 Kotlin 4 的新 kotlinx IO 库,HTTPX/websocket 支持几乎肯定无法正常工作,仅限 Java 21+。

使用这个集成需要什么 Java 版本?

仅限 Java 21 及以上版本。

这个集成支持 HTTPX 和 websocket 吗?

不支持,HTTPX/websocket 支持几乎肯定无法正常工作。

如何快速启动一个使用 Jetty 12 和虚拟线程的 Ktor 服务器?

添加依赖后,使用 EmbeddedServer 并传入 Jetty12 引擎,例如:fun main(args: Array<String>) { val config = CommandLineConfig(args); EmbeddedServer(config.applicationProperties, Jetty12) { takeFrom(config.engineConfig) }.start(true) }。

vthread Dispatcher 在这个集成中能正常工作吗?

vthread Dispatcher 可以工作,但不确定这是否是个好主意。

🏷️

标签

➡️

继续阅读