Повышение производительности REST API на спринге хайлоад

198
07 мая 2019, 03:00

В нашем приложении мы хотим найти узкое место, из-за которого проседает производительность. На REST API периодически выгружается огромная очередь пакетов, которые сервис не успевает обрабатывать. Из-за этого очередь пакетов достигает 40000.

Так написан основной контроллер сервиса:

@RestController
@RequestMapping("/api")
public class InvoiceController {
private static final Logger logger = LoggerFactory.getLogger(InvoiceController.class);
@Autowired
private ObjectMapper mapper;
@Autowired
private InvoiceService invoiceService;
@Autowired
private TestInvoiceService service;
@RequestMapping(value = "/invoice", method = RequestMethod.POST)
public Callable<Object> add(@RequestBody String json) {
    Callable<Object> asyncTask = () -> {
        long start = System.currentTimeMillis();
        try {
            InvoiceRequest invoice = mapper.readValue(json, InvoiceRequest.class);
            Object o = invoiceService.processInvoice(invoice);
            long end = System.currentTimeMillis();
            System.out.println("Diff in controller: " + (end - start));
            System.out.println(Thread.currentThread().getName());
            return o;
        }
        catch (Exception e) {
            logger.error(e.getMessage(), e);
            logger.error("Exception in InvoiceController while processing JSON. JSON dumped:");
            logger.error(json);
            return new ResponseEntity<>("Cant map JSON to object hierarchy", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    };
    return asyncTask;
}

}

Данные сохраняются в БД. Сохранение занимает 40 мс. Если запись в базу не требуется, то один запрос выполняется 5-7 мс. При выгрузке данных на сервис в четыре потока производительность инсертов 30-50 мс. При выгрузке в 30 потоков (это рабочая мощность клиента) производительность падает до 400 мс на один запрос. Как можно повысить произвоительность?

READ ALSO
Выбор нужного testNG.xml в jenkins

Выбор нужного testNG.xml в jenkins

Имеется проект (Java + Maven + TestNG)Создана job в jenkins

196
Как в Intelij Idea сделать set JAVA_OPTS

Как в Intelij Idea сделать set JAVA_OPTS

у меня при запуске выдается сообщение

139
Игнорировать null при десериализации JSON

Игнорировать null при десериализации JSON

Делаю мапинг JSON в иерархию объектовЕсть поле типа класса, которое в JSON может быть null

183