Pila de tecnología aburrida de la compañía de internet de un solo hombre


Resultados de búsqueda en ListenNotes.com

Listen Notes es un motor de búsqueda y una base de datos de podcasts. La tecnología es realmente muy aburrida. Sin IA, aprendizaje profundo o blockchain. “Si debe anunciar la implementación de AI, entonces no está utilizando AI real” :)

Después de leer este artículo, puedes repetir mi proyecto o hacer algo similar fácilmente. No tendrá que contratar a muchos desarrolladores. Recuerde, cuando Instagram recaudó $ 57.5 millones y fue a Facebook por $ 1 mil millones , solo tenían 13 empleados , y estos no son solo desarrolladores. La compra de Instagram ocurrió a principios de 2012. Ahora es el año 2019, y hoy más que nunca es fácil crear algo significativo con un pequeño equipo de ingeniería, incluso de una sola persona.

Si no has visto Listen Notes, pruébalo ahora:



Revisar


Comencemos con los requisitos o características del proyecto.

Listen Notes ofrece dos funciones:

  • Sitio web para oyentes de podcasts. Aquí hay un motor de búsqueda, una base de datos de podcasts, listas de reproducción para escuchar más tarde , clips guardados cortados de podcasts y notificaciones cuando la palabra clave especificada se menciona en algún nuevo podcast en Internet.
  • Busque podcasts y API para desarrolladores. Necesitamos rastrear el uso de la API, recibir dinero de los suscriptores, brindar atención al cliente y mucho más.

Todo funciona en AWS, solo 20 servidores en producción (a partir del 5 de mayo de 2019):


Servidores que ejecutan Escuchar notas

Por nombre de host, puede adivinar fácilmente qué hace cada servidor.

  • production-web sirve tráfico web para ListenNotes.com.
  • production-api sirve la API de tráfico. Admitimos dos versiones de la API (a partir del 4 de mayo de 2019): v1api (en desuso) y v2api (nuevo)
  • production-db lanza PostgreSQL (maestro y esclavo)
  • production-es lanza el clúster Elasticsearch.
  • El trabajador de producción ejecuta tareas de procesamiento independientes para mantener siempre actualizada la base de datos de podcast y proporcionar algunas características mágicas (por ejemplo, clasificación de resultados de búsqueda, recomendaciones de episodios / podcasts, etc.).
  • production-lb es un equilibrador de carga. Por conveniencia, también ejecuto Redis y RabbitMQ en este servidor. Sé que esto no es perfecto. Pero no soy la persona perfecta. :)
  • production-pangu es un servidor de producción en el que a veces ejecuto scripts únicos y pruebo cambios. ¿Qué es un pangu ?

La mayoría de los servidores se pueden escalar horizontalmente. Es por eso que los llamo producción-algo1 , producción-algo2 , etc. ... Es muy fácil agregar producción-algo3 y producción-algo4 al clúster .

Backend


Todo el backend está escrito en Django / Python3. El sistema operativo es Ubuntu.

UWSGI se usa para servir tráfico web. Instalé nginx antes de los procesos uWSGI, también funciona como equilibrador de carga.

El almacén de datos principal es PostgreSQL , con el que tengo una amplia experiencia en desarrollo y operación durante muchos años. Con tecnología probada, duermes tranquilo por la noche. Redis se utiliza para diversos fines (por ejemplo, almacenamiento en caché, estadísticas ...). Es fácil adivinar que Elasticsearch se usa en alguna parte . Sí, lo uso para indexar podcasts y atender consultas de búsqueda, como la mayoría de las empresas aburridas .

Celery se usa para el procesamiento fuera de línea, mientras que Celery Beat está destinado a programar tareas que son similares a los trabajos de Cron, pero un poco más agradables. Si en el futuro Listen Notes se vuelve popular, y Celery y Beat causan problemas con el escalado, probablemente cambiaré a dos proyectos que hice para el empleador anterior: ndkale y ndscheduler .

El supervisor gestiona los procesos en cada servidor.

Espera, ¿qué pasa con Docker, Kubernetes y la arquitectura sin servidor? Nada de eso. Con experiencia, aprendes a no hacer demasiado. De hecho, trabajé un poco con Docker en 2014 en un trabajo anterior: lo que era bueno para una startup promedio por valor de mil millones de dólares parece innecesario para una pequeña empresa unipersonal.

Frontend


La interfaz web está construida principalmente con React + Redux + Webpack + ES . Bastante estándar en estos días. Cuando se implementa en un entorno de producción, los paquetes JS se descargan a Amazon S3 y se emiten a través de CloudFront .

En ListenNotes.com, la mayoría de las páginas web están representadas a medias en el lado del servidor ( plantilla de Django ) y la otra mitad en el lado del cliente ( React ). La plantilla de la página web proviene del servidor y, en el lado del cliente, la aplicación web interactiva se representa principalmente. Pero varias páginas web están completamente preparadas en el servidor debido a mi pereza y algunos beneficios potenciales de SEO.

Reproductor de audio


Estoy usando una versión altamente modificada de react-media-player . Funciona en el sitio web como un reproductor integrado en Twitter y un reproductor integrado en sitios de terceros:


Reproductor incorporado en sitios de terceros

API


Proporcionamos a los desarrolladores una API de podcast simple y robusta. Crear una API es similar a crear un sitio web. Aquí está la misma pila de Django / Python para el backend y ReactJS para la interfaz (por ejemplo, barra de herramientas API, documentación ...).


Escuchar API Toolbar


Escuchar la documentación de la API

Para la API, necesitamos rastrear cuántas solicitudes usa el cliente en el ciclo de facturación actual y cobrar una tarifa. Es fácil imaginar que Redis se usa activamente aquí :)

Devops


Preparación de la máquina e implementación del código


Ansible se utiliza para el aprovisionamiento. Esencialmente, escribí un montón de archivos yaml para indicar qué archivos de configuración y qué software debería estar en cada tipo de servidor. Puedo implementar un servidor con todos los archivos de configuración correctos y todo el software instalado con solo hacer clic en un botón. Aquí está la estructura de directorios para estos archivos Ansible yaml:


Mejor podría nombrar los directorios. Pero, de nuevo, eso es suficiente ahora

Ansible también ayuda a implementar código en producción. Básicamente, tengo un script de contenedor deploy.sh que funciona en macOS:

  ./deploy.sh producción HEAD web 

Este script toma tres argumentos:

  • Medio ambiente : producción o puesta en escena.
  • La versión del repositorio de listennotes : HEAD significa "simplemente implemente la última versión". Si se especifica la confirmación SHA, implementará una determinada versión del código; esto es especialmente útil cuando necesito retroceder después de una mala implementación.
  • Tipo de servidores : web, trabajador, API o todos. No necesito implementar en todos los servidores a la vez. A veces hago cambios en el código Javascript, luego necesito implementarlo solo en la web, sin tocar la API o los trabajadores.

El proceso de implementación está organizado principalmente por archivos Ansible yaml y, por supuesto, es extremadamente simple:

  • En mi Macbook Pro , si se trata de una implementación para servidores web, los paquetes Javascript se crean y se cargan en S3.
  • En los servidores de destino, git clona el repositorio de listennotes en una carpeta llamada marca de tiempo, busca una versión específica e instala nuevas dependencias de Python, si las hay.
  • En los servidores de destino, un enlace simbólico apunta a la carpeta mencionada anteriormente llamada marca de tiempo, luego reiniciamos los servidores usando supervisorctl.

Como puede ver, no uso estas sofisticadas herramientas de CI. Solo las herramientas más simples y confiables que realmente funcionan.

Monitoreo y Alertas


El monitoreo y las alertas son realizados por Datadog . Un panel simple muestra algunas métricas de alto nivel. Todo aquí está diseñado para aumentar mi confianza al preocuparme por los servidores en producción.


Panel de Datadog para escuchar notas, a partir de diciembre de 2017

Datadog está conectado a PagerDuty. Si algo sale mal, PagerDuty me enviará una notificación por teléfono y SMS.

También uso Rollbar para rastrear el estado del código Django y detectar excepciones inesperadas, notificándome por correo electrónico y Slack.

La holgura es muy activa. Sí, esta es una empresa con una sola persona, por lo que no es necesaria para la comunicación, sino para monitorear eventos interesantes a nivel de aplicación. Además de integrar Datadog y Rollbar con Slack, el código web de backend de Slack también integra los enlaces web entrantes de Slack para notificarle sobre el registro de usuarios o algunas acciones interesantes (por ejemplo, agregar o eliminar elementos). Esta es una práctica muy común en las empresas de tecnología. Si lee libros sobre los primeros años de Amazon o PayPal, descubrirá que ambas compañías tenían un mecanismo de notificación similar: cada vez que un usuario se registraba, se escuchaba un sonido "ding" para notificar a todos en la oficina.

Desde el lanzamiento a principios de 2017, Listen Notes no ha tenido un tiempo de inactividad grave (más de 5 minutos), excepto por esto . Siempre soy muy cuidadoso y práctico al trabajar DevOps. En el caso de los servidores, se proporciona una sobrecarga importante en caso de una gran oleada de asistencia debido a entrar en la prensa u otra cosa.

Desarrollo


Yo trabajo para WeWork en San Francisco. Algunos pueden preguntar, ¿por qué no solo trabajar desde casa o desde algunos cafés casuales? Bueno, realmente valoro la productividad y estoy dispuesto a invertir dinero en ella. No creo que un desastre en el hogar contribuya al desarrollo de software (o cualquier trabajo en el campo del conocimiento / creatividad). Raramente trabajo más de 8 horas al día (lo siento, 996 personas ). Quiero que cada minuto cuente. Por lo tanto, una oficina privada buena y relativamente cara es lo que necesito. En lugar de ahorrar dinero en detrimento del tiempo, optimizo el tiempo para usarlo de manera rentable y ganar dinero.


Mi oficina en WeWork

Yo trabajo en una MacBook Pro. Una infraestructura casi idéntica se ejecuta dentro de Vagrant + VirtualBox . Para el entorno de desarrollo, Vagrant usa el mismo conjunto de archivos Ansible yaml descritos anteriormente.

Apoyo la filosofía de un repositorio monolítico . Por lo tanto, hay un único repositorio de notas de escucha con scripts DevOps, código frontend y backend. Está alojado como un repositorio privado en GitHub. Todo el desarrollo está en la rama principal. Raramente uso brunches.

Escribo código y ejecuto servidores de desarrollo (servidor de ejecución Django y servidor de desarrollo webpack) usando PyCharm . Sí, lo sé, es aburrido. Después de todo, esto no es Visual Studio Code o Atom o algún tipo de IDE genial. Pero para mí, PyCharm funciona bien. La vieja escuela, ¿qué puedes hacer?


Mi pycharm

Misceláneo


Hay toneladas de herramientas y servicios útiles que utilizo para crear Listen Notes como producto y empresa:


Mantén la calma y no tirones ...


Como puede ver, vivimos en un excelente momento para lanzar nuestro negocio. Hay tantas herramientas y servicios listos para usar que ahorran tiempo y dinero, aumentando su productividad. Ahora es el mejor momento de la historia para crear algo útil para la humanidad con un equipo pequeño (o solo con los esfuerzos de una persona), utilizando tecnologías simples y aburridas.

Con el tiempo, las empresas se vuelven cada vez más pequeñas. Ya no es necesario contratar toneladas de empleados a tiempo completo. Para hacer todo el trabajo, puede utilizar los servicios y contratistas SaaS para ordenar.

Básicamente, el obstáculo principal en la creación de un proyecto es el pensamiento excesivo. Qué pasa si eso, qué pasa si eso. Chico, nadie te necesita. Todos están ocupados con sus propios asuntos. Nadie está interesado en ti y en tu proyecto hasta que demuestres que eres digno de atención. Incluso si bloquea el lanzamiento, nadie lo notará. Piensa en grande, comienza en pequeño, actúa rápido. Es absolutamente normal usar tecnología aburrida y comenzar con algo simple (incluso feo) si realmente resuelve el problema.


Ahora hay tantas personas con un culto de carga . Ignora el ruido. Mantén la calma y no te muevas.

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


All Articles