ktor 服务器 - 何时移动到另一个协程上下文

ktor server - when to move to another coroutine context

这可能是关于协程的一般问题,但在我的 ktor 服务器(netty 引擎,默认配置)应用程序中,我对数据库和 api 端点执行了多次异步调用,并想确保我是有效地使用协程。我的问题如下:

  1. 是否有工具或方法可以确定我的代码是否有效地使用协程,或者我是否只需要使用 curl 向我的端点发送垃圾邮件并测量将进程移动到另一个上下文的性能,例如compute?
  2. 我不想开始将 tasks/jobs 移动到另一个上下文 'just in case' 但我是否应该将 Route.route() 中的默认协程上下文与 Android 主上下文类似线程并对其执行最少的工作量?

这是我使用的代码的粗略示例:


fun Route.route() {
    get("/") {
        call.respondText(getRemoteText())
    }
}

suspend fun getRemoteText() : String? {
   return suspendCoroutine { cont ->
        val document = 3rdPartyLibrary.get()
            if (success) {
                cont.resume(data)
            } else {
                cont.resume(null)
            }
        }
}

  1. 您可以使用 Apache Jmeter 之类的东西,但编写脚本并使用 curl 向您的服务器发送垃圾邮件对我来说似乎也是一个不错的选择
  2. 协程在 context/thread 切换时非常高效,使用 Dispatchers.DefaultDispatchers.IO 你会得到一个线程池。有一些关于此的文档,但我认为您绝对可以利用这些 Dispatchers 进行繁重的操作
  1. 用于测试端点的工具很少。 Jmeter不错,还有wrk、wrk2、siege等命令行工具
  2. 当然是上下文切换成本。路由中的协程对于 运行 阻塞操作是安全的,除非您设置了 shareWorkGroup 选项。但是,通常最好使用单独的线程池,因为您可以控制它的大小(最大线程数)而不会使数据库宕机。