Как я запилил видеочат-рулетку за 2 месяца с нуля
Здравствуй, Хабр!
Я хочу поделиться своей короткой историей о том, как я создавал видеочат-рулетку. Понимаю, что их уже понасоздано всяких на любой вкус и цвет, но все же на это были причины. Статья не будет научной, она написана прежде всего для людей.
Ну что, поехали?
Вдохновение
Всё началось с простой идеи, которая посетила меня спонтанно во время общения в чат-рулетке. Идея пришла не сразу, а спустя час или два пребывания там, наверное, потому что уже стало дико скучно, не помню всех деталей. Тогда я подумал, что чат-рулетки — уже не такая захватывающая тема, все одно и то же: листаешь собеседников и ищешь адекватных, натыкаясь при этом на неадекватов, которых, как правило, полно на таких сайтах, никакой динамики. И вот, наконец, пришла та самая идея создать свою видеочат-рулетку с нуля с новыми фичами, которая бы отличалась от других и которая вдохнула бы свежий воздух в эту нишу. Поначалу идея показалась мне довольно простой, помню, даже мысль была, что за неделю справлюсь, ничего сложного там нет.
Начало работы и болезни, которые меня настигли
Итак, первая неделя пролетела быстро. Я создал всё, что должно было быть на фронтенде, а именно интерфейс и те самые фичи, которых нет на остальных видеочат-рулетках. Технологии на фронте стандартные: JS, WebRTC, Html, Css, Вебсокеты. Интерфейс писался без использования каких-либо фреймворков, на чистом JS: просто не было времени изучать vue.js или angular. Работой был дико увлечен, сил хватало на все — на первых этапах. Чтобы было понятно, я спал по 4–5 часов в день. Помимо всего прочего, у меня еще есть основная работа, где тоже нужно кодить по 8 часов в день, но я еще и занимался этой чат‑рулеткой, в свободное время, конечно же, а если быть точным, то по ночам. А в выходные полностью отдавался ей. Прошла неделя интенсивной работы, и неожиданно жизнь решила проучить меня. Я заболел, не знаю чем, но температура была высокая. На ногах еле стоял. Еще вчера был здоров, как бык, а с утра уже лежал, как беспомощный старик. В таком состоянии не хотелось видеть ничего, кроме дивана и горячего чая.
я вас люблю мои друзья теплый плет и горячий чай, Мем Том и Джерри
Работу пришлось отложить на целую неделю, пока не встал на ноги. Как только я вылечился, я, конечно же, мгновенно забыл о болезни (удивительно, как работает мозг) и сразу взялся за свой проект. Снова интенсивная работа без отдыха и перерывов. Мой энтузиазм стал еще сильнее, чем в начале пути. И вот проходит еще одна неделя, и я снова на диване с температурой, словно высшие силы не хотели, чтобы я завершил этот проект (Бред, но все же). Но причина была куда проще. Тут я начал искать закономерности, причины моей болезни, а оказалось, все было просто. Я успел дважды перегореть за время разработки этой чат‑рулетки; ну конечно, а что вы хотели: работать после работы до утра следующего дня не каждому по силе. Рекорд в моей жизни за такое короткое время — два перегорания. На этот раз я учел уроки жизни. Отдыхать нужно вовремя. Вот такой простой вывод я сделал в начале моего пути.
Технические вызовы
В ходе работы над проектом я столкнулся с множеством технических проблем. Одной из них был выбор платформы для сигнального сервера. Ох, как долго я размышлял — node JS, go, python. Даже php на секунду мелькнул в моей голове, но я быстро спустился с Олимпа на землю. Тут у меня остались два варианта: go или node js. Но так как опыта с node js у меня было мало, и не хотелось перегружать свой и так уже перегруженный мозг, я выбрал go.
Выбор оказался довольно правильным, как выяснилось позже. Уже есть готовые решения по http серверу, вебсокетам. И вообще, go — штука мощная в умелых руках, но руки у меня были поначалу кривые, это потом уже они стали умелыми, спустя много чашек кофе и бессонных ночей перед монитором; не советую так же делать, опасно для жизни.
Чем мне понравился go: он поддерживает многопоточность, можно выполнять «асинхронные» задачи. В проекте (так уж получилось) этих подзадач предостаточное количество, и go справляется со всем просто на изи. В общем и целом, как говорил Щербаков из ЧБД, я написал сигнальный сервер на go довольно быстро и успешно, хотя тестирование, правда, было мучительным, и негативные эмоции не знали предела.
Далее, что касается JS, пришлось изучать WebRTC. Это, кстати, та самая технология, которая позволяет двум и более собеседникам соединиться друг с другом без использования каких-либо посредников. Но не всегда: иногда все-таки нужны посредники в виде TURN-серверов, для того чтобы, если не удастся соединиться напрямую, можно было бы соединиться через «TURN-сервер». Это все, кстати, делает на автомате WebRTC: подключение к TURN-серверу или подключение напрямую в браузер собеседника; заморачиваться на этом, в принципе, не стоит.
Ничего сложного, как мне показалось, в этой технологии нет; есть вся документация, и хороших примеров за все это время поднакопилось приличное количество. Вебсокеты на JS, шифрование запросов в двоичный код тоже пришлось изучать, хотя, признаюсь честно, шифрование запросов JSON-строк в двоичный код было лишней затеей. В принципе, все прошло гладко, несмотря на то, что я два раза перегорел и чуть не попрощался со всеми вами навсегда.
Тестирование и доработка
На тестирование ушло довольно много времени, черт его побери, и немало нервов ушло туда же, вот только куда именно — непонятно.
Я сымитировал миллион запросов в сигнальный сервер на go. Должен признаться, go меня приятно удивил: он обработал все запросы за две секунды, ну максимум три. Под обработкой я подразумеваю следующее: отфильтровать весь текущий миллион имитированных пользователей и вернуть в ответ нужного собеседника. На борту у меня 8 ядерный VCPU и 16 ГБ оперативной памяти на облачном сервере. Я тестировал все в режиме параноика, каждую мелочь.
Под конец уже думал: вот оно — «Конечный результат». Мое творение. Но не тут‑то было, оказывается, большинство пользователей сидит в телефонах, это я потом от SEO-специалиста узнал, а у меня мобильная версия была на нулевой стадии. Как же у меня настроение упало тогда — вспоминать даже не хочется. Что поделать, пришлось создавать мобильную версию сайта с нуля, но там вообще несложно: css-стили подогнать, да и все. В целом, все прошло гладко, не так уж и печально, как оказалось. Даже тогда, когда все было готово, я снова тестировал. Хотя тестить уже было нечего, может, это вошло в привычку или паранойя?
Окончательный результат и эмоциональные переживания
И вот настал тот самый волнительный час Х — выкатывать свою телегу в массы. Хотя какие там массы в начале пути? На зависть всем остальным чат‑рулеткам я сделал всё, чтобы не быть на них похожим, и мне кажется, это удалось, хотя вам решать: так это или нет. От себя еще хочу добавить: отдыхайте больше и разрабатывайте свои проекты не спеша, потому что конец может быть плачевным. Никакие деньги не стоят вашего здоровья, берегите себя.
Кому интересно, вот видеочат-рулетка, которую я запилил.