почему у моей пружины webflux vs spring mvc нагрузочный тест одинаковый? - PullRequest
0 голосов
/ 12 марта 2020

Мы сравниваем пропускную способность пружины webflux против пружины mvc для одного из наших проектов.

У нас есть сервис1 и сервис2. Сервис1 подготавливает контент и отправляет его на сервис2 с помощью веб-клиента. Код ниже от service1, который публикует контент на service2.

Примечание. Службе 2 требуется 500 мс для обработки одного запроса.

Spring Webflux

@PutMapping(path = "/")
public Mono<String> create() throws Exception {
    ClassPathResource classpathResource = new ClassPathResource("/file.zip");

    MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
    multipartBodyBuilder.part("key", "value");
    multipartBodyBuilder.part("file", classpathResource, MediaType.APPLICATION_OCTET_STREAM);
    MultiValueMap<String, HttpEntity<?>> multiValueMap = multipartBodyBuilder.build();

    return WebClient.create()
    .post()
    .uri(uri)
    .contentType(MediaType.MULTIPART_FORM_DATA)
    .headers(httpHeaders -> httpHeaders.setBearerAuth(token))
    .body(BodyInserters.fromMultipartData(multiValueMap))
    .retrieve()
    .bodyToMono(String.class);
}

Spring MVC

@PutMapping(path = "/")
public ResponseEntity<String> create() throws Exception {
    String response = null;
    ClassPathResource classpathResource = new ClassPathResource("/file.zip");

    try (InputStream zipInputStream = new BufferedInputStream(classpathResource.getInputStream())) {

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        headers.setBearerAuth(token);

        LinkedMultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
        ContentDisposition contentDisposition = ContentDisposition.builder("form-data").name("file").filename("file")
                .build();
        fileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
        fileMap.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
        HttpEntity<InputStreamResource> sipEntity = new HttpEntity<InputStreamResource>(
                new InputStreamResource(zipInputStream), fileMap);

        LinkedMultiValueMap<String, String> formatfileMap = new LinkedMultiValueMap<>();
        contentDisposition = ContentDisposition.builder("form-data").name("key")
                .build();
        formatfileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString());
        HttpEntity<String> formatEntity = new HttpEntity<String>("value", formatfileMap);

        LinkedMultiValueMap<String, Object> linkedMultiValueMap = new LinkedMultiValueMap<String, Object>();
        linkedMultiValueMap.add("file", sipEntity);
        linkedMultiValueMap.add("key", formatEntity);

        HttpEntity<LinkedMultiValueMap<String, Object>> request = new HttpEntity<LinkedMultiValueMap<String, Object>>(
                linkedMultiValueMap, headers);
        response = restTemplate.postForObject(ingestUrl, request, String.class);
    } 


    return new ResponseEntity<String>(response, HttpStatus.OK);
}

Мы провели нагрузочный тест с 200, 300, 500, 1000 одновременно работающих пользователей, используя jmeter. Во всех случаях мы получили одинаковую пропускную способность для обеих платформ. Мы что-то здесь не так делаем?

Я собрал статистику нагрузочного теста, используя Gatling для 1000 пользователей как для mvc, так и для реактивного.

Webflux - 1000 пользователей

Spring webflux с 1000 одновременных пользователей

MVC - 1000 пользователей

Spring MVC с 1000 одновременных пользователей

1 Ответ

2 голосов
/ 12 марта 2020

Я бы не сказал, что вы сделали что-то не так, скорее этот конкретный c вариант использования не подходит для жесткого сравнения. Обе конечные точки полагаются на первую загрузку чего-либо с диска и затем на выполнение HTTP-вызова.

Ограничивающий фактор здесь (я предполагаю) относится к обоим сетевым вызовам, который занимает одинаковое время для завершения sh, тем не менее вы используйте WebFlux или MVC.

. Преимущество, которое вы получаете от WebFlux, заключается в неблокирующем поведении, которое лучше масштабируется при меньшем количестве загруженных ресурсов.

На что-то подобное уже достаточно хорошо ответили Квора: https://www.quora.com/Does-Spring-WebFlux-perform-better-than-Spring-MVC

...