使用 Jetty 12 演示 Ktor 中的虚拟线程支持
内容提要
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 可以工作,但不确定这是否是个好主意。