Closed sasha00123 closed 4 years ago
Хей. Действительно, 'Callback API' является хорошим (наверное, даже единственным) вариантом. Но только для бесплатных вариантов хостинга вроде heroku или pythonanywhere. Если же в твоём распоряжении появляется сервер - скорее всего 'Long Poll API' будет работать как минимум не хуже. Я знаю как минимум jino, который позволяет без нервов создать себе сервер за 99р/мес. Который будет работать без превышения каких-либо лимитов.
Так или иначе, идея интересная. Мне кажется, для этого оптимальнее всего выделить из backends.vkontakte общую логику для 'Long Poll' и 'Callback', и создать два подкласса, которые будут реализовывать получение событий через 'Long Poll' или 'Callback' - 'VkontakteLongPoll' и 'VkontakteCallback', ну и для обратной совместимости сделать 'Vkontakte' == 'VkontakteCallback'.
Не знаю, когда мои руки могут добраться до этого. Если хочешь - можешь попробовать реализовать эту логику 👌
Это полезная фича в том числе и для Pay-as-you-use модели на том же Jelastic.
Также это может позволить проще реализовать горизонтальное масштабирование.
Не уверен на счёт горизонтального масштабирования - LongPoll гораздо предпочтительнее для крупных проектов. Там все события группируются сервером Вконтакте перед отправкой, да и бот может запрашивать события по мере освобождения своих ресурсов. С Callback все запросы наваливаются неконтролируемой кучей + необработанные запросы отправляются по несколько раз.
Даже с longpoll никто не мешает быстро получать события на одном сервере и складывать их, например, в redis, чтобы другие сервера или процессы обрабатывали их. Это звучит как достаточно простая схема. Но подавляющее число проектов не будет нуждаться в подобных мерах. Как минимум из-за относительно небольшого лимита на количество запросов к API Вконтакте.
Поэтому юзкейсы для использования Callback - это скорее проекты на бесплатных хостингах, как мне кажется. Да и будет ли разница между Callback и Longpoll для Pay-as-you-use тарифов?
Expected Behavior
app.run(webhook=True)
or
Vkontakte(webhook=True)
Actual Behavior
Webhooks save a lot of resources, and it would also be possible to deploy bots to services like Heroku.
Possible Solution
We could make an aiohttp server to serve webhooks.
I can implement it, but I need your approval and any suggestions on how it could be implemented better.
Context
Both Telegram and Vkontakte, as well as most popular messengers, support WebHooks.
I guess it could be easily done with aiohttp.
I'm okay with both English and Russian.