Найти тему
Seofuck.ru

Yandex Message Queue и Yandex Cloud Functions

Хотел кейсом суровым поделиться и чуток про Yandex Message Queue и Yandex Cloud Functions

Запасайтесь пивом и терпением
Запасайтесь пивом и терпением

.

Делал бота для Вконтакте. Наткнулся на ограничения по количеству запросов.

Оказывается, ВК ограничивает обращения к АПИ не только по частоте (не более 3 в секунду), но и по количеству в час (точных цифр не дают "по понятным причинам"). Если честно, я нихрена не понимаю эти понятные причины. Если вы даёте инструмент, объясните, блин, условия.

В общем, по хорошему, мне надо было выстраивать обращения к АПИ в очередь и отправлять, скажем, не более 2 раз в секунду. В случае с php это должен быть какой то cron, таблица состояний сообщений а это дополнительная неслабая нагрузка на сервер. При нагрузках свыше несколько запросов с секунду я уже начинаю нервничать и искать способы оптимизировать.

Оказывается яндекс предоставляет для таких вещей отдельный сервис: Очереди.

Фактически это url в который можно кидать json сообщения, читать их и удалять. То же самое реализовано в Amazon AWS, называется Amazon SQS.

Отдельно, есть сервис яндекса Cloud Functions - это когда твой код работает в облаке, но это функция, у неё есть параметры и есть возвращаемое значение. Вызывать её можно с помощью https запроса, с любого клиента. Таки да, у амазона такое тоже есть, называется Amazon lambda.

Так вот - cloud function может вызываться автоматически, как только в очередь поступит сообщение. А может вызываться запросом извне.

В моём случае узкое место - запросы в АПИ ВК, не чаще 2 раз в секунду.

Всё что мне нужно было сделать (если бы я знал об этом пару недель назад) - это накидывать сообщения в очередь сколько угодно, сделать cloud function которая читала бы сообщения и отправляла их в ВК. Дальше всё что надо - вызывать эту функцию например раз в полсекунды кроном. И всё. Я решил бы проблему производительности и решил бы проблему бутылочного горлышка АПИ ВК.

Кстати, скоро в cloud functions появится свой управляемый cron, вообще красота.

Сообщения в очереди хранятся 14 дней, уж как нибудь за 14 дней я бы протолкнул все сообщения.

Прелесть в том, что и очереди и функции хостятся не на моей машине и нагрузку всю берёт на себя яндекс а цена 30 рублей за 1 миллион запросов к очереди. 

Цена Яндекс Функций считается чуть сложнее: за 1 миллион обращений к яндекс функциям + стоимость жизни функции в памяти - ГБ/час. 10р за 1млн обращений и 3,42р. за 1гб/час. То есть 1млн вызовов, длительностью по 800мс каждый, обойдётся в 960р, при условии что при каждом вызове функции выделяется 128мб ОЗУ.

Весь SDK амазона подходит к сервисам яндекса (респект продактам яндекса).

У амазона примерно такие же цены, но лично я просто в ужасе от их UX.