我如何配置Micronaut以使用Reactor获得更好的性能

时间:2019-06-03 18:28:09

标签: netty micronaut

我定义了两个HTTP GET API / test-mono和/ test-no-mono,除了/ test-mono使用Mono返回类型外,它们完全相同。 HelloControllerSpec使用100的线程池对这两个API进行了1000次测试,/ test-no-mono需要45秒,而/ test-mono需要4分钟以上,为什么?看起来在/ test-no-mono的默认并发配置中比/ test-mono更好。

完整代码位于https://github.com/soumitrak/micronaut-server

@Controller("/")
class HelloController {

    @Get("test-mono/{id}", produces = arrayOf(MediaType.APPLICATION_JSON))
    fun test_mono(id: String): Mono<String> {
        Thread.sleep(4000)
        return Mono.just("Hello World! $id")
    }

    @Get("test-no-mono/{id}", produces = arrayOf(MediaType.APPLICATION_JSON))
    fun test_no_mono(id: String): String {
        Thread.sleep(4000)
        return "Hello World! $id"
    }
}

$ ./gradlew干净测试

  

任务:test

sk.test.server.HelloControllerSpec STANDARD_OUT

09:37:32.473 [Test worker] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [test]

sk.test.server.HelloControllerSpec>使用Mono STANDARD_OUT

09:37:34.262 [Test worker] INFO  sk.test.server.HelloControllerSpec - Tests using mono
09:41:46.972 [Test worker] INFO  sk.test.server.HelloControllerSpec - Done tests using mono

测试运行时间超过4分钟

sk.test.server.HelloControllerSpec>不具有Mono STANDARD_OUT

09:41:46.975 [Test worker] INFO  sk.test.server.HelloControllerSpec - Tests without mono
09:42:27.216 [Test worker] INFO  sk.test.server.HelloControllerSpec - Done tests without mono

在45秒内进行相同的测试。

“ / test-mono”运行缓慢的原因是什么?如何改善此API的性能?

1 个答案:

答案 0 :(得分:0)

您的测试方案是不现实的。您永远不应阻塞事件循环,这是调用Thread.sleep时正在执行的操作。阻塞代码的性能更好,因为它具有更多线程。在现实情况下,添加更多线程并不是获得更好性能的答案。