Cómo saber si Apache Kafka es adecuado para ti

Apache Kafka ha crecido mucho en funcionalidad y alcance en los últimos años. Se utiliza en la producción por un tercio de las compañías Fortune 500, incluidos siete de los 10 principales bancos mundiales, ocho de las 10 principales compañías de seguros y nueve de las 10 principales compañías de telecomunicaciones de EE. UU. [Fuente].

Este artículo le ofrece un recorrido rápido por la funcionalidad principal que ofrece Kafka. Presentaré muchos ejemplos para ayudarlo a comprender patrones de uso comunes. Esperemos que encuentre alguna correlación con sus propios flujos de trabajo para que pueda comenzar a aprovechar el poder de Kafka. Comencemos mirando dos funcionalidades centrales ofrecidas por Kafka.

1. Kafka como sistema de mensajería

La mensajería se usa ampliamente de dos maneras:

  • Cola (SQS, apio, etc.): los consumidores de cola actúan como un grupo de trabajadores. Cada mensaje va solo a uno de los procesos de los trabajadores, dividiendo efectivamente el trabajo.
  • Publicar-Suscribir (SNS, PubNub, etc.): los suscriptores suelen ser independientes entre sí. Cada suscriptor obtiene una copia de cada mensaje. Actúa como un sistema de notificación.

Ambos son paradigmas útiles. Las colas dividen el trabajo y son excelentes para la tolerancia a fallas y la escala. Publicar-Suscribirse permite múltiples suscriptores, lo que le permite desacoplar sus sistemas. La belleza de Kafka es que combina los paradigmas de cola y publicación-suscripción en un único sistema de mensajería robusto.

Recomiendo leer la documentación que explica el diseño subyacente y cómo se logra esta combinación con la ayuda de temas, particiones y grupos de consumidores. Para ser justos, esta funcionalidad también se puede lograr con la combinación RabbitMQ o SNS-SQS.

2. Kafka para procesamiento de flujo

Una vez que tenga un sistema de mensajería robusto y escalable, todo lo que necesita es una manera fácil de procesar el flujo de mensajes. Stream API proporciona exactamente eso. Es una biblioteca de cliente Java (ahora también Scala) que proporciona abstracción de mayor nivel que las API de productor y consumidor.

Facilita la realización de:

  • operaciones sin estado, como filtrar y transformar mensajes de flujo
  • operaciones con estado, como unión y agregación en una ventana de tiempo

La API de flujo maneja la serialización / deserialización de mensajes y mantiene el estado requerido para las operaciones con estado.

Muéstrame un código

Aquí hay un ejemplo de Stream API que lee texto plano en la secuencia de entrada, cuenta las apariciones de cada palabra y escribe la cuenta en una secuencia de salida. Vea la versión completa aquí.

Con las ventanas es fácil agregar en un rango de tiempo y realizar un seguimiento de cosas como las palabras N principales ese día (no se demuestra aquí).

Casos de uso típicos de Kafka (ejemplos)

  • Imagina que tienes un sitio web de viajes. El precio de los hoteles y vuelos cambia constantemente. Algunos componentes de su sistema (alertas de precios, análisis) deben ser informados de estos cambios. Publica los cambios en los temas de Kafka, y cada componente que necesita ser notificado actúa como suscriptor. Todos los nodos de un solo sistema de suscriptor forman un solo grupo de consumidores. Un mensaje dado se envía a un solo nodo en el grupo de consumidores. De esta forma, cada componente obtiene la copia del mensaje, y el trabajo se divide efectivamente dentro de cada componente.
  • La actividad del sitio web (vistas de página, búsquedas u otras acciones que los usuarios pueden realizar) se puede rastrear y analizar a través de Kafka. De hecho, este fue el caso de uso original para el que se inventó Kafka en LinkedIn. Las actividades del sitio web se publican en temas centrales con un tema por tipo de actividad. El feed se puede procesar en tiempo real para obtener información sobre la participación del usuario, los abandonos, los flujos de página, etc.
  • Imagine que tiene datos de ubicación procedentes de balizas GPS o dispositivos de teléfonos inteligentes, y desea procesarlos en tiempo real para mostrar la ruta del vehículo, la distancia recorrida, etc. Los datos entrantes pueden publicarse sobre temas de Kafka y procesarse con Stream API. El procesamiento con estado con ventanas es útil cuando necesita extraer y procesar todos los datos de ubicación de un usuario determinado durante un cierto período de tiempo.

Cuando no usar Kafka

  • Si no puede o no quiere pasar a Java / Scala para los servicios que hablan con el clúster de Kafka, entonces se perderá todas las abstracciones de nivel superior proporcionadas por Kafka Streams. Streams API es esencialmente una biblioteca cliente que habla con el clúster Kafka. Confluent, la compañía detrás de Kafka, se centra en Java en este momento. Los lenguajes populares como Python también han tenido un problema abierto para el soporte de transmisión por más de 1.5 años.
  • Si todo lo que necesita es una cola de tareas, considere RabbitMQ en su lugar. Con Kafka, cada partición puede ser consumida por un solo consumidor. Y debe decidir la partición mientras coloca la tarea en la cola. Por lo tanto, es posible que una avalancha de tareas en una partición determinada pueda causar inanición, y no puede hacer nada ya que agregar consumidores no ayuda.
  • Si solo está procesando unos pocos miles de mensajes cada día, entonces Kafka probablemente sea exagerado. Kafka está realmente diseñado para manejar el procesamiento de flujo a gran escala, por lo que configurarlo y mantenerlo no vale la pena si no tiene / anticipa la escala.

Eso es todo amigos. Esto cubre las cosas importantes que necesita saber sobre Apache Kafka. Si disfrutaste leerlo, sigue mi blog. Avíseme si desea ver una descripción general de cualquier otra herramienta.

Ver todos los mensajes de Amit Rathi

Publicado originalmente en blog.amirathi.com el 3 de marzo de 2018.