@andreychumak
junior

Как уменьшить время запросов?

Есть запрос к api, который выполняется очень долго (получаю инфу о складах, много инфы)

warehouses = codes.map do |code|
  data = Net::HTTP.get(URI.parse(URI.encode("http://endpoint.de?параметр=#{code}")))
  JSON.parse(data)
end

codes - содержит коды городов
data - вся инфа о конкретном складе в выбранном городе
warehouses - массив со складами в выбранном по codes городу

Для города, где таких складов 4, понятное дело, строится быстро. Но в Мск их 219 и строится может до 30 секунд.

В базе сохранять можно, как вариант.
Но я хотел бы узнать:
1) как и где еще можно хранить эти данные? чтобы сократить время запросов. Или все таки лучше в базе.
2) можно как-то оптимизировать код?

UPD: Логика такая
1) выбираю селектом город
2) код города отправляется в экшн
3) в экшне строю склады и их описание
4) отображаю на карте

Задача: получить большое кол-во складов быстро. В мск (219 складов) при этом запрос длится 30 секунд. в маленьком городе, где всего 4 склада, инфа по складам получается быстро.
  • Вопрос задан
  • 227 просмотров
Решения вопроса 1
Общее время запросов можно сократить если скачивать данные с источника асинхронно, при помощи Thread. Здесь есть примеры: ruby-doc.com/docs/ProgrammingRuby/html/tut_threads.html

Сохранять можно по-разному. Это зависит от постановки задачи, которая не указана.
Не могу подказать как оптимизировать код поскольку он не указан.

UPD
Если асинхронного скачивания недостаточно для оптимизации, то напрашивается другой способ:
вместо скачивания о складах каждый раз в экшене контроллера, особенно если их размер существеннен и сторонний API небыстро возвращает данные, лучше создать Rake task для периодического обновления данных о складах через определённый промужуток времени. Таким образом, контроллер будет брать заранее сохранённые данные из БД, экономя время на повторное скачивание данных.
Как именно сохранять данные определяется исходя из требуемой структуры данных.
Допустим, можно хранить данные в РСУБД так (если я верно понял задачу):
id | city_id (integer) | code (string/integer) | warehouse_data (text)

Помимо прочего, для часто повторяющихся запросов данные можно брать прямо с кеша. Статистику обращений можно получить путём анализа лога запросов.

Подытожив:
  1. создать Rake task, в которой нужно пройтись по всем возможным городам и кодам, сохраня данные в СУБД
  2. контроллер будет брать готовые данные с БД
  3. кешировать данные согласно параметрам запроса. Ну и, возможно, более продвинутая часть, чтобы было совсем как по науке: Википедия: Алгоритмы кэширования
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xpert13
@xpert13
Full Stack Developer
Кэшируйте у себя информацию, периодически обновляйте из API.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы