Главное Авторские колонки Вакансии Образование
arrow-right Created with Sketch. Nikita Kolmogorov 3 843 17 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Личный опыт: Что делать, когда пользователей больше 750 000

Так получилось, что мой Voicy бот в Telegram сегодня перескочил важный психологический барьер в 270 000 установок в чаты, а общее количество людей в этих чатах перепрыгнуло за 750 000. Как полагается, дело не обошлось без проблем — были скачки до 50 000 новых чатов в сутки, что заставило меня оптимизировать код и работать с гигантским количеством вопросов. Как я с этим разобрался — об этом и статья. Приятного чтения!
Мнение автора может не совпадать с мнением редакции

Сразу же хочу оговориться: количество людей я считал в активных чатах (читать: в чатах, из которых Voicy не удалили). Помимо статистики по пользователям, можно еще упомянуть, что @voicybot за последние три месяца успешно перевел в текст более 10 000 000 секунд речи — это мой первый собственный проект, который разошелся таким тиражом.

Поехали!

Какие проблемы были на сервере?

Так как я считаю своим основным профилем iOS разработку, я сразу написал небольшой widget для локскрина под айфончик, который выдает статистику за последние 24 часа по количеству обработанных аудио файлов в час, общему количеству чатов в системе и общему количеству обработанных голосовых сообщений. Этот виджет позволяет мне одним махом оценить несколько показателей:

  • Насколько активно люди использовали @voicybot за последние сутки
  • Были ли какие-то сбои в работе бота (если нет войсов за определенный час — бот лежит)
  • Насколько много чатов добавилось в систему с последнего раза, когда я смотрел на виджет

К сожалению, большая часть пользователей бота живет со мной в другом часовом поясе — в восточном полушарии. Поэтому иногда, просыпаясь, я видел по 5-6 часов простоя да 10-15 диалогов с незнакомцами в Telegram, оповещающими меня о том, что бот почему-то не работает. Естественно, такие дни у меня начинались с паники и попыток поднять сервис (благо, всегда удачно). Решил проблему с падением войси рефакторингом некоторых частей кода, правки сообщений об ошибках и настройкой перезапуска серверного приложения после крэша.

Другая проблема — это скорость работы бота. Иногда я просыпался, смотрел на статистику и видел, что все отлично. Но в личке оказывалось несколько диалогов о том, что Войси отвечал по 1-2 минуты на голосовое сообщение — непорядок! Здесь меня, к сожалению, немного подвела архитектура используемой базы данных — MongoDB. Оказалось, что на недостаточно мощной серверной машине, 500 000 запросов в сутки на поиск по базе из 1 500 000 записей могут занять заметное время.

По-началу, я, испугавшись, просто увеличил ресурсов на сервере в 4 раза — что сильно сказалось на моем кошельке (работа Войси стала реально дорогой). После, я начал копать глубже, заметил пару-тройку неправильных подходов в работе бота и, потратив пару дополнительных часов на разработку, снизил нагрузку на базу данных в шесть раз. После, я пробовал уменьшать размер ресурсов сервера таким образом, чтобы получить оптимальный ценник с максимально быстрым ответом бота. Работа бота теперь не давит на мой кошелек — победа! 2-3 запроса на обработку голосовых сообщений в секунду теперь нагружают систему только на 30% — оставил запас.

Еще один момент всплыл, когда я открыл статистику пользователям на официальном сайте бота. Судя по графику на GitHub, на этот сайт заходило 10-15 человек в сутки — наврятли статистика им была настолько нужна. Однако в связи с недостаточно оптимизированным выводом статистики, ее вызов мог ненадолго всецело нагружать базу данных.

В последствии, какие-то умные граждане далеких государств начали дико DDoS'ить и обузить вывод статистики, что начало сказываться на работе всего бота. Что поделаешь — я закрыл доступ публике к статистике (все равно на нее никто не смотрел), а серверный код поправил, добавил кеширование. Таким образом, можно сказать, я спас сервис от недоброжелателей.

Какие вопросы люди задавали в личке?

Стоит заметить, что примерно 200 000 чатов из общего количества — жители Ирана; настолько у них популярен Telegram. Поэтому чаще всего в личку мне сначала прилетали вопросы на Фарси. К сожалению, Персидского я не знаю, поэтому поставил себе бота-переводчика и форвардил к нему все сообщения, которые не мог прочесть — он же, в свою очередь, радовал меня хоть и местами корявым, но понятным мне английским.

Следующее, что я делал — это уведомлял собеседника о том, что умею говорить только по-английски. Я так понял, говорить о собственной русскоязычности было излишне — навряд ли это могло как-то помочь. Так как Telegram позволяет кому угодно написать мне сообщение, имея мой username, чатов было много. Что поделаешь — отвечал всем.

Интересная особенность жителей Ирана — они очень любят посылать эмодзи с розой. Каюсь, мало что знаю о их культуре, но, полагаю, роза — это символ благодарности. Так же, не повторяйте моей ошибки: в описании бота я указал свой username, как создателя. Почему-то после этого пользователи начали отсылать голосовые сообщения на разных языках мне, а не Войси. Удалив ссылку на себя, я решил эту проблему. Оставил свои контакты только в help команде бота.

Помимо всего прочего, ботом активно пользуются в Иране, Бразилии, Германии, Китае, России и некоторых других странах. Мне пришлось прикрутить локализацию к боту на английский, русский, испанский, китайский, персидский, арабский, немецкий и два диалекта португальского.

Какие проблемы возникали с оплатой?

Войси изначально бесплатный бот, так как использует бесплатный сервис wit.ai для распознавания речи. К сожалению, у этого провайдера есть ограничения — когда у Google Speech их нет. Однако Google Speech совсем не бесплатный, и мне пришлось добавить возможность покупать секунды Google Speech для чатов. Систему оплаты я прикрутил от Stripe.

Спустя пару месяцев работы бота, мне написал житель Ирана, чем сообщил, что иранские банковские карты не принимаются в Stripe. Покопав глубже, я обнаружил, что Иран-то под санкциями, и вообще никто не может принимать их платежи! Естественно, я попробовал найти какую-то альтернативу. А то, как это так? 200 000 пользователей и не могут платить за сервис?

Я начал гуглить и нашел три разных платежных шлюза, работающих с Ираном. К сожалению, ни у одного из них не было нормальной английской версии сайта — да еще и контактов не было! Мол, приходи к нам в офис или позвони — там все и решим. Но я-то в Канаде! Какой офис? Но я-то не знаю Фарси! Какой телефонный звонок?

В итоге, я связался с одним из сервисов в Instagram, а с двумя другими по email. Естественно, писал я все по-английски. Сервис, с которым я связался в Instagram, в итоге, поделился со мной контактами англоязычного работника. Из трех сервисов, которым я написал по электронной почте, мне ответили только два спустя 2 и 3 недели соответственно. К сожалению, никто из них до этого не работал со Stripe, и мне пришлось как-то на пальцах объяснять, что же мне нужно.

В итоге, увидев официальное подтверждение от Павла Дурова о грядущем введении оплаты внутри Telegram и пообщавшись с официальной техподдержкой разработчиков ботов, я решил бросить эту затею и дождаться нативного решения. Сейчас бот приносит стабильно $100-$150 в месяц от людей, которые профессионально пользуются Voicy. Например, есть одна сеть магазинов в России, у которой весь менеджмент клиентов настроен в Telegram. Вместо часового прослушивания звонков клиентов, они теперь могут удобно видеть транскрипции разговоров.

Какие проблемы возникли со speech-to-text провайдерами?

@voicybot использует три движка распознавания речи на выбор: либо wit.ai (бесплатный, с множеством языков, но с ограничением в 50 секунд), либо Yandex SpeechKit (бесплатный, без ограничения по времени, но поддерживающий только 4 языка), либо Google Speech (платный, с тучей языков и без ограничения по времени). И со всеми у меня были те или иные проблемы, в том числе, и из-за масштабов работы бота.

Wit.ai оказался наименее проблемным — прикрутил бесплатный движок, но пришлось обрабатывать ограничения. Кроме того, пришлось хорошенько попотеть при интеграции оного в Войси — перегон форматов, отправка на сервер и тому подобное. К радости, с масштабами wit.ai работают отлично. Его я и поставил стандартным движком распознавания речи.

Google Speech оказался самым для меня дорогим. По дефолту, каждый чат имеет 60 секунд обработки голосовых сообщений при помощи этого провайдера — к слову, за последний месяц Google Speech обработал более 25 000 секунд, которые мне пришлось оплатить. В итоге, стоимость поддержки Войси складывается из серверных мощностей и бесплатного времени, подаренного пользователям. Проблем с интеграцией особо не было.

Yandex SpeechKit оказался чуть более проблемным. Во-первых, у них есть квота до 1000 бесплатно обработанных голосовых сообщений в сутки. Мне удалось поднять эту квоту до 5000 — победа, казалось бы. К сожалению, этот провайдер поддерживает только 4 языка, зато русский обрабатывает иногда лучше, чем wit.ai. Более того, мне пришлось поработать с очень экстравагантным способом отправки голосовых сообщений, чтобы обойти ограничение в 60 секунд аудио на один запрос. Зато ни у кого больше такой крутой фичи нет. К великому моему огорчению, иногда и этих 5000 запросов в сутки не хватает.

Что вам делать с этой информацией?

Выводов в статье можно насчитать несколько:

  1. Старайтесь писать чистый код на сервере, чтобы в любой момент за пару часов можно было поправить какой-нибудь неприятный баг
  2. Как можно скорее отвечайте на запросы людей в личку о том, что что-то не так с ботом
  3. Не спешите увеличивать мощности на серверах — возможно, ошибка кроется в вашем коде и недостаточной оптимизации
  4. Приготовьтесь, что большинство пользователей вашего бота будут не из России — лучше хорошо знать универсальный английский
  5. Учтите, что большая часть аудитории Telegram (Иран) сейчас под санкциями, и вам, скорее всего, будет сложно брать с них деньги, пока Telegram не зарелизит платежный инструмент
  6. Ваш сервис может внезапно стать популярным в очень неочевидных странах — подготовьте для этого локализации
  7. Не забудьте убедиться, что сервисы, на которых строится работа вашего продукта, отказоустойчивы к большой нагрузке

Такие дела. Надеюсь, вы нашли эту статью, как минимум, занимательной. Напомню, Войси оказался моим первым проектом, который так "выстрелил". Если вам понравилась статья, буду очень признателен, если установите @voicybot в паре чатов.

Я всегда открыт к вопросам — с удовольствием отвечу на них в комментариях. Спасибо, что дочитали до конца!

0
В избр. Сохранено
Авторизуйтесь
Вход с паролем