ktor 服务器 - 何时移动到另一个协程上下文
ktor server - when to move to another coroutine context
这可能是关于协程的一般问题,但在我的 ktor 服务器(netty 引擎,默认配置)应用程序中,我对数据库和 api 端点执行了多次异步调用,并想确保我是有效地使用协程。我的问题如下:
- 是否有工具或方法可以确定我的代码是否有效地使用协程,或者我是否只需要使用 curl 向我的端点发送垃圾邮件并测量将进程移动到另一个上下文的性能,例如
compute
?
- 我不想开始将 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)
}
}
}
- 您可以使用 Apache Jmeter 之类的东西,但编写脚本并使用 curl 向您的服务器发送垃圾邮件对我来说似乎也是一个不错的选择
- 协程在
context
/thread
切换时非常高效,使用 Dispatchers.Default
和 Dispatchers.IO
你会得到一个线程池。有一些关于此的文档,但我认为您绝对可以利用这些 Dispatchers 进行繁重的操作
- 用于测试端点的工具很少。 Jmeter不错,还有wrk、wrk2、siege等命令行工具
- 当然是上下文切换成本。路由中的协程对于 运行 阻塞操作是安全的,除非您设置了
shareWorkGroup
选项。但是,通常最好使用单独的线程池,因为您可以控制它的大小(最大线程数)而不会使数据库宕机。
这可能是关于协程的一般问题,但在我的 ktor 服务器(netty 引擎,默认配置)应用程序中,我对数据库和 api 端点执行了多次异步调用,并想确保我是有效地使用协程。我的问题如下:
- 是否有工具或方法可以确定我的代码是否有效地使用协程,或者我是否只需要使用 curl 向我的端点发送垃圾邮件并测量将进程移动到另一个上下文的性能,例如
compute
? - 我不想开始将 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)
}
}
}
- 您可以使用 Apache Jmeter 之类的东西,但编写脚本并使用 curl 向您的服务器发送垃圾邮件对我来说似乎也是一个不错的选择
- 协程在
context
/thread
切换时非常高效,使用Dispatchers.Default
和Dispatchers.IO
你会得到一个线程池。有一些关于此的文档,但我认为您绝对可以利用这些 Dispatchers 进行繁重的操作
- 用于测试端点的工具很少。 Jmeter不错,还有wrk、wrk2、siege等命令行工具
- 当然是上下文切换成本。路由中的协程对于 运行 阻塞操作是安全的,除非您设置了
shareWorkGroup
选项。但是,通常最好使用单独的线程池,因为您可以控制它的大小(最大线程数)而不会使数据库宕机。