I have a simple program which is keep reading the same key from the redis (installed on my machine). My main goal was to compare the virtual thread and WebFlux. I found that WebFlux which is using Lettuce gives issue as I increase the load (using Artillery).
<code>{
"min": 4,
"max": 1241,
"count": 735,
"mean": 505.9,
"p50": 518.1,
"median": 518.1,
"p75": 820.7,
"p90": 1064.4,
"p95": 1153.1,
"p99": 1224.4,
"p999": 1249.1
}
</code>
<code>{
"min": 4,
"max": 1241,
"count": 735,
"mean": 505.9,
"p50": 518.1,
"median": 518.1,
"p75": 820.7,
"p90": 1064.4,
"p95": 1153.1,
"p99": 1224.4,
"p999": 1249.1
}
</code>
{
"min": 4,
"max": 1241,
"count": 735,
"mean": 505.9,
"p50": 518.1,
"median": 518.1,
"p75": 820.7,
"p90": 1064.4,
"p95": 1153.1,
"p99": 1224.4,
"p999": 1249.1
}
while the VT (using Spring MVC) takes few milliseconds (as expected) to complete the load. It looks like something is blocking/queuing up here. My code looks pretty simple as shown below
<code>@GetMapping(value = "/{testName}", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<Test> getTest(@PathVariable String testName) {
return testService.getCachedTest(testName)
.log();
}
</code>
<code>@GetMapping(value = "/{testName}", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<Test> getTest(@PathVariable String testName) {
return testService.getCachedTest(testName)
.log();
}
</code>
@GetMapping(value = "/{testName}", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<Test> getTest(@PathVariable String testName) {
return testService.getCachedTest(testName)
.log();
}
The RedisConfig looks like below
<code>@Configuration
</code>
<code>@Configuration
</code>
@Configuration
public class RedisConfig {
<code>@Bean
public ReactiveRedisOperations<String, Test> redisOperations(ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
Jackson2JsonRedisSerializer<Test> serializer = new Jackson2JsonRedisSerializer<>(Test.class);
RedisSerializationContext.RedisSerializationContextBuilder<String, Test> builder =
RedisSerializationContext.newSerializationContext(new Jackson2JsonRedisSerializer<>(Test.class));
RedisSerializationContext<String, Test> context =
builder
.key(new StringRedisSerializer())
.value(serializer)
.build();
return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, context);
}
</code>
<code>@Bean
public ReactiveRedisOperations<String, Test> redisOperations(ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
Jackson2JsonRedisSerializer<Test> serializer = new Jackson2JsonRedisSerializer<>(Test.class);
RedisSerializationContext.RedisSerializationContextBuilder<String, Test> builder =
RedisSerializationContext.newSerializationContext(new Jackson2JsonRedisSerializer<>(Test.class));
RedisSerializationContext<String, Test> context =
builder
.key(new StringRedisSerializer())
.value(serializer)
.build();
return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, context);
}
</code>
@Bean
public ReactiveRedisOperations<String, Test> redisOperations(ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
Jackson2JsonRedisSerializer<Test> serializer = new Jackson2JsonRedisSerializer<>(Test.class);
RedisSerializationContext.RedisSerializationContextBuilder<String, Test> builder =
RedisSerializationContext.newSerializationContext(new Jackson2JsonRedisSerializer<>(Test.class));
RedisSerializationContext<String, Test> context =
builder
.key(new StringRedisSerializer())
.value(serializer)
.build();
return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, context);
}
}
Can anyone please help to justify the delay (taking more than 1sec for 735 counts)?