Spring REST-сервис медленнее реагирует на нелокальный вызов
У меня есть следующий контроллер REST, который получает двоичные данные, декодирует их с помощью декодера AVRO и выполняет некоторые операции, возвращая строку
@RestController
public class MyRestController {
GenericDatumReader reader;
private static final Logger logger = LoggerFactory.getLogger(MyRestController.class);
public MyRestController() throws IOException {
String fullSchema = new String(Files.readAllBytes(Paths.get("full.avsc")), StandardCharsets.UTF_8);
String readerSchema = new String(Files.readAllBytes(Paths.get("reader.avsc")), StandardCharsets.UTF_8);
reader = new GenericDatumReader(new Schema.Parser().parse(fullSchema));
reader.setExpected((new Schema.Parser().parse(readerSchema)));
}
@RequestMapping(method = RequestMethod.POST,
value = "/calculate")
public String calculate( HttpServletRequest requestEntity) throws IOException {
long init = System.currentTimeMillis();
BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(IOUtils.toByteArray(requestEntity.getInputStream()), null);
String input = reader.read(null, decoder).toString();
String output = doSomeProcess(input);
long end = System.currentTimeMillis();
logger.info("time: " + (end- init));
return output;
}
}
Как вы можете видеть, я печатаю миллисекунды в конце процесса перед возвратом вывода. Когда я вызываю это с того же компьютера, на котором я запускаю службу REST, он печатает 20 мс, однако, когда я выполняю вызов с моего локального компьютера (используя те же двоичные данные), он печатает около 200 мс. Я думаю, что независимо от того, где я это называю, время должно быть одинаковым. Результаты, по-видимому, совпадают при многократном тестировании, всегда, когда я звоню с моего ноутбука, примерно в 10 раз больше. У меня есть следующие вопросы
- это поведение ожидает, учитывая, как я измеряю время? почему это происходит?
- Как я могу улучшить это, чтобы измерить это должным образом? Я хотел бы избежать измерения сетевых издержек вызова
- Может ли это быть связано с типом объекта, который я использую в качестве параметра для вызова rest? Я пытался с помощью
MultipartFile
но это кажется намного медленнее