Как ускорить хранимую процедуру (execute) с большим числом запросов к VK API?
У меня в моём приложении, что бы не попасть в лимит по количеству запросов, используются хранимые процедуры (метод execute). Но, при тестировании, обнаружил, что некоторые запросы к API могут выполняться несколько секунд, из-за чего тормозится вся работа в целом (немного дольше, чем бы этого хотелось).
Пример типичной процедуры:
return {
"friends": API.friends.get({...}),
"groups": API.groups.get({...}),
"messages": API.messages.get({...})
// В среднем 10 запросов в таких процедурах
}
Может есть какая-то возможность ускорить всё это? И, желательно, оставить всё так же, в execute.
Ответы (1 шт):
Да, такая возможность есть. VK добавили возможность многопоточности в запросах execute. И делается это очень легко:
var res1 = fork(API.friends.get({...}));
var res2 = fork(API.groups.get({...}));
var res3 = fork(API.messages.get({...}));
return {
"friends": wait(res1),
"groups": wait(res2),
"messages": wait(res3)
}
Как это работает?
При создании такого fork() моментально возвращается fork_id (число), по порядку, начиная с 1. wait() уже принимает число и возвращает ответ от VK API. Если передать несуществующий fork_id будет соответствующая ошибка. Всего fork() может повторяться 25 раз (затем ошибка), поэтому не получится сделать запросов свыше ограничений.
Правда работает быстрее?
Коротко: да, в некоторых ситуациях: в разы быстрее.
Синтетический пример: (медленный запрос взят из другого вопроса).
var a = API.podcasts.searchPodcast({"search_string":"a"});
var b = API.podcasts.searchPodcast({"search_string":"б"});
var c = API.podcasts.searchPodcast({"search_string":"в"});
return [a, b, c];
3 разных запроса выполняются ~14 секунд.
var a = fork(API.podcasts.searchPodcast({"search_string":"a"}));
var b = fork(API.podcasts.searchPodcast({"search_string":"б"}));
var c = fork(API.podcasts.searchPodcast({"search_string":"в"}));
return [wait(a), wait(b), wait(c)];
3 таких же запросов выполняются ~5 секунд. Существенная разница!
Почему в документации ничего об этом не сказано?
В последнее время документация в принципе редко обновляется. Публичная версия 5.131 стоит пару лет, когда офф. приложения VK используют 5.200 и выше. Эту особенность я нашёл сам, она используется в некоторых запросах в web версии клиента VK. Возможно это какая-то внутренняя особенность. Я считаю, что документацию просто не обновили, так как это работает для всех приложений / токенов.