13

Как стать программистом. Сервис доставки живых спортивных трансляций

Приветствую всех! Хочу рассказать о своем опыте входа в мир разработки, ну и промежуточном результате. Это мой первый пост в сообществе и целом на Пикабу.

Честно сказать, с детства восхищался айти, но в рамках кинематографа, тайно мечтая приблизиться к искомому.  День Х настал уже в сознательном возрасте 23-24, после сильнейшего кислотного трипа, приехав домой с четкой мыслью что буду ненавидеть себя до конца жизни, если не попробую , заказал книгу по C++  Страуструпа. Через не могу, прочел и прорешал это. Никому не рекомендую начинать с плюсов, это вас задемотивирует + большей вероятностью забьете. Но тогда опыта не было, первую работу тоже искал в качестве разработчика С++. Волшебным образом мне  повезло. Навешал лапши на уши о том что все могу,  и меня взяли на 20000р в мес с маленькую фирму, пилить их хотелки, попутно занимаясь полным спектром работ от погрузки/разгрузки/демонтажа конструкций до работы на подряде на местных заводах . Уволился через год-полтора и так получилось что обратил свое внимание на C#.

За 3-4 месяца так же прочел неск книг по шарпу, поверил в себя и пошел на собеседования(СПб). По истечению полугода так никуда и не взяли, от части из-за слабо прокачанных социальных скилов и неуверенности в себе. Бывали даже панические атаки прям на интервью)

В результате, конспектировал все что спрашивали, фоткал все тестовые задания, заполнял пробелы в знаниях.

Понял что нужен опыт разработки на .NET. Благодаря одному знакомому парню из нашей компании, определился. Он как-то пожаловался что любит смотреть спорт с мобилы, а все ресурсы либо на флеше, либо с кучей назойливой рекламы либо вообще нифига нет контента по выбранному событию.

Собственно, начался ресёрч и планирование примерно в апреле 2018 года, цель была сделать сервис который бы транслировал живые спортивные события, был прост и стабилен + работал на всех устройствах. Через 3 месяца от начала разработки скилы начали прокачиваться, голова наполнялась не серой теорией. Все это время я работал в техподдержке и в момент очередной ссоры с начальством,  разослал резюме десяткам фирм мне пришло интересное предложение. Т.к я уже имею опыт бесполезных поездок на себеседования, решил отправить им свое тестовое задание, которое делал для других. Десктопное мини приложение где для чтения и выгрузки огромного текстового файла использовалась многопотоночность и асинхронность + шаблон MVVM. В результате меня пригласили на встречу и в последствии взяли на работу. Это был успех) Зарплата выше чем в поддержке в 2 раза. Окрыленный я, чуть поздабив на домашний проект, влился в рабочие процессы, получил колоссальное кол-во опыта и к декабрю 2018 продолжил домашнюю разработку сервиса по спортивным трансляциям. Переделывал все раза 3-4 :-)

По итогу проект сейчас состоит из пяти микросервисов. Основополагающий это сервис синхронизации данных в БД от других микросервисов. WEB  API. Сделан на .NET Core, изучал и сразу применял шаблоны проектирования, такие как фабрика, синглтон, репозиторий(это подсмотрел в офисных проектах и в книгах  по шаблонам проектирования)

Проект написан не на чистом .net стеке, так же использовался nodejs(для старта ffmpeg, временных инстанцев http серверов. На nodejs это оказалось проще и быстрее), примечательно что вызывать nodejs код можно прям из .net приложения использую INodeSerevices, оч удобно.

База данных сперва была MSSQL, но потом переехал на Postgres, тоже подглядел в офисных проектах.

Покупаю видео поток у контент провайдеров, ретранслирую через свой сервер. Что бы работал телеграм вынужден был купить socks5  proxy, так же в перспективе нужно будет покупать расширенный аккаунт для ngrok, т.к он выполняет роль https  тоннеля, который перенаправляет пакеты от телеграм на мой локальный порт и адрес, иначе нужен будет SSL сертификат и свой домен.

Сперва ретрансляция одного потока занимала примерно 50% CPU, это опустило меня на дно отчаяния т.к по моим расчетам нужен был хотя бы двухпроцессорный сервак б.у с алиэкспресс примерно на 36-48 ядер. Очень не хотелось тратить 1000$ на подходящий сервер, что бы найден способ, снижающий нагрузку до смешных 0.5 - 1%.


Сейчас сервисом пользуется один человек, с подачи которого все это затевалось) Но мне бы хотелось поделиться этим с людьми, т.к ресёрч показал что годных сайтов/сервисов по прямыми трансляциям и большим ассортиментом, да еще и чтоб работало на ios/android , просто нет. По этому оставляю тут адреса.

Канал: @LiveSportsStreams Bot: @LiveSportStreamsBot.


Спасибо за внимание, надеюсь на фидбек, отвечу на любые вопросы.

Лига программистов

2.1K постов11.9K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

Круто, да.

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

раскрыть ветку (11)
0
Автор поста оценил этот комментарий

Это не опенсорс. Задавай вопросы по стеку технологий, обещаю тебе интересный диалог

раскрыть ветку (10)
0
Автор поста оценил этот комментарий

По стеку технологий можно и с документацией поговорить (= Архитектура приложения интересна. Новичков, возможно, заинтересует описание DAL, раз уж вы репозиториев коснулись. Возможно, про эволюцию приложения, раз вы его переписывали несколько раз, сам путь проб и ошибок.

Вы же инди и NDA на вас не давит.


Если уж постите рекламу коммерческого сервиса в сообществе программистов и сочувствующих, то хоть сделайте ее интересной для целевой аудитории. @moderator

раскрыть ветку (9)
2
Автор поста оценил этот комментарий

До коммерческой рекламы пост не дотягивает.

2
Автор поста оценил этот комментарий

Старался сделать интереснее, но опыта особо нет. Сперва была цель сделать чтоб хоть как-то работало, написал монолит, столкнулся с тем что IOS  ничем кроме HLS и WEBRTC не передать живой контент, готовый к воспроизведению. Пошел по пути webrtc, вебсокеты оказались весьма сложны в освоении и когда прототип на вебсокетах был готов, выкинул его на помойку из-за того что сажает батарею устройств за 2 часа почти в ноль из-за транскодирования потока на стороне клиента + WebRtc(а иначе мне бы приходилось транскодить поток отдельно для каждого пользователя, а это колоссальная нагрузка на сервер)  не поддерживается на ios ниже 11 и андроиде ниже 5 версии. Убил на это примерно месяца 3. Начитался про ffmpeg, hls  и понял что это единственно верное направление. Закончил полностью рабочий монолит примерно в мае, отдохнул, привел мысли в порядок и понял что ЭТО адски сложно будет поддерживать, было принято решение распилить на микросервисы. Если коротко то в аднный момент их несколько: dataService - парсит инфу о спортивных событиях с сайтов каналов(пришлось освоить Selenium), так же прибегнул к алгоритмам нечеткого поиска типа Левинштейна. schedulerService - имеет один webapi  контроллер, который принимает сигнал о том что парсинг данных закончен и пора бы обработать входящие спортивные евенты, преобразовать их объект типа Stream и запланировать старт и окончание события, для планирования использовал библеотеку Quartz.Net. launcherService, просто запускает стрим, который приходит на контроллер после срабатывания тригера Quartz на шедулере. Большая проблема была с организацией портов,  полчалось так что стартует стрим, а нужный порт занят. Решил следующим образом: т.к старт стримов происходил непосредственно с помощью скриптов NodeJs и npm пакета fluent-ffmpeg и  hls-server, а вызывалось все это через INodeService в .Net Core приложении, нашел npm пакет fkill, который убивает слушателя порта. Далее столкнулся с синхронизацией контекстов баз данных, используя EntityFramework, запили потокобезопасные репозитории для всех необходмых типов данных. SyncService  -  сервис синхронизации, самое сердце приложения, именно он принимает на себя все обращения, типа срабатывания тригеров от шедулера, окончания работы парсера т.д. Когда распилил все на микросервисы, поддерживать стало в миллиардры раз проще) Планирую добавить сервис логгирования, сервис аналитики пользователей и антиспам модуль

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Ну шикарно же! Тема необычная. Если структурировать, сдобрить примерами и конкретикой, это можно было бы хоть на Хабр выкладывать - может получиться интереснее типичных статей там. По моему скромному мнению.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за комментарий. думал о хабре, но что-то стремно, там начальство сидит и коллеги + аудитория страшит

1
Автор поста оценил этот комментарий

Весьма расстраивает когда пилил больше года сервис для людей, писал простыню, сделал пост, а на тебя как на спамера вызывают модера, мол тут нехороший человек, гад,  что-то рекламирует.

раскрыть ветку (3)
Автор поста оценил этот комментарий

Вы не скрываете целей публикации (в комментариях ниже), простыня не балует подробностями. Такие тут через день появляются ("На тебе общее описание, подпишись на канал, скачать знаешь где"). Я посчитал, что ее необходимо доработать, модератор решил, что и так сойдет. Ну ОК.


Или вы лично испытываете удовольствие, читая очевидно рекламные посты?

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Согласен, а автору совет: сделай API, задокументируй. А потом можно и рекламировать

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

так понимаю речь о паблик АПИ? для кого\чего? все уже работает как должно, это не опенсорс

0
Автор поста оценил этот комментарий

https://gist.github.com/stgmt/81fa2db9d6d2c66a1fb2519036a36e5c вот кстати реализация репозитория слоя доступа к данным

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку