Здравствуй, Хабр!
Я хочу поделиться своей короткой историей о том, как я создавал видеочат-рулетку. Понимаю, что их уже понасоздано всяких на любой вкус и цвет, но все же на это были причины. Статья не будет научной, она написана прежде всего для людей.
Ну что, поехали?
Вдохновение
Всё началось с простой идеи, которая посетила меня спонтанно во время общения в чат-рулетке. Идея пришла не сразу, а спустя час или два пребывания там, наверное, потому что уже стало дико скучно, не помню всех деталей. Тогда я подумал, что чат-рулетки — уже не такая захватывающая тема, все одно и то же: листаешь собеседников и ищешь адекватных, натыкаясь при этом на неадекватов, которых, как правило, полно на таких сайтах, никакой динамики. И вот, наконец, пришла та самая идея создать свою видеочат-рулетку с нуля с новыми фичами, которая бы отличалась от других и которая вдохнула бы свежий воздух в эту нишу. Поначалу идея показалась мне довольно простой, помню, даже мысль была, что за неделю справлюсь, ничего сложного там нет.
Начало работы и болезни, которые меня настигли
Итак, первая неделя пролетела быстро. Я создал всё, что должно было быть на фронтенде, а именно интерфейс и те самые фичи, которых нет на остальных видеочат-рулетках. Технологии на фронте стандартные: 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-стили подогнать, да и все. В целом, все прошло гладко, не так уж и печально, как оказалось. Даже тогда, когда все было готово, я снова тестировал. Хотя тестить уже было нечего, может, это вошло в привычку или паранойя?
Окончательный результат и эмоциональные переживания
И вот настал тот самый волнительный час Х — выкатывать свою телегу в массы. Хотя какие там массы в начале пути? На зависть всем остальным чат‑рулеткам я сделал всё, чтобы не быть на них похожим, и мне кажется, это удалось, хотя вам решать: так это или нет. От себя еще хочу добавить: отдыхайте больше и разрабатывайте свои проекты не спеша, потому что конец может быть плачевным. Никакие деньги не стоят вашего здоровья, берегите себя.
Кому интересно, вот видеочат-рулетка, которую я запилил.
Комментарии (12)
Lev3250
25.10.2023 11:12+4Не очень понял, а что умеет эта рулетка, что нет умеет другая?
Qisvis Автор
25.10.2023 11:12-1Спасибо за ваш комментарий. В чат рулетке можно предварительно отклонить заявку на общение, опираясь на популярность собеседника. Если популярность низкая, есть вероятность, что данного пользователя дизлайкали за активность в тех или иных действиях. Человек сам решает, будет ли он общаться с предложенным системой собеседником, или нет, на свой страх и риск, как говорится. В будущем планирую добавить блок, указывающий на то, за что именно дизлайкали, к примеру, за матерные выражения, эротический контент, неуважение и так далее.
evkin
25.10.2023 11:12+1Слегка сыроват. Попробовал зайти - из Украины не открывается, ладно есть впн. на компе поиск не работает, веб консоль показывает что код падает если нет камеры. Ок, беру телефон... Заполняю форму фильтра - по кнопке "сохранить и начать поиск" форма не закрывается и не видно что поиск начался))
Qisvis Автор
25.10.2023 11:12-1Спасибо за ваш комментарий. Вы абсолютно правы, проект еще сыроват, но основные функции работают. Вы правы, что через VPN не получается соединиться с сигнальным сервером. К сожалению, пока проблему с VPN не удалось решить, но я уже работаю над этим вопросом. Мне очень жаль, что у вас не получилось зайти на сайт без VPN. Буду исправлять недочеты.
evkin
25.10.2023 11:12Через ВПН он работает. Там я проблемы не увидел. Но для теста другими рекомендую хоть кого то из собеседников добавить, что бы было 24/7. Например просто держать клиента в постоянном подключении, пусть хоть стену или вид из окна транслирует...
Qisvis Автор
25.10.2023 11:12Вы правы, к сожалению, сейчас нет такого человека, который сидел бы там постоянно, но я активно тестирую со своими знакомыми и исправляю недочеты, которые нахожу.
pnaydanovgoo
25.10.2023 11:12+1Тоже падало, пока не включил камеру и микрофон в браузере. Но у меня другая проблема, собеседник не нашелся)) Протестировать не удалось)
Qisvis Автор
25.10.2023 11:12-1Спасибо за ваш комментарий. Мне очень жаль, что вам не удалось никого найти. Проект только стартовал, и людей там сейчас мало, и они бывают там в разное время, к сожалению.
AnotherAnkor
Хорошо, конечно, но есть какие-то исходники? Или вообще что посмотреть, кроме самого сайта и букв?
Qisvis Автор
Спасибо за ваш комментарий. Возможно, в следующей статье я сделаю обзор или мини-гайд по сигнальному серверу на Go. Если у меня будут на это силы. Сейчас, к сожалению, я занят продвижением проекта.