Как сохранить результат 200+ потоков в БД?

Есть приложение, задача которого - сделать поиск по запросу пользователя. Порядок действий примерно следующий: запрос пользователя -> запрос к различным API -> получение результатов от API -> сохранение в БД -> обработка данных -> ответ пользователю. Работать такой поиск должен быстро (в пределах 15-20 сек).
На один запрос пользователя предполагается сделать 200+ запросов к API с различными параметрами.
Сейчас для поиска создаются 200 потоков, которые выполняют запросы к API и пишут в базу. Проблема в том, что такое решение выглядит очень ограниченно - если прийдет еще один пользователь и сделает поиск, будет создано еще 200+ потоков и время ответа существенно снизится.
Смотрю в сторону использования Sidekiq, RabbitMQ, чтобы была возможность добавлять поисковые сервера и распараллеливания поиска (например, каждый сервер выполняет запросы с разными параметрами), но терзают сомнения - как быть с MySQL? Не будет ли проблемы с max_connections, если несколько серверов будут писать в одну базу? Какие еще решения можно рассмотреть, чтобы была возможность распараллеливания поиска, и по окончанию работы всех получить событие "поиск закончен", чтобы обработать данные?
Приложение - Rails, БД - MySQL.
  • Вопрос задан
  • 2403 просмотра
Решения вопроса 1
begemot_sun
@begemot_sun
Программист в душе.
Самое универсальное решение - это конечно очередь заданий. Не увлекайтесь созданием коннектов к БД. Лучше иметь немного коннектов, но которые работают быстро, чем кучу - но которые работают медленно.

На крайняк, всегда можно написать решение (аля на Erlang), которое будет брать работу по распараллеливанию на себя, вам нужно лишь будет вызвать нужный http-api такого сервера и получить ответ.

Чтобы БД работала быстро, можно поставить кучу mysql slave серверов, и обращаться также к ним. Писать конечно получится только на один. А вообще все зависит от вашей задачи. У вас скупое описание того, что вы хотите делать и для чего.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romamo
Архитектура. Highload. Data mining
RabbitMQ:
1. воркер-менеджер для генерации/контроля выполнения заданий
2. постоянные воркеры для внешних запросов
3. воркер для записи данных в БД
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы