Comments 55
Почему выбрали именно PHP -> NATS -> GO -> Amazon SES?
symfony/mailer
умеет в очереди и поддерживает Amazon SES
1) Amazon SES просто зарекомендовал себя как стабильный поставщик услуг. Мы укладываемся в бесплатные лимиты в месяц.
2) Так уж повелось, что асинхронность я всегда поручаю или node или go.
Не люблю с этими вещами связываться в php.
В go вообще очень просто сделать демона, упаковать в 8mb контейнер и пульнуть в прод.
3) Очередь сама по себе вещь нужная.
Сегодня с рассыльщиком работает только бэк. А завтра у вас 10 микросервисов (например платежи вы вынесли). Каждому из которых надо отсылать письма, или СМСки.
Очередь в данном случае универсальный хаб
А если вам потребуется отсылать еще и СМС и пуш уведомления?
В данном случае в NotificationManager добавляются 2 фабричных метода и все.
И делаются 2 микросервиса, или в существующий добавляются 2 метода и все просто.
В случае с symfony/mailer прийдется думать, как же отсылать смс и т.п.
P.S. В данной связке вы сможете всегда поштучно изменить любой элемент.
Будь то Nats заменить на Rabbit или что еще.
Эта связка поднимается также быстро как и ваше решение. Только на старте уже гибкое, что удобно для стартапов.
А если вам потребуется отсылать еще и СМС и пуш уведомления?
То можно взять symfony/notifier
И симфони 5ый тоже.
Не могу сказать о их производительности.
Но обязательно попробую для других небольших стартапчиков =)
На практике пробовал то, что описал выше. И всё устраивает.
Go по своей скорости и в целом принцип микросервисной архитектуры.
Да и как я понимаю, в том компоненте не поддержан абсолютно любой СМС шлюз?
Да и как я понимаю, в том компоненте не поддержан абсолютно любой СМС шлюз?
Они легко добавляются (надо имплементировать соответствующий интерфейс)
Пока компонент эксперементальный, но, думаю, со временем обрастет сторонними транспортами
Я вам предложил купить УАЗик, чтобы лазить в грязь и поле.
На первое время пока на гелик не накопили.
Если что — его можно продать потом таким же фанатикам.
Вы мне предлагаете купить бентли, и надеть на него сначала подвеску повыше, потом резину, потом задний мост и т.п. Потом вы бросите его, уйдете из конторы. Придет другой разработчик, будет на это смотреть и диву даваться.
В моем решении мы имеем
1) простую очередь (замечу, что ее можно использовать не только для рассылок)
2) изолированный микросервис для рассылок (легковесный, 8мб в докере)
3) используем go либу для амазона, и пишем GET/POST запрос для отправки СМС куда душе угодно
У вас же 2 библиотеки минимум + та же самая очередь потребуется (для асинхронной рассылки) + также надо имплементацию писать.
А если завтра надо 500.000 писем отсылать?
И 50.000 смс, и полтора миллиона пушей?
При этом у вас еще есть лимиты на отсылку по аккаунту в минуту и день. И в дневной вы пока не убираетесь.
Тогда вы чуть правите микросервис — добавляете рейт лимитер (стандартный пакет в go вроде есть) и поддерживаете еще 1 аккаунт и равномерно рассылаете например с 2х.
А PHP часть при этом неизменна. Да и если мы достигнем лимитов — очередь не теряет данные.
В вашем же кейсе возникают вопросы — как прикрутить 2 аккаунта, как добавить рейт лимитер. Как прикрутить рейт лимитер к рассыльщику и т.п.
Так ваш проект начнет уже на старте обрастать тех долгом, костылями.
Решение из коробки это классно, но только если вы на 100% уверены что не придется его масштабировать. Как например HWIOAuthBundle. Есть он и есть. Ничего с ним делать не надо
Во-первых, вы выбрали это решение потому что у вас уже были наработки. Думаю большинство разработчиков поступили бы так же и были бы правы.
В случае, если таких наработок нет, я и предложил свой вариант.
В идеальном случае будет что-то вроде:
composer req symfony/messenger symfony/mailer symfony/notifier
composer req symfony/*-mailer symfony/*-notifier
Останется только прописать конфиги, выставить в supervisor'e нужное количество воркеров и все. Ни строчки кода от разработчика не понадобится. (это к вопросу о том что я уйду и оставлю после себя нечто неподдерживаемое, при том что у вас кода выходит больше)
Если нужного транспорта нет, то да, придется его реализовать (как, впрочем, и в вашем случае), что в общем-то тривиально (e.g. symfony/free-mobile-notifier)
1) простую очередь (замечу, что ее можно использовать не только для рассылок)
2) изолированный микросервис для рассылок (легковесный, 8мб в докере)
3) используем go либу для амазона, и пишем GET/POST запрос для отправки СМС куда душе угодно
У вас же 2 библиотеки минимум + та же самая очередь потребуется (для асинхронной рассылки) + также надо имплементацию писать.
Плюс-минус одинаково, разве нет? В моем варианте используются абстракции в рамках php, а в вашем — конкретные библиотеки для конкретных решений, разнесенные по разным языкам.
В вашем же кейсе возникают вопросы — как прикрутить 2 аккаунта, как добавить рейт лимитер. Как прикрутить рейт лимитер к рассыльщику и т.п.
Так ваш проект начнет уже на старте обрастать тех долгом, костылями.
Несколько аккаунтов идут из коробки, рейт лимит решается элементарными декораторами (да, не так красиво, как, возможно, у вас, но и не костыли). Не понимаю, правда, почему вы считаете, что эти же требования не добавят костыли и тех. долг в ваше решение, но добавят в мое.
Решение из коробки это классно, но только если вы на 100% уверены что не придется его масштабировать.
По факту вам не понадобился ни рейт лимитер, ни 2 аккаунта, т.е. в рамках задачи можно было бы использовать и решение из коробки :)
Можно по пальцам пересчитать платежные шлюзы, которые имеют валютные терминалы.
Подскажите, какой используете вы?
Про цену Амазон не могу сказать, мы не вылезали за лимиты.
Стриминг оплачивается за трафик, что нам удобно.
Прибыльное потому что есть рынок и маркетолог с аудиторией
Естественно, когда все вынужденно сидят по домам, возможность поучаствовать в международном мастер-классе упускать не хотят. Более того, есть немалая вероятность того, что формат приживется. Несмотря на все минусы онлайна, главный плюс — отсутствие необходимости перемещать тушку на другую сторону планеты — по-прежнему актуален.
Лично мне совмещать проекты на PHP / Go не очень понравилось, поэтому появился Comet, который гораздо удобнее и зачастую быстрее чем Go из коробки: github.com/gotzmann/comet
Вместо Sonata Admin сейчас предпочитаю использовать EasyAdmin: github.com/EasyCorp/EasyAdminBundle
По поводу рассылок — есть мнение, что современные мощности позволяют эффективно делать большие рассылки даже без очередей :) Ну по крайней мере 10К сообщений.
Позволю дополнить от себя.
Можно заменить «не ждать ответа SMTP сервера» на «не ждать ответа от стороннего сервиса рассылок».
В общем случае там может быть что угодно, smtp, amazon api, и т.п.
«современный пользователь не хочешь ждать» — в точку! =)
на этом и акцент
Глянув одним глазком EasyAdminBundle, думаю надо пробовать в следующем проекте =)
Красивый вроде как)
По поводу Go — мне на нем очень нравится писать маленькие микросервисы. Но на самом деле каждому свое. И фломастеры на вкус все разные =)
Но у меня уже есть набор готовых типа sms, email, webhook, e.t.c.
Которые я могу применять в различных новых проектах.
(2 недели как раз отсюда, многие решения модульные и просто копируются ;)
По поводу очереди — эта вещь удобна не только в плане рассылок.
Как я и писал — ее очень легко поднять в докере, и также легко отказаться от нее.
Идея методики что я описал в гибкости. Чтобы манипулируя лишь переменными среды настраивать связки. Будь то PHP -> SMTP, или же PHP -> Dummy, или PHP -> RABBIT -> GO -> Amazon
Читал не все, может пропустил… но какая страна? РФ тоже Европа если что
Зрители были со всего мира. Преподаватели делятся уже по странам света.
Мы провели уже 2 лагеря.
В первом были преподаватели из Европы (и как вы верно подметили, РФ тоже Европа, поэтому Российские преподаватели были тоже).
Второй лагерь был собран из преподавателей из США.
По поводу аудитории —
25% Российский трафик, 75% — остальной
Судя по негативу вашего сообщения, вы видимо как раз работаете на этом колбасном заводе кодером на пол-ставки, и пилите онлайн-магазин.
Если верить Стивену Бланку, то стартап, это не что иное, как временная структура, существующая для поиска воспроизводимой и масштабируемой бизнес-модели.
Мы как раз ищем такую.
Мы провели 2 лагеря — т.е. модель воспроизводима.
А вот масштабируемость сложно проверить в условиях пандемии.
Про выводы — мы с товарищем инвестировали вместо денег свое собственное время. Я был «кодером», а он «маркетологом». Я очень сомневаюсь что топовые танцоры по первому вашему приглашению сами организуют и проведут все.
Я в посте расписывал технические нюансы, проблемы с биллингом и т.п.
Я не писал о том, откуда эта аудитория, откуда эти танцоры, почему они согласились — а это тоже большой труд и временные инвестиции моего партнера.
Стартап — это не всегда инновации. При создании стартапа бизнесмены пытаются при помощи своего продукта решить проблему людей. Именно это мы и делали в условиях пандемии.
И это у нас отлично получилось, судя по фидбэку от конечных пользователей
Это техника + софт + менеджмент. Если кажется что просто — можете попробовать сами и после этого написать о своих успехах.
Детали, которые я посчитал нужным — я описал в статье.
Кому то они будут полезны. Многое из того, что я описал — я не находил на сторонних ресурсах. Это условный список нюансов, к чему надо быть готовым.
Мы с этого (я и мой партнёр) заработали. Танцоры тоже.
В минус мы не ушли :)
Пояснять финансовую сторону думаю здесь никто не будет. Не налоговая.
И ещё раз — организация онлайн кэмпа и перевод в видео это немного разные вещи.
однако соглашусь что цифры по прибыльности весьма интересны, ну или примерное соотношение затрат к выручке
кроме того интересно была ли стадия валидации, как проводился маркетинг, привлечение клиентов. т.е. технологии — это хоть и интересный момент, но, откровенно говоря, редко он является ключевым на этапе стартапа. а вот продажи, валидация идеи, unit-экономика, оптимизация… был бы очень признателен если бы вы могли раскрыть остальные аспекты стартапа. один успешный проект (не нашел в тексте инфы о других) — это еще не много, и вполне тянет на «везение». Но это не значит что методы вы выбрали неправильные, а значит если поделитесь опытом — это может быть полезно другим
Спасибо!
Назвать реальные суммы не могу. На текущий момент затраты составляют 60%.
При дальнейшем масштабировании они снизятся до 25-30% (здесь я имею ввиду затраты на cdn, оплата преподавателей, налоги, комиссии). Снижение идет за счет наличия гибкой системы оплаты во многих расходных статьях.
Как я писал выше — была уже определенная «подогретая» аудитория.
Маркетинг был в соц. сетях. К нему были также подключены преподаватели и информационные партнеры. Условно — продукт проверялся на неком сформированном сообществе.
Около 5% людей оставляют фидбэк после лагеря. Мы его изучаем и видим, что потребность в продукте есть. Потребность основана на том, что многие люди действительно не могут переместиться в Европу на подобные мероприятия.
На текущий момент мы думаем о том, как расширить продукт и его аудиторию.
Буду рад совету в ЛС. Там же могу более предметно ответить на вопросы о $
А вот масштабируемость сложно проверить в условиях пандемии.
Ставлю на то, что дело не в пандемии. А в том, что вы просто завели в сервис аудиторию, которая у вас (у вашего партнёра) уже была. А это можно сделать только один раз. То есть, не масштабируется. Дальше нужны другие методы, к которым вы по факту ещё не приступали. И там всё может оказаться не так гладко и не так дёшево.
Более того, стоит помнить, что после окончания всевозможных карантинов-изоляций неминуем отток клиентов. Всё-таки танцы — дело сугубо оффлайновое и в онлайн люди сейчас заходят только от безысходности. Что вы будете делать после пандемии? Как будете масштабироваться, имея реальную конкуренцию из оффлайна? Именно эти вопросы ключевые.
И если честно, именно о них я и ожидал почитать, тыкнув в заголовок. Запускать работоспособные сервисы здесь много кто умеет. А вот запускать работоспособные бизнесы — умение более редкое.
Не хотите об этом разговаривать — ваше право. Но тогда и заголовок нужно сменить на соответствующий.
В любом случае, удачи в вашем начинании! Делать всегда сложнее, чем рассуждать: о)
По порядку.
У моего партнера была определенная «подогретая» аудитория + какое-то кол-во информационных партнеров. Также информацию выставляли у себя в соц. сетях преподаватели.
Школы у моего партнера находятся в России, а доля РФ трафика составила около 25%.
Учитывая разные погрешности и т.п., можно предполагать что около 70% аудитории не посещали его школы никогда.
После окончания пандемии и карантинов ясное дело, что откроются оффлайн лагеря. Однако стоит принять во внимание тот момент, что далеко не все ученики\танцоры могут позволить себе регулярно ездить в Европу или США или Азию на подобные лагеря. Я не смогу назвать точных цен, но условно онлайн участие будет стоить от 10 до 20% стоимости оффлайн лагеря + расходы на перелет. К тому же, состав преподавателей в онлайне может быть абсолютно любой, в оффлайне тут уже накладываются свои факторы и трудности.
А можете рассказать, как на такую площадку привлекали пользователей. Ведь нужны были и продавцы и покупатели, т.е. сразу два больших направления, так плюс еще и в Европе.
Спасибо!
Как я писал выше, мой партнер владеет сетью танцевальных школ.
У него есть своя аудитория. Также информацию о лагерях распространяли преподаватели и партнеры проекта.
Мы достигли успеха за счет того, что
1) были потребители (и рынок)
2) была гипотеза, что нужно этой аудитории в карантин
3) появился я, кто смог за 2 недели быстро «окучить» эту аудиторию и сделать MVP
Очень важно в такие моменты быстро и правильно залететь в эту аудиторию и дать то, что действительно необходимо! Отлично!
Успехов Вам и дальнейшего продвижения!
Интересно, а какой убыток получился в результате простоя сети танцевальных школ.
Подозреваю, что этот «удачный стартап» — просто отчаянная попытка немного уменьшить убытки.
Убытки +- сопоставимы.
Ну в любом случае люди делают проекты для того, чтобы заработать. Это логично.
Но в данном кейсе проект сможет существовать и дольше. И после карантина.
Т.к. не у всех людей есть возможность поприсутствовать на оффлайн мероприятии.
Полная аналогия с IT мероприятиями. Там же есть такой формат =)
-f flv rtmp://rtmp.cdnhost.abc;
cdn принимает в формате флеш? можно поподробнее про стриминг
Стримили на него.
Зеркалили картину и отправляли по RTMP дальше в CDN.
Если бы не «зеркало», напрямую RTMP слали бы в CDN.
Про флеш увы ничего не могу сказать
в контексте сервера
входной поток мы отправляем сюда — push rtmp://localhost/cdn;
а внутри этого потока уже мы зеркало делаем, и отправляем в cdn
exec ffmpeg -i rtmp://localhost/cdn/$name -vf «hflip» -crf 30 -preset ultrafast -acodec aac -strict experimental -ar 44100 -ac 2 -b:a 128k -vcodec libx264 -x264-params keyint=60:no-scenecut=1 -r 30 -b:v 2000k -f flv rtmp://rtmp.cdnhost.abc;
rtmp.cdnhost.abc — это рыба.
для получения адреса вам стоит завести аккаунт в cdn
1) у преподавателя стоит larix broadcaster
приложение которое умеет стримить rtmp
2) этот поток идет на наш «рестриминговый» сервер
там мы зеркалим картинку, и отправляем в cdn
видим статистику по входящему потоку
3) cdn отдает нам hls плейлист
4) на клиенте стоит videojs
(что внутри cdn подсказать не могу)
Просто много лет работал в сфере видео-стриминга, потому где-то так и предполагал, но хотелось узнать, вдруг какие новые подходы начали использовать))
На самом деле по технической части есть ряд улучшений, к которым я мог бы посоветовать присмотреться (если что — в ЛС). Но прекрасно понимаю что стартапы и бизнес в целом — это не про технологии, так что если клиент доволен и себестоимость приемлимая, то не факт что нужно что-то менять на этом этапе
Очень быстро авторизацию через соц.сети можно интегрировать, добавив в проект библиотеку LexikJWTAuthenticationBundle.
А можно подробней. Все-таки LexikJWTAuthenticationBundle provides JWT (Json Web Token) authentication for your Symfony API. Про соц. сети в документации ни слова.
Случайно не HWIOAuthBundle имелся в виду?
Такое требование было заложено. Это нужно для корректной подачи информации преподавателем.
Приложений, которые отдают отзеркаленную картинку мы не нашли =(
CDN тоже не зеркалит.
Поэтому у нас была маленькая виртуалка с nginx + rtmp для этого.
Если бы этого требования не было — стримили напрямую бы конечно же =)
Миллион за месяц: как запустить стартап в Европе своими силами