Skip to content

Instantly share code, notes, and snippets.

@dobleuber
Created June 14, 2025 00:44
Show Gist options
  • Save dobleuber/6b8ed28eee443072e2a16ed2444a6b7c to your computer and use it in GitHub Desktop.
Save dobleuber/6b8ed28eee443072e2a16ed2444a6b7c to your computer and use it in GitHub Desktop.
Kafka Packages

Perfecto. Voy a investigar los paquetes más recomendados y actuales para trabajar con Apache Kafka en Node.js, enfocados en proyectos modernos de microservicios en producción, compatibles con versiones recientes de Kafka y que ofrezcan soporte tanto para productores como consumidores y otras funcionalidades clave.

Te mostraré opciones con sus ventajas y desventajas, destacando aspectos como comunidad, mantenimiento y rendimiento. Te aviso cuando tenga todo listo.

Paquetes de Node.js para Apache Kafka en Microservicios

Introducción

En un entorno de microservicios, Apache Kafka suele usarse como broker de eventos para integrar servicios de forma desacoplada y en tiempo real. Para Node.js existen varias bibliotecas clientes de Kafka. Un proyecto nuevo en producción debe elegir un paquete con soporte activo, compatibilidad con las versiones más recientes de Kafka (Kafka 3.x en adelante), y funcionalidades completas: producción y consumo de mensajes, gestión de tópicos (crear/borrar tópicos, etc.), y procesamiento de eventos con consumidores en grupo, manejo de offsets, etc. También es importante considerar la comunidad y mantenimiento de la biblioteca (actualizaciones frecuentes, soporte de TypeScript, compatibilidad con Node.js moderno) y la facilidad de integración en la arquitectura de microservicios (por ejemplo, despliegue en contenedores, uso con frameworks como NestJS, etc.).

A continuación se presentan los paquetes de Kafka para Node.js más relevantes y vigentes, con sus ventajas, desventajas y estado de soporte, seguidos de una tabla comparativa.

Principales bibliotecas Kafka para Node.js

  • KafkaJS – Cliente moderno escrito completamente en JavaScript.
  • node-rdkafka – Envoltorio de Node.js para la librería nativa librdkafka (C/C++).
  • Confluent Kafka (CJSK) – Nuevo cliente oficial de Confluent para JavaScript, basado en librdkafka.
  • kafka-node – Cliente histórico en JS nativo (ya desactualizado, último release en 2019).

A continuación analizamos cada paquete:

KafkaJS

KafkaJS es una de las librerías más populares para Kafka en Node.js. Está escrita en JavaScript puro, lo que significa que no requiere componentes nativos ni compilación – facilitando su uso en entornos como contenedores Docker. Ofrece una API moderna basada en promesas/async-await, con productores, consumidores y un cliente de administración para tareas como crear tópicos. Es ligera y fácil de integrar en microservicios JavaScript gracias a su sencillez y a que su API idiomática se siente natural para desarrolladores Node.

Ventajas:

  • Sencillez y ergonomía: API intuitiva y bien documentada, diseñada para promesas (orientada a async/await). Esto simplifica el desarrollo de consumidores y productores asíncronos.
  • Sin dependencias nativas: Al ser puro JS, es fácil de instalar y desplegar en cualquier plataforma Node sin pasos extra. Ideal para ambientes de microservicios donde se busca minimizar complejidad de deployment.
  • Funcionalidad completa: Soporta las características principales de Kafka, incluyendo grupos de consumidores, confirmación de offsets, compresión de mensajes e incluso transacciones. También cuenta con un módulo de administración para gestionar tópicos, partitions, etc.
  • Comunidad amplia: Ha sido ampliamente adoptada; por ejemplo, KafkaJS registra del orden de 1.5 millones de descargas semanales en npm y cerca de 4 mil estrellas en GitHub, reflejando su popularidad. Además, frameworks como NestJS inicialmente adoptaron KafkaJS como transporte Kafka por defecto.

Desventajas:

  • Mantenimiento reciente incierto: KafkaJS, a pesar de su popularidad, no ha lanzado nuevas versiones desde febrero de 2023. Sus creadores originales han reducido su actividad, incluso hicieron un llamado abierto a mantenedores hace un tiempo. Esto genera dudas sobre su evolución para soportar las últimas novedades de Kafka a futuro. De hecho, en la comunidad de NestJS se ha expresado preocupación porque KafkaJS “ya no está mantenido” y eso podría afectar la estabilidad a largo plazo.
  • Características avanzadas retrasadas: Al no tener respaldo corporativo, puede tardar en incorporar nuevas mejoras de Kafka. Se ha observado que KafkaJS suele ir uno o dos años detrás de la librería oficial Java en soporte de features. Por ejemplo, puede carecer de APIs más recientes o de soporte a componentes como Kafka Connect.
  • Rendimiento menor que librerías nativas: En cargas muy altas, una implementación en JS podría no igualar el desempeño de una basada en C/C++. Para la mayoría de aplicaciones es suficiente, pero en casos de throughput masivo o necesidades de latencia ultrabaja, KafkaJS podría consumir más CPU comparado con clientes nativos optimizados.

Comunidad y soporte: A pesar de la pausa en lanzamientos, KafkaJS sigue siendo utilizado extensamente. Existe una comunidad activa de usuarios en Slack y GitHub discutiendo issues. Sin embargo, la falta de mantenimiento oficial es un riesgo. Algunos proyectos grandes están evaluando migrar a alternativas más soportadas. KafkaJS incluye definiciones TypeScript integradas, facilitando su uso en proyectos TypeScript sin paquetes adicionales. Soporta Node.js recientes (probado hasta Node 18/20) y funciona con Kafka 2.x y 3.x en sus funcionalidades estándar (protocolo Kafka es retrocompatible). Para un proyecto nuevo, KafkaJS brinda rapidez de desarrollo, pero se debe considerar el riesgo de soporte futuro si surgen problemas o si Kafka incorpora cambios importantes.

node-rdkafka

node-rdkafka es un cliente Node.js que envuelve la librería nativa librdkafka (escrita en C/C++ y mantenida por Confluent). Esto le permite exponer en Node la misma robustez y rendimiento de la librería oficial C. De hecho, node-rdkafka es mantenido por Blizzard Entertainment desde 2016 y ha sido utilizado en entornos de producción exigentes (p.ej. pipelines de juegos en tiempo real). Soporta productores, consumidores de alto nivel y bajo nivel, grupos de consumidores, y también un AdminClient para crear y eliminar tópicos, etc., aprovechando las APIs de administración de librdkafka.

Ventajas:

  • Alto rendimiento: Al usar librdkafka por debajo, esta biblioteca puede manejar volúmenes muy elevados de mensajes con baja latencia. Está optimizada en C, lo que la hace adecuada para cargas de producción críticas. En comparativas, node-rdkafka suele superar en throughput a implementaciones puramente en JavaScript.
  • Soporte completo de Kafka: Tiende a estar al día con las nuevas versiones de Kafka, porque actualiza la versión de librdkafka utilizada. Por ejemplo, a inicios de 2025 node-rdkafka ya integraba librdkafka v2.10.0, incorporando muchas de las últimas características del broker. Soporta autenticación SASL, compresión, idempotent producers, exactly-once delivery, etc., prácticamente cualquier funcionalidad que librdkafka y Kafka ofrecen.
  • Mantenimiento activo: A diferencia de otras opciones, node-rdkafka sigue recibiendo actualizaciones frecuentes (v3.3.0 lanzada en 2025, por ejemplo). El proyecto cuenta con colaboraciones (Blizzard busca contribuidores activamente) y es considerado suficientemente maduro para uso empresarial. La actividad en GitHub es constante, con releases asiduas (última liberación hace días).
  • Confiabilidad probada: Al ser “battle-tested” en escenarios reales, ofrece confianza. Muchos de los detalles complejos (rebalanceo de consumidores, manejo de offsets, reconexiones) se delegan a librdkafka, reduciendo la posibilidad de errores en la implementación Node.

Desventajas:

  • Mayor complejidad de uso: La API de node-rdkafka es considerada menos amigable o idiomática que la de KafkaJS. Originalmente utiliza estilos de callback o emisores de eventos, lo que conlleva una curva de aprendizaje más pronunciada para desarrolladores acostumbrados a promesas. Aunque se pueden implementar promesas manualmente, la experiencia de desarrollo es más “cervera” (low-level).
  • Dependencia nativa: Dado que requiere librdkafka, la instalación de node-rdkafka puede involucrar la compilación de un módulo nativo o la descarga de binarios. Esto añade complejidad en entornos de CI/CD o Docker (necesita tener compilador o binarios apropiados). En sistemas como Alpine Linux o Windows históricamente ha requerido ajustes (por ejemplo, configurar OpenSSL en MacOS para compilar). Si bien existen binarios precompilados para algunos entornos, el tamaño del paquete (~14 MB) es mayor que alternativas puras JS.
  • Comunidad y adopción moderada: En términos de popularidad, node-rdkafka es menos usado masivamente que KafkaJS. Registra onzas de decenas de miles de descargas semanales (≈60 mil, comparado con >1 millón de KafkaJS). Tiene unas 2 mil estrellas en GitHub – una comunidad activa pero más pequeña. Esto implica menos tutoriales o ejemplos comunitarios disponibles, aunque la documentación oficial cubre bien la API.
  • Integración en microservicios: La necesidad de binarios nativos significa que, en contenedores Docker, hay que elegir imágenes base que compatibilicen (por ejemplo, alpine requiere la variante musl soportada por librdkafka). No es un impedimento grave, pero KafkaJS o otros clientes puros JS son más sencillos en ese aspecto. Además, si se construyen lambdas/serverless, el peso del paquete y dependencias nativas podrían ser una consideración.

Compatibilidad: node-rdkafka incluye definiciones TypeScript en su paquete (archivo index.d.ts), por lo que es usable en TS sin problemas. Requiere Node.js >= 16 (soporta Node 18, 20, 22, etc., según la versión) y es compatible con Apache Kafka 0.9 y superiores (es decir, prácticamente cualquier clúster Kafka moderno, incluyendo 2.x/3.x). Para un proyecto nuevo que necesite máximo rendimiento y soporte a futuro, node-rdkafka es una opción sólida, con la advertencia de que conlleva mayor complejidad en desarrollo y despliegue.

Confluent Kafka (CJSK)

En diciembre de 2024, Confluent (la compañía detrás de Kafka) lanzó oficialmente su cliente Confluent JavaScript Client for Kafka (CJSK), con la intención de proveer a la comunidad de Node un cliente soportado oficialmente y actualizado al ritmo de Kafka. Este paquete (@confluentinc/kafka-javascript en npm) combina lo mejor de las dos aproximaciones anteriores: está basado en librdkafka (similar a node-rdkafka) garantizando rendimiento y paridad de características, pero ofrece una API flexible que puede usarse tanto con callbacks como con promesas, muy parecida a la de KafkaJS. De hecho, Confluent diseñó CJSK pensando en facilitar la migración desde KafkaJS o node-rdkafka, brindando interfaces familiares para ambos.

Ventajas:

  • Soporte oficial y a largo plazo: Es actualmente el único cliente de Kafka para Node con mantenimiento oficial de Confluent (creadores de Kafka). Esto asegura actualizaciones rápidas ante nuevos lanzamientos de Kafka y correcciones críticas. Confluent se compromete a que las funcionalidades del cliente JavaScript se mantengan a la par del núcleo de Kafka, incluyendo soporte oficial de pago si se utiliza con Confluent Platform. Para un proyecto empresarial, esta garantía de soporte es muy valiosa.
  • Compatibilidad con últimas funciones: Al estar basado en librdkafka, hereda inmediatamente el soporte para las novedades de Apache Kafka. Por ejemplo, si Kafka introduce mejoras en la versión 3.x o futura 4.0, es de esperar que este cliente las exponga rápidamente. De hecho, la meta de Confluent es “mantener el paso” con las nuevas características del core de Kafka. Además, CJSK tiene integración nativa con servicios de Confluent como Schema Registry y cifrado de campo (Field Level Encryption), lo que facilita implementar esquemas Avro/Protobuf y seguridad de datos end-to-end en Node.
  • Alto rendimiento con facilidad de uso: Internamente utiliza librdkafka (C altamente optimizado) pero evita que el desarrollador de Node lidie directamente con complejidades de C. Ofrece un API promisificada muy parecida a KafkaJS, por ejemplo métodos async producer.send() y consumer.run() similares a los de KafkaJS, lo que resulta idiomático para desarrolladores JS. También permite callback style (estilo node-rdkafka) para quienes prefieran ese patrón. En resumen, combina rendimiento nativo con una curva de aprendizaje suave.
  • TypeScript y multiplataforma: El cliente provee tipos TypeScript incluidos. Además, Confluent distribuye binarios precompilados para los sistemas operativos y runtimes más comunes (Linux glibc/musl x64/ARM, Windows x64, Mac ARM) y Node 18+. Esto significa que en la mayoría de casos la instalación con npm install no requiere compilar código C/C++, haciendo su integración en microservicios tan sencilla como la de KafkaJS.

Desventajas:

  • Proyecto muy nuevo: CJSK llegó a GA (general availability) a finales de 2024, por lo que aún tiene poca adopción comunitaria comparado con KafkaJS o node-rdkafka. Su número de descargas y estrellas es reducido todavía, y hay menos ejemplos en blogs/Stack Overflow. Es previsible que la adopción crezca dada la promesa de soporte oficial, pero actualmente la comunidad “ampliamente utilizada” aún está construyéndose.
  • Menos probado en campo abierto: Aunque está construido sobre bases sólidas, al ser nuevo no cuenta con el mismo historial de “batallas en producción” que las otras librerías. Las empresas más cautelosas quizá esperen validar su estabilidad en escenarios reales a gran escala. Dicho esto, Confluent ha realizado una beta prolongada (limited availability) antes del GA para pulir detalles, e incluso proporcionó guías de migración desde KafkaJS y node-rdkafka.
  • Requisitos mínimos: Este cliente requiere Node.js 18 o superior, ya que sigue la cadencia LTS moderna. Esto no será problema para la mayoría de proyectos nuevos (Node 18 es LTS vigente), pero en entornos donde aún haya Node 14/16 podría ser un impedimento sin actualizar. También, si bien la instalación es generalmente sencilla, en entornos no estándar no cubiertos por los binarios precompilados podría requerir compilación manual (casos raros).
  • Vinculación con el ecosistema Confluent: Si bien funciona con cualquier Apache Kafka (no requiere usar Confluent Cloud necesariamente), es cierto que muchas de sus características adicionales brillan en conjunto con herramientas de Confluent (Schema Registry, etc.). En proyectos que no usen nada de Confluent Platform, sigue siendo un cliente Kafka excelente, pero algunas funcionalidades añadidas pueden ser irrelevantes. Esto realmente no es una desventaja técnica, solo a tener en cuenta según el stack del proyecto.

Uso en microservicios: CJSK está pensado para integrarse fácilmente en arquitecturas de microservicios Node. Por ejemplo, NestJS ya considera la posibilidad de adoptar el cliente de Confluent en el futuro, dado que es API-compatible con KafkaJS (lo que facilitaría migraciones sin grandes cambios de código). Su soporte de promesas y tipado robusto encaja bien con frameworks modernos. Además, el hecho de no requerir compilación en entornos estándar simplifica los Dockerfiles y despliegues. En resumen, para un nuevo proyecto que busca longevidad y soporte activo, el cliente de Confluent es una opción muy atractiva, combinando rendimiento, características y soporte empresarial.

kafka-node

kafka-node fue durante años la biblioteca de referencia para usar Kafka en Node.js. Es una implementación pura en JavaScript que apareció en la era de Kafka 0.9/0.10 y se volvió popular por su facilidad. Ofrece productores, consumidores (alto y bajo nivel) y compatibilidad básica con las versiones antiguas de Kafka. Sin embargo, ya no se considera vigente: su último release (v5.0.0) fue en noviembre de 2019 y desde entonces el repositorio no ha tenido actividad (está esencialmente abandonado). Esto implica que no soporta directamente las mejoras introducidas en Kafka 2.x y 3.x, aunque para operaciones simples de envío/lectura de mensajes aún funcione con brokers recientes dado que el protocolo Kafka es retrocompatible.

Ventajas:

  • Simplicidad: Era fácil de usar, adecuada para iniciarse con Kafka. Su API, aunque algo verbosa, permitía crear un productor o consumidor con pocas líneas. Para casos básicos (leer y escribir mensajes) sigue siendo relativamente sencillo.
  • Sin dependencia nativa: Al igual que KafkaJS, está escrito en JS puro. Instalarlo no requiere compiladores, lo cual en su momento fue una ventaja frente a node-rdkafka. También poseía alguna integración con Avro mediante complementos externos.
  • Adopción histórica: Muchos tutoriales y ejemplos clásicos de “Kafka con Node” están basados en kafka-node, por lo que existe material (aunque desactualizado). Algunas aplicaciones legadas en producción aún lo utilizan, contribuyendo a que increíblemente siga sumando alrededor de 100 mil descargas semanales en npm (probablemente por inercia de proyectos antiguos).

Desventajas:

  • Proyecto discontinuado: No ha recibido commits en más de 5 años. Esto significa sin nuevas features, sin fixes a potenciales bugs o vulnerabilidades recientes. Por ejemplo, no tiene en cuenta optimizaciones de Kafka 1.0+ como el idempotent producer o linger batch. Tampoco soporta oficialmente autenticación SASL moderna (mecanismos más nuevos) ni las APIs administrativas introducidas en Kafka 2.0. Confiar en una librería sin mantenimiento conlleva riesgo técnico para un nuevo proyecto.
  • Versión de Kafka limitada: Fue diseñada para Kafka 0.9-0.11. Aunque Kafka mantiene compatibilidad, usar kafka-node en un clúster Kafka 3.x puede privarte de funcionalidades críticas (por ejemplo, control de tiempos de reproceso, compresión eficiente, etc.). Ciertas estructuras de datos o campos añadidos en protocolos nuevos no serán manejados. En resumen, no aprovecha plenamente Kafka moderno.
  • Comunidad inactiva: La mayor parte de la comunidad se ha movido a otras librerías. Issues y PRs en el repo permanecen sin atender. No hay compatibilidad nativa con TypeScript (existían definiciones en DefinitelyTyped, pero también están obsoletas y reportadas como no mantenidas).

Uso recomendado: Para un proyecto nuevo orientado a producción no se recomienda usar kafka-node dada su obsolescencia. Se menciona aquí por ser parte de la historia de Kafka en Node.js y porque todavía se encuentra información al respecto, pero las alternativas modernas (KafkaJS, node-rdkafka, Confluent) son preferibles en todos los sentidos (rendimiento, soporte, futuro).

Comparativa de paquetes principales

A continuación se resume la comparación de los principales paquetes Kafka para Node.js en 2025, considerando implementación, estado de mantenimiento, soporte de TypeScript, y popularidad:

Paquete Implementación Mantenimiento (última versión) TypeScript Comunidad (descargas npm†/GitHub⭐)
KafkaJS JS puro (cliente nativo en Node) Activo pero sin releases recientes (v2.2.4 en Feb 2023). Proyecto comunitario sin respaldo oficial actualmente. Sí (incluye definiciones) Muy alta (≈1.5M descargas/semana, 3.8k⭐). Amplia adopción, pero maintainers inactivos.
node-rdkafka Envoltorio Node de librdkafka (C++) Muy activo (v3.3.1 en 2025, actualiza librdkafka constantemente). Mantenido por Blizzard, abierto a contribuciones. Sí (incluye definiciones) Moderada (≈60k descargas/semana, 2.1k⭐). Comunidad más pequeña pero uso estable en entornos críticos.
Confluent Kafka (CJSK) Basado en librdkafka + API híbrida (promesas y callbacks) Activo (GA lanzada Dic 2024). Soporte oficial de Confluent con actualizaciones alineadas a Kafka. Sí (incluye definiciones) Emergente (nuevo en 2024, adopción en crecimiento). Respaldo corporativo; menor presencia comunitaria inicial.
kafka-node JS puro (cliente legado) Inactivo (última versión 5.0.0 en 2019). Sin soporte para nuevas características. Parcial (Definiciones TS desactualizadas) Histórica (≈0.1M descargas/semana, 2.6k⭐), pero comunidad prácticamente inactiva hoy. Uso desaconsejado en proyectos nuevos.

†Descargas semanales aproximadas según estadísticas recientes (2025).

Conclusiones y Recomendación

Para un nuevo proyecto de microservicios en producción que use Apache Kafka, las mejores opciones se reducen actualmente a KafkaJS, node-rdkafka o el cliente oficial de Confluent.

  • KafkaJS ofrece la experiencia de desarrollo más sencilla y una gran base de usuarios, pero su falta de mantenimiento reciente supone un riesgo a mediano plazo. Si el proyecto valora una API limpia y rapidez de implementación por encima de las funciones más avanzadas, KafkaJS aún podría ser viable, aunque con la cautela de monitorear posibles forks o sucesores mantenidos por la comunidad.

  • node-rdkafka garantiza rendimiento y solidez. Es ideal si se necesita exprimir al máximo Kafka (grandes volúmenes de datos, baja latencia) y contar con todas las características Kafka disponibles desde el día uno. Requiere un equipo cómodo manejando una librería de más bajo nivel y la complejidad de un módulo nativo. Muchas organizaciones maduras confían en node-rdkafka para cargas de trabajo críticas.

  • El cliente de Confluent (CJSK) representa una propuesta muy atractiva al combinar rendimiento nativo con facilidad de uso estilo KafkaJS, sumado a la seguridad de un soporte oficial a futuro. Para un proyecto nuevo que apunta a largo plazo, esta podría ser la opción más completa y “a prueba de futuro”, siempre y cuando se acepte que es relativamente nueva en el ecosistema. Dado que Confluent lo ofrece abiertamente, no tiene costo usarlo y se beneficia de las contribuciones de la comunidad Kafka. Es especialmente recomendable si el proyecto ya utiliza otros componentes de Confluent (Kafka Cloud, Schema Registry), pero incluso sin ellos, es técnicamente robusto.

En resumen, si priorizamos actualidad y soporte, la balanza se inclina hacia node-rdkafka o CJSK en 2025. Si priorizamos simplicidad y un stack 100% Node.js, KafkaJS sigue siendo una buena herramienta, aunque conviene estar al tanto de su evolución. kafka-node no es aconsejable salvo para mantenimiento de código legado. Considerando todos los factores – compatibilidad con Kafka reciente, funcionalidades completas, comunidad y facilidad en microservicios – la recomendación sería evaluar Confluent Kafka (CJSK) como primera opción (por su enfoque híbrido y soporte garantizado), seguido de cerca por node-rdkafka para quien necesite máxima madurez y rendimiento, o KafkaJS si se valora una solución probada y sencilla mientras se mitiga el riesgo de mantenimiento con tests adicionales y eventualmente migración futura. Cada opción tiene trade-offs, pero con la información de este análisis se puede tomar una decisión informada para dotar al proyecto de un cliente Kafka confiable y eficiente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment