- PVSM.RU - https://www.pvsm.ru -
Поисковая выдача на ListenNotes.com
Listen Notes [1] — это поисковая система и база данных подкастов. Технология на самом деле очень скучная. Никакого ИИ, глубокого обучения или блокчейна. «Если вы должны объявлять о внедрении ИИ, то вы не используете Настоящий ИИ» [2] :)
После прочтения этой статьи вы сможете повторить мой проект или легко сделать нечто подобное. Не придётся нанимать много разработчиков. Помните, когда Instagram привлёк $57,5 млн и отошёл к Facebook за $1 млрд [3], у них было всего 13 сотрудников [4] — и это не только разработчики. Покупка Instagram произошла в начале 2012-го. Сейчас 2019 год, и сегодня как никогда просто создать что-то значимое с крошечной инженерной командой — даже из одного человека.
Если вы ещё не видели Listen Notes, попробуйте прямо сейчас:
Начнём с требований или особенностей проекта.
Listen Notes предоставляет две функции:
Всё работает на AWS, всего 20 серверов в продакшне (на 5 мая 2019 года):
Серверы, на которых работает Listen Notes
По имени хоста можно легко догадаться, что делает каждый сервер.
Большинство серверов можно горизонтально масштабировать. Вот почему я называю их production-что-то1, production-что-то2 и т. д… Очень легко добавить в кластер production-что-то3 и production-что-то4.
Весь бэкенд написан на Django/Python3. Операционная система — Ubuntu.
Для обслуживания веб-трафика используется uWSGI [10]. Перед процессами uWSGI я поставил nginx [11], он также работает балансировщиком нагрузки.
Основное хранилище данных — PostgreSQL [12], с которой у меня большой опыт разработки и эксплуатации на протяжении многих лет. С проверенной технологией спокойно спится по ночам. Redis [13] применяется для различных целей (например, кэширование, статистика...). Нетрудно догадаться, что где-то используется и Elasticsearch [14]. Да, я применяю его для индексирования подкастов и для обслуживания поисковых запросов, как и большинство [15] скучных [16] компаний [17].
Celery [18] используется для автономной обработки, а Celery Beat [19] предназначен для планирования задач, которые похожи на задания Cron, но немного приятнее. Если в будущем Listen Notes станет популярным, а Celery и Beat вызовут проблемы с масштабированием, я, вероятно, переключусь на два проекта, которые сделал для предыдущего работодателя: ndkale [20] и ndscheduler [21].
Supervisord [22] управляет процессами на каждом сервере.
Погодите, а как же Docker, Kubernetes и бессерверная архитектура? Ничего такого. С опытом вы учитесь не делать лишнего. На самом деле я немного работал с Docker ещё в 2014 году на предыдущей работе: что было хорошо для среднего стартапа ценой миллиард долларов, кажется излишним для крошечной компании из одного человека.
Веб-интерфейс в основном построен с помощью React [23] + Redux [24] + Webpack [25] + ES [26]. Довольно стандартно в наши дни. При развёртывании в рабочей среде пакеты JS загружаются в Amazon S3 [27] и выдаются через CloudFront [28].
На ListenNotes.com большинство веб-страниц наполовину рендерятся на стороне сервера (шаблон Django [29]), наполовину на стороне клиента (React [23]). С сервера поступает шаблон веб-страницы, а на стороне клиента в основном рендерится интерактивное веб-приложение. Но несколько веб-страниц полностью готовятся на сервере из-за моей лени и некоторых потенциальных преимуществ SEO.
Я использую сильно модифицированную версию react-media-player [30]. Он работает на веб-сайте [31] как встроенный плеер в твиттере [32] и встроенный плеер на сторонних сайтах:
Встроенный плеер на сторонних сайтах
Мы предоставляем разработчикам простой и надёжный API с подкастами [8]. Построение API аналогично созданию веб-сайта. Здесь тот же стек Django/Python для бэкенда и ReactJS для интерфейса (например, панель инструментов API, документация...).
Панель инструментов Listen API
Документация Listen API
Для API нам нужно отслеживать, сколько запросов использует клиент в текущем цикле биллинга, и взимать оплату. Нетрудно представить, что здесь активно используется Redis :)
Для подготовки системы (provisioning) применяется Ansible [33]. По сути, я написал кучу файлов yaml для указания, какие файлы конфигурации и какое программное обеспечение должно быть на каждом типе серверов. Я могу одним нажатием кнопки развернуть сервер со всеми правильными файлами конфигурации и всем установленным софтом. Вот структура каталогов для этих файлов Ansible yaml:
Я мог бы грамотнее назвать директории. Но опять же, этого сейчас достаточно
Ansible также помогает деплоить код в продакшн. В принципе, у меня есть скрипт-обёртка deploy.sh, который работает на macOS:
./deploy.sh production HEAD web
Этот скрипт принимает три аргумента:
Процесс деплоя в основном организован файлами Ansible yaml, и, конечно же, предельно прост:
Как видите, я не использую эти причудливые средства CI. Только самые простые и надёжные инструменты, которые реально работают.
Мониторингом и оповещениями занимается Datadog [34]. В простой панели мониторинга демонстрируются некоторые высокоуровневые показатели. Всё здесь предназначено для того, чтобы повысить мою уверенность при возне с серверами в продакшне.
Панель мониторинга Datadog для Listen Notes, по состоянию на декабрь 2017 года
Datadog подключён к PagerDuty. Если что-то пойдёт не так, PagerDuty пришлёт мне оповещение по телефону и SMS.
Я также использую Rollbar [35], чтобы отслеживать состояние кода Django и ловить неожиданные исключения, уведомляя меня по электронной почте и Slack.
Slack [36] применяется очень активно. Да, это компания с одним человеком, поэтому он нужен не для общения, а для мониторинга интересных событий на уровне приложений. Кроме интеграции Datadog и Rollbar с Slack, в код бэкенда Listen Notes интегрированы входящие веб-хуки Slack [37], чтобы уведомлять о регистрации пользователя или выполнении некоторых интересных действий (например, добавлении или удалении элементов). Это очень распространённая практика в технологических компаниях. Если вы почитаете книги о первых годах Amazon или PayPal, то узнаете, что у обеих компаний был аналогичный механизм уведомлений: всякий раз, когда регистрировался пользователь, раздавался звук «динь», чтобы уведомить всех в офисе.
С момента запуска в начале 2017 года у Listen Notes не было серьёзного даунтайма (более 5 минут), кроме этого [38]. Я всегда очень осторожен и практичен в работе DevOps. Для серверов предусмотрен серьёзный оверхед на случай какого-то огромного всплеска посещаемости из-за попадания в прессу или чего-то ещё.
Я работаю в коворкинге WeWork [39] в Сан-Франциско. Некоторые могут задать вопрос, почему бы просто не работать из дома или из некоторых случайных кафе. Ну, я очень ценю производительность и готов инвестировать в неё деньги. Не верю, что домашний бардак способствует разработке программного обеспечения (или любой работе в сфере знаний/творчества). Я редко работаю более 8 часов в день (извините, люди 996 [40]). Хочется, чтобы каждая минута была на счету. Таким образом, хороший и относительно дорогой частный офис — то, что мне нужно. Вместо экономии денег в ущерб времени, я оптимизирую время, чтобы тратить его с пользой и зарабатывать деньги.
Мой офис в WeWork
Я работаю на MacBook Pro. Почти идентичная инфраструктура запускается внутри Vagrant [41] + VirtualBox [42]. Для среды разработки внутри Vagrant используется тот же набор файлов Ansible yaml, описанный выше.
Я поддерживаю философию монолитного репозитория [43]. Таким образом, есть один и только один репозиторий listennotes со скриптами DevOps, кодом фронтенда и бэкенда. Он размещён как приватный репозиторий на GitHub. Вся разработка идёт в главной ветке. Я редко использую бранчи.
Я пишу код и запускаю dev-серверы (Django runserver и dev-сервер webpack) с помощью PyCharm [44]. Да, знаю, это скучно. В конце концов, это не Visual Studio Code или Atom или какие-то крутые IDE. Но для меня PyCharm работает просто отлично. Старая школа, что же поделаешь.
Мой PyCharm
Есть куча полезных инструментов и сервисов, которые я использую для создания Listen Notes как продукта и компании:
Как видите, мы живём в прекрасное время для запуска своего бизнеса. Так много готовых инструментов и сервисов, которые экономят время и деньги, повышая вашу производительность. Сейчас самое лучшее время за всю историю, чтобы создать что-то полезное для человечества с крошечной командой (или только силами одного человека), используя простые и скучные технологии.
С течением времени компании становятся всё меньше и меньше. Уже не нужно нанимать тонны штатных сотрудников. Чтобы сделать всю работу, можно воспользоваться сервисами SaaS и подрядчиками под заказ.
В основном, главное препятствие в создании проекта — излишние размышления. Что, если это, что, если то. Парень, ты никому не нужен. Каждый занят собственными делами. Никому не интересен ты и твой проект, пока ты не докажешь, что достоин внимания. Даже если вы запорете запуск, никто этого не заметит. Думайте масштабно, начинайте с малого, действуйте быстро. Абсолютно нормально использовать скучные технологии и начать с чего-то простого (даже уродливого), если вы действительно решаете проблему.
Сейчас так много людей с карго-культом [75]. Не обращай внимания на шум. Сохраняй спокойствие и не дёргайся.
Автор: m1rko
Источник [76]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/330355
Ссылки в тексте:
[1] Listen Notes: https://www.listennotes.com/
[2] «Если вы должны объявлять о внедрении ИИ, то вы не используете Настоящий ИИ»: https://www.youtube.com/watch?v=4sJY7BTIuPY
[3] когда Instagram привлёк $57,5 млн и отошёл к Facebook за $1 млрд: https://www.crunchbase.com/organization/instagram#section-funding-rounds
[4] 13 сотрудников: https://www.businessinsider.com/instagram-employees-and-investors-2012-4
[5] последующего прослушивания: https://www.listennotes.com/listen/?s=nav
[6] клипы, вырезанные из подкастов: https://www.listennotes.com/clips/?s=nav
[7] оповещения: https://www.listennotes.com/alerts
[8] Поиск подкастов и API: https://www.listennotes.com/api/
[9] паньгу: https://en.wikipedia.org/wiki/Pangu
[10] uWSGI: https://uwsgi-docs.readthedocs.io/en/latest/
[11] nginx: https://www.nginx.com/
[12] PostgreSQL: https://www.postgresql.org/
[13] Redis: https://redis.io/
[14] Elasticsearch: https://www.elastic.co/
[15] большинство: https://medium.com/netflix-techblog/tagged/elasticsearch
[16] скучных: https://engineeringblog.yelp.com/2017/06/moving-yelps-core-business-search-to-elasticsearch.html
[17] компаний: https://eng.uber.com/tag/elasticsearch/
[18] Celery: http://www.celeryproject.org/
[19] Celery Beat: http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
[20] ndkale: https://github.com/Nextdoor/ndkale
[21] ndscheduler: https://github.com/Nextdoor/ndscheduler
[22] Supervisord: http://supervisord.org/
[23] React: https://reactjs.org/
[24] Redux: https://redux.js.org/
[25] Webpack: https://webpack.js.org/
[26] ES: https://en.wikipedia.org/wiki/ECMAScript
[27] Amazon S3: https://aws.amazon.com/s3/
[28] CloudFront: https://aws.amazon.com/cloudfront/
[29] шаблон Django: https://docs.djangoproject.com/en/2.0/topics/templates/
[30] react-media-player: https://github.com/souporserious/react-media-player
[31] на веб-сайте: https://www.listennotes.com/p/321dd0ce5b974079bd3fc8d65d132912/
[32] встроенный плеер в твиттере: https://twitter.com/ListenHistoryFM/status/955913550605688832
[33] Ansible: http://docs.ansible.com/
[34] Datadog: https://www.datadoghq.com/
[35] Rollbar: https://rollbar.com/
[36] Slack: https://slack.com/
[37] входящие веб-хуки Slack: https://api.slack.com/incoming-webhooks
[38] этого: https://broadcast.listennotes.com/postmortem-on-apr-22-2018-outage-e5a87723d003
[39] WeWork: https://refer.wework.com/i/WenbinFang
[40] люди 996: https://www.nytimes.com/2019/04/29/technology/china-996-jack-ma.html
[41] Vagrant: https://www.vagrantup.com/
[42] VirtualBox: https://www.virtualbox.org/wiki/Downloads
[43] монолитного репозитория: https://danluu.com/monorepo/
[44] PyCharm: https://www.jetbrains.com/pycharm/
[45] iTerm2: https://www.iterm2.com/
[46] tmux: https://github.com/tmux/tmux/wiki
[47] Notion: https://www.notion.so/?r=d1e4526dd2924f4796cd10235cbe132e
[48] G Suite: https://gsuite.google.com/
[49] MailChimp: http://www.mailchimp.com/monkey-rewards/?utm_source=freemium_newsletter&utm_medium=email&utm_campaign=monkey_rewards&aid=da29e56f1e479faf6b4ef3f72&afl=1
[50] ежемесячной почтовой рассылки: https://us16.campaign-archive.com/home/?u=da29e56f1e479faf6b4ef3f72&id=ba72067923
[51] Amazon SES: https://aws.amazon.com/ses/
[52] Gusto: https://gusto.com/r/DhjIT/?utm_source=reflink
[53] Upwork: https://www.upwork.com/
[54] Google Ads Manager: https://admanager.google.com/home/
[55] Carbon Ads: https://www.carbonads.net/
[56] BuySellAds: https://www.buysellads.com/
[57] Cloudflare: https://www.cloudflare.com/
[58] Zapier: https://zapier.com/
[59] Trello: https://trello.com
[60] интервью с подкастерами: https://www.listennotes.com/interviews/
[61] Medium: https://broadcast.listennotes.com/
[62] Godaddy: https://www.godaddy.com/
[63] Namecheap: https://www.namecheap.com/
[64] Stripe: https://stripe.com/
[65] Google speech-to-text API: https://cloud.google.com/speech-to-text/
[66] Kaiser Permanente: https://healthy.kaiserpermanente.org/
[67] Stripe Atlas: https://atlas.stripe.com/
[68] Clerky: https://www.clerky.com/
[69] Quickbooks: https://www.referquickbooks.com/s/Wenbin
[70] 1password: https://1password.com/
[71] Brex: http://brex.com/signup?rc=oPLQ0ZQ
[72] Bonvoy Business Amex Card: http://refer.amex.us/WENBIFIUoH?XLINK=MYCP
[73] Capital One Spark: https://www.capitalone.com/small-business-bank/
[74] January 8, 2019: https://twitter.com/wenbinf/status/1082725746160746496?ref_src=twsrc%5Etfw
[75] карго-культом: http://stevemcconnell.com/articles/cargo-cult-software-engineering/
[76] Источник: https://habr.com/ru/post/467793/?utm_campaign=467793&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.