2016-11-18 4 views
0

Я внедряю REST API с использованием Spring Boot и @RestController с Java 8. Один из методов контроллера должен вызвать другую стороннюю службу REST API. Метод описан следующим образом (формат данных - JSON):Spring @RestController вызывает большое количество запросов

  1. Вызвать сторонний метод API для получения списка кандидатов (каждый кандидат представлен как объект с некоторой базовой информацией).
  2. Для каждого кандидата вызовите другой сторонний метод API, чтобы получить более подробную информацию о кандидате.
  3. Сбросить результаты, по существу «обогатив» все объекты-кандидаты с первого вызова.
  4. Верните список объектов-кандидатов-обогатителей.

Я планировал использовать @RestTemplate для всех приглашений на сторонний API. Я обеспокоен тем, что для большого числа кандидатов (скажем, 500-1000) это станет огромным узким местом производительности, которое будет блокироваться. Я не совсем уверен, что рекомендуемый подход для достижения наилучшей производительности. Как я могу масштабировать это, так что несколько пользователей могут одновременно обращаться к моему API?

ответ

4

Ваш вопрос очень широк, и я не думаю, что кто-то сможет предоставить вам подробный ответ, но:

  1. Ваше дело, кажется, как идеальный вариант использования для RxJava: поток кандидатов который преобразуется путем добавления дополнительной информации из других источников - все выполняется async.

  2. Я бы пропустил RestTemplate и пошел за Retrofit2 вместе со своей удивительной интеграцией RxJava. См. Это базовые tutorial1 и tutorial2.

  3. 1000 записей не так много, но это зависит от производительности нисходящих служб. Вам нужно будет проверить это для себя.

  4. Если вы хотите узнать больше о RxJava, то есть great docs online, а также new amazing book от Tomasz Nurkiewicz и Ben Christensen.

Удачи вам!

+0

Спасибо! Это очень освещающий пост; Я прочитаю учебники и узнаю о RxJava и Retrofit2. Может ли это вписаться в среду Spring Boot? Я наткнулся на этот [post] (https://spring.io/blog/2016/01/04/springone2gx-2015-replay-introducing-rxjava-into-a-spring-boot-rest-api), который, кажется, ручается для интеграции, но мне было интересно, есть ли у вас собственный опыт в этом отношении. –

+0

Да, конечно. Дооснащение можно легко использовать с Spring Boot. Вам просто нужно создать экземпляр OkHttp3-клиента, а затем использовать его для создания клиента Retrofit2 REST. Этот клиент должен быть Spring Bean - тогда его просто типичный Spring DI. Те tutorisls покрывают это хорошо. –

0

Ваш сервер приложений будет управлять пулом потоков, поэтому многие запросы могут одновременно ударить по вашей конечной точке. Если ваш пул потоков не имеет размер 1, несколько клиентов смогут одновременно использовать ваш API.

Смотрите здесь для дальнейшего объяснения: Spring MVC Rest Services - Number of Threads (Controller Instances)

Смотрите здесь как пример того, как настроить размер пула потоков: Maximum (client request) thread pool size in spring

В целях повышения производительности при выполнении запросов к внешним службам, я хотел бы видеть если вы можете выполнять пакетные запросы (сразу несколько кандидатов), чтобы уменьшить общее количество выполненных запросов.

+0

Я не могу выполнять пакетные запросы, потому что внешние службы не поддерживают сразу несколько кандидатов :-(Но я обязательно буду изучать оптимизацию размера пула потоков и выполнение некоторых тестов производительности. Мне нужно иметь некоторые цифры в ближайшее время. –

1

Рафал уже дал отличный ответ. Я хотел бы добавить свои 2 цента. Ваше дело кажется идеальным вариантом для неблокирования. RxJava - это всего лишь одна реализация неблокирующего реактивного программирования.Вы можете добиться того же самого, используя другой другой стек технологий, а также - как akka или весенний ботинок с netty или swow.

Это пример того, как мы можем делать реактивное программирование с пружинным ботинком. https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1 имейте в виду, что он все еще находится в экспериментальном состоянии. Reactive streams будет встроен в Java 9

+0

Спасибо за ручаюсь за первый ответ, а также указывая мне в сторону весеннего ботинка, который я уже использую. Много приятного чтения в эти выходные. –