Я написал микросервис Spring Boot, используя RxJava (агрегированный сервис) для реализации следующего упрощенного варианта использования. В целом, когда преподаватель загружает документ с содержанием курса, необходимо создать и сохранить набор вопросов.
- Пользователь загружает документ в систему.
- Система вызывает службу документов для преобразования документа в текст.
- Затем он вызывает другую службу генерации вопросов для создания набора вопросов с учетом приведенного выше текстового содержимого.
- Наконец, эти вопросы публикуются в базовом микросервисе CRUD для сохранения.
Когда пользователь загружает документ, из него создается множество вопросов (может быть сотни или около того). Проблема здесь в том, что я публикую вопросы по одному последовательно, чтобы служба CRUD могла их сохранить. Это резко замедляет работу из-за интенсивных сетевых вызовов ввода-вывода, поэтому для завершения всего процесса требуется около 20 секунд. Вот текущий код, если все вопросы сформулированы.
questions.flatMapIterable(list -> list).flatMap(q -> createQuestion(q)).toList();
private Observable<QuestionDTO> createQuestion(QuestionDTO question) {
return Observable.<QuestionDTO> create(sub -> {
QuestionDTO questionCreated = restTemplate.postForEntity(QUESTIONSERVICE_API,
new org.springframework.http.HttpEntity<QuestionDTO>(question), QuestionDTO.class).getBody();
sub.onNext(questionCreated);
sub.onCompleted();
}).doOnNext(s -> log.debug("Question was created successfully."))
.doOnError(e -> log.error("An ERROR occurred while creating a question: " + e.getMessage()));
}
Теперь мое требование — размещать все вопросы параллельно в сервисе CRUD и объединять результаты по завершению. Также обратите внимание, что служба CRUD будет принимать только один объект вопроса за раз, и это нельзя изменить. Я знаю, что могу использовать для этой цели оператор Observable.zip
, но понятия не имею, как его применять в этом контексте, поскольку фактическое количество вопросов заранее не определено. Как изменить код в строке 1, чтобы повысить производительность приложения. Любая помощь приветствуется.