Pilha de tecnologia chata da empresa de internet one-man


Resultados de pesquisa no ListenNotes.com

O 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 Notes

Pelo 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 terceiros

API


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 API

Para 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 agora

O 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 2017

O 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 WeWork

Eu 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 pycharm

Diversos


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.

Source: https://habr.com/ru/post/pt467793/


All Articles