Una guía ficticia para colas distribuidas

Si alguna vez se ha preguntado de qué se tratan Kafka, Heron, transmisión en tiempo real, SQS o RabbitMQ , este artículo es para usted. Discutiré en detalle por qué necesitamos una cola para la arquitectura de software moderna de hoy, cuáles son algunas de las tecnologías comunes que se usan y cómo se usan comúnmente las colas en la industria. Si disfruta de este artículo, tengo un curso sobre escalado de sistemas distribuidos en el que analizo estos temas con más detalle.

¡Bien, entremos en ello!

En primer lugar, ¿por qué necesita un agente de cola / mensaje?

La historia de cómo una cola salvó los puestos de limonada

¿Imagina que está preparando una limonada? stand, y creó una pequeña e ingeniosa aplicación web que mantiene un registro de la frecuencia con la que sus clientes regresan a su puesto de limonada.

Su aplicación web tiene un punto final, digamos yourlemonade.com/traffic, y cada vez que hace clic en un botón, el recuento de tráfico aumenta en 1. Hermoso.

A medida que aumenta el tráfico hacia su puesto de limonada, hace clic cada vez más en el botón. Bueno, dado que vive en un vecindario relativamente pequeño, solo recibe de 10 a 20 personas por día. Sus ventas continúan como de costumbre, la aplicación web maneja el tráfico sin problemas y todo está bien y elegante. Perfecto.

La pesadilla de un negocio en auge

Ahora que su puesto de limonada se ha hecho un nombre, la gente de toda la ciudad está acudiendo en masa para probar su famosa limonada. Y en una hermosa mañana de domingo, las noticias locales decidieron promocionar su stand, y el tráfico EXPLOTÓ .

Como puede imaginar, el tráfico hacia su puesto de limonada aumenta de 10 a 20 personas por día a 10,000 por día. Estás tocando el botón de tráfico con furia, lo que a su vez activa una llamada a yourlemonade.com/traffic, y tu aplicación web sigue aumentando la cantidad de tráfico.

Desafortunadamente, su aplicación web está alojada en un servidor de 8 bits y 128 MB de RAM en el garaje de su casa. Con el negocio en auge y el aumento del tráfico, su aplicación web ya no puede manejar la escala del tráfico.

Finalmente, su servidor muere. ☠️

Con eso, toda su aplicación web se cae. Ya no puede realizar un seguimiento del tráfico. La gente se apresura, los pedidos se acumulan, pero su aplicación web está inactiva y no puede manejar ninguna transacción hasta que pueda comenzar a registrar el tráfico nuevamente.

¿Qué haces?

Cola al rescate

Un momento de brillantez te llama la atención, ¿y si coloco una caja frente al mostrador donde cada cliente puede simplemente dejar una nota diciendo que estaban allí?

Cada vez que un cliente entra por la puerta y hace un pedido, usted le pide cortésmente que deje sus hojas de pedido en una pequeña caja ubicada frente al mostrador de pagos. ¡Excepcional! Básicamente, ha introducido un mecanismo para realizar un seguimiento de las llegadas y, al mismo tiempo, permitir que su negocio funcione como de costumbre.

Esto es lo que llamamos procesamiento asincrónico y bienvenido al mundo de las colas . ?

Cuando comienzas a construir software, al igual que el puesto de limonada que mencioné anteriormente, es común que una tarea

  1. llamar a un servicio, luego
  2. esperar a que termine el servicio, y luego
  3. pasar a la siguiente tarea.

Esto es lo que se llama procesamiento sincrónico. El procesamiento asincrónico , por otro lado, permite que una tarea llame a un servicio y pase a la siguiente tarea mientras el servicio procesa la solicitud a su propio ritmo. Es por eso que una cola es una forma hermosa y elegante de desbloquear sus sistemas porque coloca una capa frente a sus servicios y les permite abordar las tareas a su propio ritmo.

Si una cola es tan poderosa, ¿por qué no la ponemos delante de todo?

Como puede atestiguar cualquiera que haya incursionado en sistemas distribuidos, escalar un sistema distribuido es extremadamente complicado y complicado. Hay algunas cosas que debe saber acerca de las colas que pueden hacer que una cola sea una propuesta poco atractiva para su sistema.

Algunas preguntas que haría antes de decidir si una cola es la solución adecuada para usted:

  • ¿Su servicio tiene problemas debido al alto tráfico? Si no es así, tal vez debería investigar cuál es el cuello de botella antes de saltar a las colas. Como dijo Donald Knuth, la optimización prematura es la raíz de todos los males.
  • ¿Tiene experiencia interna en la gestión de una cola? ¿O necesita contratar potencialmente a un equipo para que lo haga por usted? Los costos de mantenimiento, como escalar la cola, pueden dispararse si no se tiene cuidado. Hay servicios como Amazon SQS (Simple Queueing Service) que ofrecen una solución administrada (es decir, no necesita mantener nada por su cuenta).
  • ¿Es posible tener entradas duplicadas en la cola? Si es así, ¿es eso aceptable?
  • ¿Necesita mantener un registro de todas las transacciones, en caso de que se caiga una cola?
  • En el caso de que una cola se caiga, ¿la cola debe poder reproducir todas las entradas? ¿Cuáles son sus opciones de respaldo?

Hay muchas más preocupaciones que pueden ser específicas de su caso de uso, pero con suerte, he dejado claro que agregar una cola no es tan fácil como chasquear los dedos.

Cómo se utilizan las colas en la arquitectura moderna

Las colas son omnipresentes en la arquitectura de sistemas distribuidos modernos de hoy en día, adoptadas en varias industrias para diferentes casos de uso, y cada día hay más casos de uso nuevos.

Estos son algunos de los casos de uso del mundo real para las colas:

Transmisión en tiempo real

Cuando apareció MapReduce, fue un fenómeno enorme en la industria porque permitió a simples mortales procesar petabytes de datos en una cantidad de tiempo razonable, desde días hasta horas. Esto puede parecer absurdo hoy, cuando los datos están disponibles en casi segundos, pero antes de MapReduce, no era fácil extraer datos utilizables de conjuntos de datos extremadamente grandes.

El apetito por el análisis de datos ha crecido y ahora estamos analizando el procesamiento de datos en horas y, a veces, milisegundos .

Para lograr análisis y rendimiento de baja latencia de manera continua, se concibió el concepto de transmisión en tiempo real.

Un ejemplo útil aquí es pensar en anuncios: los anuncios en Twitter, por ejemplo, se muestran a millones de personas por día. Sin embargo, para asegurarse de que los usuarios no vean los mismos anuncios varias veces en un período de tiempo determinado, Twitter necesita saber de alguna manera la última vez que un usuario estuvo expuesto a un determinado anuncio.

Si hubiéramos confiado en MapReduce para realizar esta acción, ni siquiera se consideraría una solución porque tomaría más de horas procesar todos esos datos. En cambio, la transmisión en tiempo real nos permite procesar las impresiones de anuncios a medida que llegan. Todo esto es posible gracias a las colas que permiten que los datos se transmitan y procesen continuamente en tiempo real.

Algunas tecnologías de las que hablará con frecuencia en los casos de uso de transmisión en tiempo real son Kafka, transmisiones de Kafka, Redis, Spark Streaming (que es diferente de Spark), etc.

Arquitectura impulsada por eventos

Las colas se utilizan como un componente crítico de una arquitectura impulsada por eventos, o coloquialmente conocidas como Pub (lisher) - Sub (scriber). La arquitectura impulsada por eventos es, según Wikipedia:

La arquitectura impulsada por eventos (EDA) es un patrón de arquitectura de software que promueve la producción, detección, consumo y reacción a eventos.

Me gustaría pensar en esto como suscribirse a un boletín: como productor de un boletín, usted sabe quién está suscrito a su boletín y quién no. Escribe el contenido y luego lo envía a sus suscriptores.

Por otro lado, como suscriptor, es posible que esté suscrito a varios boletines, pero no sabe quiénes son los otros suscriptores. Pero eso realmente no te importa. Esta es una característica realmente agradable porque ahora puede escribir software que escuche un montón de eventos y solo responda a los que le interesan.

RabbitMQ y Amazon SQS (Simple Queueing Service) son algunas de las tecnologías que se utilizan a menudo para este tipo de casos de uso.

Infraestructura distribuida, tolerante a fallos y escalable

Los sistemas distribuidos son propensos a errores y una cola es una de las varias formas de aumentar la resiliencia en la arquitectura. En una arquitectura de microservicios (o arquitectura orientada a servicios), varios microservicios se comunican entre sí a través de colas como interfaces compartidas.

Cuando un microservicio falla inesperadamente, una cola aún puede aceptar mensajes. Esto esencialmente proporciona un búfer para que nuestro microservicio se recupere. Una vez que el microservicio vuelve a estar en línea, puede recoger los mensajes de la cola y procesarlos nuevamente.

Piense en ello como su buzón de correo. Mientras esté de vacaciones en Hawái, el cartero seguirá entregando su correo en el buzón. Una vez que regrese de sus vacaciones, puede recoger el correo y procesarlo a su gusto.

¡Gracias por leer! Espero que haya aprendido un par de cosas sobre las colas distribuidas de mi artículo. Si disfrutó leyendo esto, deje un aplauso y siéntase libre de unirse a mi boletín aquí donde escribo sobre software y entrevistas técnicas.

Recursos que recomiendo

Para comprender mejor las colas y los diversos temas mencionados anteriormente, recomiendo encarecidamente estos recursos a continuación. O únase a mi curso sobre escalado de sistemas distribuidos para obtener más información sobre las colas :)

  • Diseño de aplicaciones con uso intensivo de datos: ¡Un libro fantástico para aprender a escalar sistemas distribuidos! Muy recomendable.
  • Kafka the Guide: utilicé este libro como guía de referencia y lo disfruté para la descripción de alto nivel.
  • Kafka Streams: este es un artículo informativo de Confluent que habla con algunos detalles de alto nivel sobre la implementación de Kafka del procesamiento de flujos.
  • Elementos de las entrevistas de programación: ideal para resolver problemas de codificación.
  • Cracking The Coding Interview: excelente para cubrir problemas fundamentales de codificación de CS.
  • Daily Coding Problem.com: este es un sitio web gratuito que ofrece problemas de codificación diarios gratuitos. Puede inscribirse en interesantes desafíos de codificación diarios y puede pagar por las soluciones si lo desea. Si usa mi enlace de referencia (dailycodingproblem.com/zhiachong), ¡obtendrá $ 10 de descuento!

(Para su información, comparto más recursos en mi sitio web: zhiachong.com, donde personalmente he probado y probado, y lo recomiendo para ingenieros de software de todos los niveles)

¡Salud!