预期负载的 Ktor (Netty) 配置值

问题描述 投票:0回答:1

使用 Netty 配置 Ktor

embeddedServer
时,存在三个独立的线程池:

connectionGroupSize = XX  // accept new connections and start call processing
workerGroupSize = YY      // process connections, parse messages, do engine's internal work
callGroupSize = ZZ        // process application calls

有关于“它们是什么”的文档(包含在上面的评论中),但我找不到任何内容来解释每个阶段在处理请求的上下文中实际意味着什么,或者它们与总容量的关系。

如果我的服务器主要接受

GET 请求并从数据库返回内容,计算工作量很少(甚至没有压缩),那么应该如何配置这些服务器来处理每秒 400 个请求,最多 30 个请求并发的?


(假设线程将无法作为“协程”运行,而是阻塞数据库查找。)

multithreading kotlin netty ktor
1个回答
0
投票

我发现这篇

Medium文章

讨论了Netty中线程的工作原理。本文引用了《Netty in Action》一书,该书很好地解释了 EventLoops 和线程的工作原理(第 7 章:EventLoop 和线程模型)。 现在回答你的问题:connectionGroupSize、workerGroupSize 和 callGroupSize 实际上是做什么的: Netty 采用的结构是,每个 EventLoopGroup 持有多个 EventLoop,每个 EventLoop 运行在单独的线程上,以高效地处理网络任务。这种设置可以防止任务重叠并最大限度地减少任务之间切换的需要,使过程更加简单且无错误。

对于服务器端应用程序,Netty 使用 ServerBootstrap 对象,该对象用两个 EventLoopGroup 实例进行初始化:一个用于接受连接(Ktor 中的 connectionGroupSize),另一个用于处理实际连接的数据处理(Ktor 中的workerGroupSize 和 callGroupSize)。这些组的分离有助于平衡接受新连接和处理现有连接之间的负载。

对于你的这部分问题:

如果我有一台主要接受 GET 请求并从数据库返回内容的服务器,只需很少的计算工作(甚至没有压缩),那么应该如何配置这些服务器来处理每秒 400 个请求,最多 30 个并发请求?

connectionGroupSize:由于服务器主要处理接受连接,其开销相对较低,因此可以保持这个数字较小(2-4就足够了)。

workerGroupSize:该组用于处理连接和处理网络 I/O。鉴于请求率较高,workerGroupSize 应足够大以顺利处理 I/O 操作。从 8-16 这样的值开始可能是一个不错的方法。

callGroupSize:此大小应反映处理并发应用程序级操作(例如数据库查询)的能力。由于这些操作不是计算密集型的,但可能由于数据库访问而受到 I/O 限制,因此将 callGroupSize 设置为 30-50 等数字可以帮助有效管理并发请求,确保数据库查找不会成为瓶颈。

如果您还有与该主题相关的任何其他问题,我认为您不会在 Ktor 文档中找到任何足够详细的内容。您需要更深入地了解 Netty 的底层工作原理。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.