У меня есть приложение, которое читает пару миллионов документов из базы данных 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