【问题标题】:How to stress test Reactive Web APIs?如何对响应式 Web API 进行压力测试?
【发布时间】:2021-07-17 08:33:31
【问题描述】:

我们已将我们的一项微服务从每线程请求模型(同步)迁移/重构为响应式(异步)。开发完成并开始对 reactive 服务进行压力测试。我们正在寻求有关如何为响应式 API 执行活动的帮助

我们做了什么?

我们的服务对外部服务进行 HTTP 调用。在我们的压力测试中,我们模拟了外部服务调用。我们没有进行网络调用,而是使用Thread.sleep() 方法引入延迟,并在我们的服务组件中返回模拟响应(我们在其中对外部服务进行实际的 HTTP 调用)。

通过这种方法,我们观察到我们的响应式服务正在崩溃,即使请求量非常小。补充一点,我们在测试其他同步服务(每个线程模型的请求)时遵循类似的方法。

接下来我们可以尝试什么?

【问题讨论】:

    标签: spring-webflux webclient project-reactor stress-testing spring-webclient


    【解决方案1】:

    为了让基础架构更接近实际环境,我建议运行单独的模拟服务器,最好在单独的机器上运行,这样它就不会从您的服务中窃取资源。

    您可以使用 wiremock 轻松完成 - 请参阅 running as standalone 页面。

    当您将wiremock 作为代理运行时,您可以记录和播放来自您的服务的真实请求。

    为了让这个模拟更真实,你可以add delay for mock responses - 它会模拟外部服务的“处理时间”。

    【讨论】:

    • 在压力测试中使用wiremock 和响应式客户端需要注意的一点——wiremock 在下面使用码头(每个请求线程)并且可能无法应对负载,特别是如果您添加一些复杂的逻辑或广泛使用手把模板(即使您使用wiremock 为它们提供缓存)。
    【解决方案2】:

    反应式服务有一个非常小的线程池,经过优化可以 100% 使用。

    如果你引入像Thread.sleep() 这样的阻塞,你基本上就是在移除这个能力。使反应式成为“反应式”的原因在于它能够在发生阻塞时切换执行线程。

    Thread.sleep() 将线程保持在原来的位置,它不能切换到做其他事情,基本上破坏了它的整个功能。

    你永远不应该在响应式应用程序中使用Thread.sleep(),除非你使用OnSubscribe 并将每个调用放在一个单独的调度程序上,这反过来会使你的响应式应用程序“非响应式”,而是回退到默认标准servlet 应用程序行为。

    【讨论】:

    • 是的,我同意使用 Thread.sleep() 将我们带回到阻塞模型。对于reactive apis,我们如何进行压力测试?标准方法是什么,或者我们有什么框架可以帮助我们?
    • 我已经回答了您为什么会看到性能不佳的原因。这是一个直接回答的直接问题。另一方面,你应该如何进行测试是固执己见的,有 1000 种不同的方法,没有直接的答案。
    猜你喜欢
    • 2021-01-18
    • 2011-04-20
    • 2015-02-22
    • 2020-06-28
    • 2010-12-13
    • 2010-09-17
    • 2012-02-28
    • 2011-01-17
    • 2012-06-16
    相关资源
    最近更新 更多