Resultados de pesquisa no ListenNotes.comO Listen Notes é um banco de dados de mecanismo de pesquisa e podcast. A tecnologia é realmente muito chata. Sem IA, aprendizado profundo ou blockchain.
“Se você deve anunciar a implementação da IA, não está usando a Real AI” :)
Depois de ler este artigo, você pode repetir meu projeto ou facilmente fazer algo semelhante. Você não precisará contratar muitos desenvolvedores. Lembre-se,
quando o Instagram levantou US $ 57,5 milhões e foi para o Facebook por US $ 1 bilhão , eles tinham apenas
13 funcionários - e esses não são apenas desenvolvedores. A compra do Instagram ocorreu no início de 2012. Agora é o ano de 2019 e, hoje, mais do que nunca, é fácil criar algo significativo com uma pequena equipe de engenharia - mesmo de uma pessoa.
Se você não viu o Listen Notes, tente agora:

Revisão
Vamos começar com os requisitos ou recursos do projeto.
O Listen Notes fornece duas funções:
- Site para ouvintes de podcast. Aqui está um mecanismo de pesquisa, um banco de dados de podcasts, listas de reprodução para ouvir mais tarde , clipes salvos cortados de podcasts e notificações quando a palavra-chave especificada é mencionada em algum novo podcast na Internet.
- Pesquise podcasts e APIs para desenvolvedores. Precisamos acompanhar o uso da API, receber dinheiro de assinantes, fornecer suporte ao cliente e muito mais.
Tudo funciona na AWS, apenas 20 servidores em produção (em 5 de maio de 2019):
Servidores executando Listen NotesPelo nome do host, você pode adivinhar facilmente o que cada servidor faz.
- production-web serve o tráfego da Web para ListenNotes.com.
- A API de produção atende à API de tráfego. Suportamos duas versões da API (a partir de 4 de maio de 2019): v1api (descontinuado) e v2api (novo)
- production-db lança PostgreSQL (mestre e escravo)
- production-es lança o cluster Elasticsearch.
- O operador de produção executa tarefas de processamento independentes para manter sempre o banco de dados de podcast atualizado e fornecer alguns recursos mágicos (por exemplo, classificação de resultados de pesquisa, recomendações para episódios / podcasts etc.).
- lb de produção é um balanceador de carga. Por conveniência, também executo Redis e RabbitMQ neste servidor. Eu sei que isso não é perfeito. Mas eu não sou a pessoa perfeita. :)
- production-pangu é um servidor de produção no qual às vezes executo scripts únicos e testo alterações. O que é uma pangu ?
A maioria dos servidores pode ser dimensionada horizontalmente. É por isso que os chamo de
produção-algo1 ,
produção-algo2 , etc. ... É muito fácil adicionar
produção-algo3 e
produção-algo4 ao cluster .
Backend
Todo o back-end é escrito em Django / Python3. O sistema operacional é o Ubuntu.
UWSGI é usado para servir o tráfego da web. Eu instalei o
nginx antes do uWSGI processar, ele também funciona como um balanceador de carga.
O principal data warehouse é o
PostgreSQL , com o qual tenho uma vasta experiência em desenvolvimento e operação por muitos anos. Com tecnologia comprovada, você dorme em paz à noite.
O Redis é usado para várias finalidades (por exemplo, armazenamento em cache, estatísticas ...). É fácil adivinhar que o
Elasticsearch é usado em
algum lugar . Sim, eu o uso para indexar podcasts e atender a consultas de pesquisa, como a
maioria das empresas chatas .
O aipo é usado para processamento offline, enquanto o
Celery Beat se destina a agendar tarefas semelhantes às tarefas do Cron, mas um pouco mais agradável. Se, no futuro, o Listen Notes se tornar popular, e o Aipo e o Beat causarem problemas com o dimensionamento, provavelmente
mudarei para dois projetos que fiz para o empregador anterior:
ndkale e
ndscheduler .
O Supervisord gerencia os processos em cada servidor.
Espere, e o Docker, Kubernetes e a arquitetura sem servidor? Nada disso. Com a experiência, você aprende a não fazer muito. Na verdade, trabalhei um pouco com a Docker em 2014 em um trabalho anterior: o que era bom para uma startup média no valor de um bilhão de dólares parece desnecessário para uma pequena empresa de uma pessoa.
Frontend
A interface da Web é construída principalmente usando
React +
Redux +
Webpack +
ES . Bastante padrão nos dias de hoje. Quando implantados em um ambiente de produção, os pacotes JS são baixados no
Amazon S3 e emitidos pelo
CloudFront .
No ListenNotes.com, a maioria das páginas da Web é metade renderizada no lado do servidor (
modelo do Django ) e metade no lado do cliente (
React ). O modelo de página da web vem do servidor e, no lado do cliente, o aplicativo da web interativo é renderizado principalmente. Mas várias páginas da Web estão totalmente preparadas no servidor devido à minha preguiça e a alguns benefícios potenciais de SEO.
Leitor de áudio
Estou usando uma versão altamente modificada do
react-media-player . Ele funciona
no site como um
player embutido no Twitter e um player embutido em sites de terceiros:
Player incorporado em sites de terceirosAPI
Fornecemos aos desenvolvedores uma
API de podcast simples e robusta. A criação de uma API é semelhante à criação de um site. Aqui está a mesma pilha Django / Python para o back-end e ReactJS para a interface (por exemplo, barra de ferramentas API, documentação ...).
Barra de ferramentas da API Listen
Ouça a documentação da APIPara a API, precisamos rastrear quantas solicitações o cliente usa no ciclo de faturamento atual e cobrar uma taxa. É fácil imaginar que o Redis é usado ativamente aqui :)
Devops
Preparação da máquina e implantação de código
Ansible é usado para provisionamento. Essencialmente, escrevi vários arquivos yaml para indicar quais arquivos de configuração e qual software deve estar em cada tipo de servidor. Posso implantar um servidor com todos os arquivos de configuração corretos e todo o software instalado com o clique de um botão. Aqui está a estrutura de diretórios para esses arquivos Ansible yaml:
Eu poderia nomear melhor os diretórios. Mas, novamente, isso é o suficiente agoraO Ansible também ajuda a implantar código na produção. Basicamente, eu tenho um
script wrapper
deploy.sh que funciona no macOS:
web HEAD de produção ./deploy.sh
Este script usa três argumentos:
- Ambiente : produção ou preparação.
- A versão do repositório listennotes : HEAD significa "basta implantar a versão mais recente". Se o commit do SHA for especificado, ele implementará uma certa versão do código - isso é especialmente útil quando eu precisar reverter após uma implantação incorreta.
- Tipo de servidores : web, trabalhador, API ou todos. Não preciso implantar em todos os servidores de uma só vez. Às vezes, faço alterações no código Javascript e preciso implantá-lo apenas na Web, sem tocar na API ou nos trabalhadores.
O processo de implantação é organizado principalmente por arquivos Ansible yaml e, é claro, é extremamente simples:
- No meu Macbook Pro , se for uma implantação para servidores da Web, os pacotes Javascript serão criados e enviados para o S3.
- Nos servidores de destino, o git clona o repositório listennotes em uma pasta chamada timestamp, verifica uma versão específica e instala novas dependências do Python, se houver.
- Nos servidores de destino, um link simbólico aponta para a pasta mencionada acima, chamada timestamp, e reiniciamos os servidores usando supervisorctl.
Como você pode ver, eu não uso essas ferramentas sofisticadas de IC. Somente as ferramentas mais simples e confiáveis que realmente funcionam.
Monitoramento e alerta
O monitoramento e alertas são
feitos pelo Datadog . Um painel simples mostra algumas métricas de alto nível. Tudo aqui é projetado para aumentar minha confiança ao mexer com servidores em produção.
Painel do Datadog para Listen Notes, em dezembro de 2017O Datadog está conectado ao PagerDuty. Se algo der errado, o PagerDuty me enviará uma notificação por telefone e SMS.
Também uso o
Rollbar para rastrear o status do código Django e capturar exceções inesperadas, notificando-me por e-mail e Slack.
Slack é muito ativo. Sim, esta é uma empresa com uma pessoa, portanto, não é necessária para a comunicação, mas para monitorar eventos interessantes no nível do aplicativo. Além de integrar o Datadog e o Rollbar ao Slack, o código da
web de back-end do Slack também integra
ganchos de entrada da Web do Slack para notificá-lo sobre o registro do usuário ou sobre algumas ações interessantes (por exemplo, adicionando ou excluindo elementos). Essa é uma prática muito comum em empresas de tecnologia. Se você ler livros sobre os primeiros anos da Amazon ou do PayPal, descobrirá que as duas empresas tinham um mecanismo de notificação semelhante: sempre que um usuário se registrava, havia um som de "ding" para notificar todos no escritório.
Desde o lançamento no início de 2017, o Listen Notes não teve um tempo de inatividade grave (mais de 5 minutos), exceto por
isso . Sempre sou muito cuidadoso e prático no trabalho do DevOps. Para servidores, é fornecida uma sobrecarga séria no caso de um grande aumento no número de participantes devido à entrada na imprensa ou em outra coisa.
Desenvolvimento
Eu trabalho para a
WeWork em San Francisco. Alguns podem perguntar, por que não trabalhar em casa ou em alguns cafés informais. Bem, eu realmente valorizo a produtividade e estou disposto a investir dinheiro nela. Não acredito que uma bagunça doméstica contribua para o desenvolvimento de software (ou qualquer trabalho no campo do conhecimento / criatividade). Eu raramente trabalho mais de 8 horas por dia (desculpe
996 pessoas ). Quero cada minuto contando. Assim, é necessário um escritório particular bom e relativamente caro. Em vez de economizar dinheiro em detrimento do tempo, otimizo o tempo para usá-lo com lucro e ganhar dinheiro.
Meu escritório na WeWorkEu trabalho em um MacBook Pro. Uma infraestrutura quase idêntica é executada no
Vagrant +
VirtualBox . Para o ambiente de desenvolvimento, o Vagrant usa o mesmo conjunto de arquivos Ansible yaml descritos acima.
Apoio a filosofia de um
repositório monolítico . Portanto, existe um e apenas um repositório de notas de lista com scripts de DevOps, código de front-end e back-end. Está hospedado como um repositório privado no GitHub. Todo o desenvolvimento está no ramo principal. Eu raramente uso brunches.
Eu escrevo código e executo servidores dev (Django runserver e webpack dev server) usando
PyCharm . Sim, eu sei, é chato. Afinal, este não é o Visual Studio Code ou Atom ou algum tipo de IDE legal. Mas para mim, o PyCharm funciona muito bem. Velha escola, o que você pode fazer.
Meu pycharmDiversos
Existem inúmeras ferramentas e serviços úteis que eu uso para criar o Listen Notes como um produto e empresa:
Mantenha a calma e não brinque ...
Como você pode ver, vivemos um ótimo momento para iniciar nosso negócio. Existem tantas ferramentas e serviços disponíveis no mercado que economizam tempo e dinheiro, aumentando sua produtividade. Agora é o melhor momento da história para criar algo útil para a humanidade com uma pequena equipe (ou apenas com os esforços de uma pessoa) usando tecnologias simples e chatas.
Com o tempo, as empresas se tornam cada vez menores. Não é mais necessário contratar toneladas de funcionários em período integral. Para fazer todo o trabalho, você pode usar serviços e prestadores de serviços SaaS para fazer o pedido.
Basicamente, o principal obstáculo na criação de um projeto é o pensamento excessivo. E se isso, e se isso. Garoto, ninguém precisa de você. Todo mundo está ocupado com seus próprios assuntos. Ninguém está interessado em você e no seu projeto até que você prove que é digno de atenção. Mesmo se você bloquear o lançamento, ninguém notará. Pense grande, comece pequeno, aja rápido. É absolutamente normal usar tecnologia chata e começar com algo simples (mesmo feio) se você realmente resolver o problema.
Agora, existem tantas pessoas com um
culto à carga . Ignore o barulho. Mantenha a calma e não sacuda.