ekonda / kutana

The library for developing systems for messengers and social networks
MIT License
72 stars 17 forks source link

Webhook support #54

Closed sasha00123 closed 4 years ago

sasha00123 commented 4 years ago

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.

michaelkryukov commented 4 years ago

Хей. Действительно, 'Callback API' является хорошим (наверное, даже единственным) вариантом. Но только для бесплатных вариантов хостинга вроде heroku или pythonanywhere. Если же в твоём распоряжении появляется сервер - скорее всего 'Long Poll API' будет работать как минимум не хуже. Я знаю как минимум jino, который позволяет без нервов создать себе сервер за 99р/мес. Который будет работать без превышения каких-либо лимитов.

Так или иначе, идея интересная. Мне кажется, для этого оптимальнее всего выделить из backends.vkontakte общую логику для 'Long Poll' и 'Callback', и создать два подкласса, которые будут реализовывать получение событий через 'Long Poll' или 'Callback' - 'VkontakteLongPoll' и 'VkontakteCallback', ну и для обратной совместимости сделать 'Vkontakte' == 'VkontakteCallback'.

Не знаю, когда мои руки могут добраться до этого. Если хочешь - можешь попробовать реализовать эту логику 👌

sasha00123 commented 4 years ago

Это полезная фича в том числе и для Pay-as-you-use модели на том же Jelastic.

Также это может позволить проще реализовать горизонтальное масштабирование.

michaelkryukov commented 4 years ago

Не уверен на счёт горизонтального масштабирования - LongPoll гораздо предпочтительнее для крупных проектов. Там все события группируются сервером Вконтакте перед отправкой, да и бот может запрашивать события по мере освобождения своих ресурсов. С Callback все запросы наваливаются неконтролируемой кучей + необработанные запросы отправляются по несколько раз.

Даже с longpoll никто не мешает быстро получать события на одном сервере и складывать их, например, в redis, чтобы другие сервера или процессы обрабатывали их. Это звучит как достаточно простая схема. Но подавляющее число проектов не будет нуждаться в подобных мерах. Как минимум из-за относительно небольшого лимита на количество запросов к API Вконтакте.

Поэтому юзкейсы для использования Callback - это скорее проекты на бесплатных хостингах, как мне кажется. Да и будет ли разница между Callback и Longpoll для Pay-as-you-use тарифов?