В нашем приложении мы хотим найти узкое место, из-за которого проседает производительность. На 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 мс на один запрос. Как можно повысить произвоительность?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Делаю мапинг JSON в иерархию объектовЕсть поле типа класса, которое в JSON может быть null