Масштабная пружина WebFlux с настраиваемым ReactiveMongo - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю отправленную сервером конечную точку событий, которая будет поддерживать открытые соединения в течение длительного периода (1 час +), непрерывно отправляя события в режиме реального времени. Я использую реактивный Mon go, чтобы делиться всеми обновлениями БД между всеми экземплярами приложения. Насколько я вижу в каждом HTTP-запросе, новое соединение Mon go открыто. Это невозможно реализовать, поскольку пул соединений с БД ограничен. Использование значений по умолчанию начинает приводить к sh при 500 запросах http (500 открытых подключений http SSE => 500 подключений к БД).

Как сделать это масштабируемым, чтобы обрабатывать 50000+ одновременных запросов http на экземпляр с использованием запроса Tailable ? Странно, я ничего не нашел в Интернете по этому вопросу. Есть ли какая-либо функция, встроенная в драйвер java mon go для совместного использования запросов по одному соединению?

Проще говоря, это код, с которым я тестирую: простая конечная точка GET, которая возвращает поток записей из запрос Tailable MongoDB:

//controller endpoint
@GetMapping(value = "location/{id}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)    
Flux<Location> getLocationById(@PathVariable String id) {
    return locationsRepository.findById(id)
}

и

//repository
@Repository
public interface LocationsRepository extends ReactiveCrudRepository<Location,String> {
    @Tailable
    Flux<Location> findById(String id);
}

Пн go имеет конфигурации по умолчанию и, конечно, location - это индексированная ограниченная коллекция.

...