Ограничение реактивного веб-клиента Spring - PullRequest
0 голосов
/ 17 октября 2019

У меня есть приложение, которое читает пару миллионов документов из базы данных MongoDB, используя Flux. Затем для обработки каждого документа вызывается другая служба, которая довольно медленная, потому что ей нужно прочитать кучу файлов с диска.

Проблема в том, что по умолчанию WebClient будет выполнять много (что-то вроде 60?)просит все сразу. Очевидно, что некоторые из этих запросов не будут выполнены (либо потому, что сеть переполнена, либо диск слишком медленный). Я хочу избежать этого и ограничить число параллельных запросов примерно до 20-30.

Как я могу это сделать?

На данный момент я делаю это:

documentEntityFactory.getDocumentEntity(DocumentStatus.DOWNLOADED)
    .flatMap(this::buildDocument)
    .flatMap(this::processDocument)
    .subscribe();

Я попытался добавить .limitRate(10) вызов к Flux, но ничего не произошло.

Поскольку это проект с открытым исходным кодом, весь код находится в свободном доступе. Обработка начинается прямо здесь:

https://github.com/bottomless-archive-project/library-of-alexandria/blob/7eb63888cef41852086b143c9a6bbe7f9c6cfe83/loa-application/loa-indexer-application/src/main/java/com/github/loa/indexer/command/IndexerCommand.java#L36

Звонки WebClient находятся здесь:

https://github.com/bottomless-archive-project/library-of-alexandria/blob/7eb63888cef41852086b143c9a6bbe7f9c6cfe83/loa-service/loa-vault-client-service/src/main/java/com/github/loa/vault/client/service/VaultClientService.java#L42

...