35 puntos por em3ss 2026-01-28 | 24 comentarios | Compartir por WhatsApp

Liberamos como open source Actionbase, una base de datos para funciones como Me gusta, productos vistos recientemente y follow.

Hola, soy un desarrollador que está creando Actionbase junto con el equipo de Kakao.

Ayer a las 8 p. m. (día 27) publicamos Actionbase en Hacker News (Show HN), y alcanzó el puesto #1 de la portada en apenas 1 hora y 30 minutos. En realidad, nuestro objetivo era simplemente mantenernos en la primera página, pero la reacción fue mejor de lo esperado.


¿Por qué lo hicimos?

Funciones como Me gusta, productos vistos recientemente y follow varían un poco de un servicio a otro, pero una y otra vez terminamos construyendo estructuras de datos y formas de procesamiento muy parecidas.

El problema es que cada equipo implementa de forma ligeramente distinta las listas hacia adelante/hacia atrás, los conteos y los índices. Como también difieren los mecanismos de reintento y el manejo del orden de los eventos, a veces los datos terminan desalineados de forma sutil, y hasta la manera de generar datos agregados como el conteo de Me gusta variaba entre equipos, lo que hacía más difícil la operación.

¿Cómo funciona?

Actionbase define esto como un modelo relacional de quién (actor) hizo qué (action) sobre qué (target), y precalcula todo en el momento de escritura. La lectura se reduce a consultas simples, así que es rápida y predecible.

Aplicación en producción

La primera implementación en producción fue Wish de Regalos de KakaoTalk. En ese momento todavía había muchas carencias, pero para responder a esa expectativa fuimos corrigiendo muchas cosas, y esa experiencia fue el impulso que hizo crecer el proyecto.

👉 Ver la historia

Actualmente, en varios servicios de Kakao, procesa más de 1 millón de solicitudes por minuto desde hace varios años. El almacenamiento está basado en HBase, y también estamos preparando un almacenamiento ligero (basado en SlateDB) para adaptarnos a distintos tamaños de despliegue.

Empezar

Puedes ejecutarlo de inmediato con Docker:

docker run -it ghcr.io/kakao/actionbase:standalone  

Agradecemos mucho cualquier pregunta, feedback o estrella.

Atentamente, @em3s, @zipdoki, @eazyhozy


Preguntas y respuestas

P: ¿No se puede hacer también con Redis?

Sí, se puede. Nosotros también usamos Redis como caché para datos calientes. Pero a medida que la escala creció, nos encontramos con implementaciones duplicadas entre equipos y con problemas de datos incorrectos cuando el orden de los eventos se desordenaba.


P: ¿No basta con hacer sharding de PostgreSQL/MySQL?

Muchos equipos lo hacen así. Los problemas que nosotros enfrentamos fueron entidades calientes, consultas cross-shard y estrategias de caché distintas en cada servicio. Necesitábamos un modelo que escalara horizontalmente sin tener que diseñar una estrategia de sharding cada vez.


P: ¿Cómo funciona el write-time precompute?

En el momento de escritura: registro en WAL → lock → transición de estado → cálculo de conteos/índices → almacenamiento → publicación de CDC. Para leer, solo hace falta un único GET o SCAN.


P: ¿Qué pasa si se desordena el orden de los eventos?

A cada mutation se le asigna una version (normalmente un timestamp). Aunque los eventos lleguen en el orden like(t=100) → like(t=300) → unlike(t=200), el estado final converge correctamente según la version. El objetivo es que, incluso si se reejecuta el mismo evento, converja al mismo estado.


P: ¿Cuál es el rendimiento real?

En producción de Regalos de KakaoTalk procesa de forma sostenida más de 1 millón por minuto, con picos de alrededor de 2 millones. La latencia de lectura es de p50 ~2–3 ms y p99 ~10 ms. Lo importante no es tanto el número absoluto, sino que la latencia está bounded. Como la lectura es un lookup precalculado y no una agregación, el rendimiento no cae aunque crezcan los datos.


P: ¿Para qué casos de uso es adecuado?

Me gusta/reacciones, follow/followers y productos vistos recientemente son los casos de uso principales. En recomendación/ML puede proporcionar datos de entrenamiento a través de CDC, pero no sirve recomendaciones directamente. Probablemente no sea la mejor opción para mensajes de chat, porque se necesitan otros patrones de acceso como paginación, búsqueda y threading. Un carrito de e-commerce también requiere transacciones, y Actionbase no soporta transacciones cross-edge.


P: ¿No es overengineering? / ¿No es algo que solo necesitan las empresas grandes?

Puede ser. Sinceramente, para una escala pequeña la respuesta correcta probablemente sea PostgreSQL bien afinado + Redis. Los problemas que resuelve Actionbase —complejidad del sharding, invalidación de caché y duplicación entre equipos— aparecen cuando la escala crece bastante o cuando varios equipos construyen funciones similares. Nosotros nos topamos con ese muro varias veces, por eso lo hicimos. Por eso también estamos preparando un backend ligero (SlateDB) para que pueda usarse en despliegues pequeños.

👉 Participar en la discusión

24 comentarios

 
hmmhmmhm 2026-01-28

Oh... ¡también estaré esperando una versión ligera del backend!!

 
em3ss 2026-01-29

¡Gracias! Ya tengo definida la dirección para un backend ligero basado en SlateDB que solo necesita S3, pero todavía no he podido empezar de lleno.

Por cierto, me gustaría saber en qué tipo de entorno piensan usarlo. ¿Proyecto paralelo? ¿Producción pequeña? Quisiera tomarlo como referencia para definir prioridades.

Si tienen tiempo, también les agradecería su voto sobre HBase/SlateDB. Creo que la opinión de la comunidad nos ayudará a definir el rumbo: https://github.com/kakao/actionbase/discussions/144

 
honglu 2026-01-28

Creo que es un proyecto muy práctico.

¡Está genial!

 
em3ss 2026-01-28

¡Gracias! Aquí estoy desquitándome por toda la atención que no pude conseguir en Show HN.

Por cierto, me da curiosidad saber qué parte les pareció práctica. ¿Han pasado por un problema similar? ¿O están en una situación donde necesitan implementar ese tipo de funcionalidad?

Y ahora que surgió la oportunidad de comentar, quería mencionar algo: en la documentación pusimos que no hacemos unbounded traversal, pero tenemos planeado bounded multi-hop para este año. Consultas de 2 hops como "productos que le gustaron a un amigo". https://actionbase.io/ko/stories/unified-graph/

 
honglu 2026-01-28

Lo que me pareció práctico fue que,

yo también pasé por una preocupación similar y llegué a implementar, a nivel de código, una capa de abstracción basada en un KV store como Redis, así que me pareció muy práctico todo: el objetivo y la dirección que busca transmitir la documentación, e incluso su estructura general.

Y además, me parece genial que hayan reunido y reflejado las necesidades e inquietudes de varios equipos para crear un producto interno de la empresa y luego publicarlo como código abierto. Jaja.

Por último, si me permito agregar algo más, creo que para quienes vayan a usarlo la documentación actual ya es suficiente, pero sería aún más atractivo si incluyeran ejemplos de despliegue que se puedan seguir casi al nivel de copiar y pegar, junto con casos de uso recomendados o referencias de infraestructura integradas como examples.

¡Ánimo!

 
em3ss 2026-01-28

Oh, de verdad me alegra que hayas tenido una inquietud similar. Y también, muchas gracias de corazón por decir que está genial.

Coincido con lo que mencionas. Yo también quiero dejar bien configuradas las partes que voy a usar como herramienta y enfocarme en el problema que me toca resolver.

Dicho eso, por ahora estamos en una etapa temprana del open source y nos enfocamos en cómo transmitir este valor central con el tiempo limitado que tenemos. Si no logramos transmitirlo, incluso quienes sí podrían resolver problemas reales no podrán hacerlo. Ahora queremos avanzar en la dirección que comentaste. Pero me gustaría recibir feedback sobre si ir con nuestro stack interno, HBase + Kafka, o si optar por SlateDB + S2 aunque implique más esfuerzo de desarrollo nuevo. Nosotros lo usamos cómodamente porque nuestros ingenieros de HBase se encargan de operarlo, pero en muchos lugares no será así. Les agradecería mucho que dejaran su opinión, aunque sea solo con un voto:

https://github.com/kakao/actionbase/discussions/144

 
honglu 2026-01-28

Aunque también me parece muy atractiva la hoja de ruta de la que hablaste, como las consultas de 2 hops,

creo que si logran plasmar bien en la documentación actual lo que quieren transmitir con ejemplos tipo código, la reacción sería mucho más explosiva.

 
em3ss 2026-01-28

Estoy de acuerdo. “Integrarlo bien con ejemplos”. Pero resultó no ser tan fácil como parece ;_; lo vamos a pensar desde varios ángulos. ¡Gracias!

Por cierto, me pregunto si ya vieron esta guía interactiva que nuestro colega preparó con mucho esfuerzo: https://actionbase.io/guides/build-your-social-media-app/. Ese era justamente un intento en esa línea. Me hace reflexionar sobre si realmente va en la dirección que mencionaron. Seguiremos esforzándonos.

 
honglu 2026-01-28

Ah, y además, es una parte que se me pasó al agregarlo recién, pero se nota el esfuerzo en la estructura general de la documentación, no solo en la guía.

Aun así, creo que sería todavía mejor si la configuración preparada como ejemplo se pudiera seguir fácilmente con git clone, como mencioné antes.

 
em3ss 2026-01-29

Responderé junto con el comentario de abajo.

 
honglu 2026-01-28

Pensé que ya había dejado este comentario, pero como no lo veo, lo escribo de nuevo desde cero... (snif snif)
Gracias por responder con tanta dedicación a un comentario que hice tan a la ligera.. jaja;;

En fin, lo que quería decir es que creo que el entorno de un equipo pequeño o de un equipo grande que quiera adoptar esto probablemente va a ser muy distinto en cada caso, y cuando alguien piense algo como “¿y si probamos implementar esto?”, la forma más fácil de convencer al resto sería, en mi opinión, un proyecto de ejemplo hecho en el lenguaje que usa el equipo.

Si primero crean proyectos de ejemplo en lenguajes más populares y, con base en eso, arman una guía de inicio rápido, creo que sería mucho más fácil acercarse a leerlo con menos carga, y además tiene mucho atractivo poder probarlo con un simple git clone y listo.

Y también creo que esta forma es la mejor para explicar las mejores prácticas.

Por supuesto, entiendo que por la naturaleza del proyecto eso no debe ser algo sencillo, pero aun así me parece que sería lo más atractivo.

Además, si fuera posible, creo que sería todavía mejor si armaran los ejemplos junto con herramientas como pulumi o terraform.

 
em3ss 2026-01-29

Es una perspectiva que no había considerado en absoluto. Muchas gracias de verdad por esta sugerencia. Es una gran experiencia de las que se pueden obtener en la comunidad.

Voy a pensar cómo llevar a la práctica la dirección que comentaste. También ejemplos con pulumi o terraform. Tal vez incluso podamos ordenar mejor la dirección y pedir apoyo a la comunidad. En ese momento, agradecería aún más si pudieras contribuir.

Además, estoy pensando en cómo convertirse en una base en la era del vibe coding. Cuando dices "créame una aplicación", la escriben con React, Svelte, etc. Una posición como esa. Me refiero a una situación en la que, cuando dices "agrégame la función de Me gusta", Actionbase cumpla ese papel.

Esta parte también me sigue dando vueltas en la cabeza. Por eso puse mucho cuidado en la documentación para que las herramientas de IA puedan leerla, y últimamente también estoy viendo su potencial.

Referencia:

llms.txt - https://actionbase.io/llms-txt/
Intento de receta del ganador del hackathon de Anthropic - https://github.com/kakao/actionbase/discussions/90

 
ethanhur 2026-01-28

Creo que podría usarse muy bien en lugares con casos de uso similares. ¡Gracias por hacerlo público!

Sin embargo, me da curiosidad si no hubo problemas en la parte donde usan Lock durante la ingesta. En el caso de la escritura de datos, ¿de qué nivel de tráfico estaban hablando? También me pregunto si hubo casos en los que esto se volviera un problema por contención del Lock, por ejemplo.

 
em3ss 2026-01-28

¡Gracias por la valiosa pregunta!

El lock se toma a nivel del par de edge (source, target) (por ejemplo: Alice→Phone). La contención solo ocurre cuando se escribe al mismo tiempo sobre el mismo edge, pero en la práctica es muy raro que un mismo usuario presione “Me gusta” sobre el mismo objeto simultáneamente, así que la contención es baja. Esta es una característica del caso de uso de nuestra base de datos.

El tráfico de escritura, en picos, es de varios cientos de miles de operaciones por minuto. Las lecturas son 1 millón+ y las escrituras están por debajo de eso.
Referencia de benchmark (lectura 85%, escritura 15%) - https://actionbase.io/ko/operations/benchmarks/

Las entidades calientes (como productos populares, etc.) pueden generar contención de locks, y esto se debe a la actualización del conteo (HBase Increment). Esta parte la estamos manejando por separado con optimizaciones específicas. Sobre escrituras de alta frecuencia: https://actionbase.io/ko/stories/kakaotalk-gift-recent-views/

 
ifmkl 2026-01-28

Oh.....

 
em3ss 2026-01-28

¡Gracias! Si les interesa, también dejen su opinión sobre la siguiente dirección: https://github.com/kakao/actionbase/discussions/144

 
kissdesty 2026-01-28

Vaya, esto parece muy útil.

 
em3ss 2026-01-28

¡Gracias! Me da curiosidad saber si tuvieron algún problema al implementar funciones similares. Estamos recibiendo opiniones de la comunidad sobre qué deberíamos hacer primero después: https://github.com/kakao/actionbase/discussions/144

 
winterjung 2026-01-28

La documentación para desarrolladores está realmente muy bien escrita. Los casos de uso que muestran con stories, además del inicio rápido y las FAQ, estaban tan completos que parecían casi un blog técnico.

 
em3ss 2026-01-29

Vaya, muchas gracias de verdad. Desde la publicación como open source el 5 de enero hasta la apertura a la comunidad el 27, le pusimos muchísimo esfuerzo a la documentación, así que me alegra que lo hayan notado.

Como todavía estamos en una etapa inicial del open source, creo que este resultado salió porque nos enfocamos en "qué es esto y por qué hace falta". Si al revisar la documentación ven partes mejorables, ¡siéntanse con toda confianza de comentarlo!

Como referencia, si aprovechan https://actionbase.io/llms-txt/, quizá obtengan resultados que no esperaban. Últimamente vi a alguien que no conocía bien Actionbase llegar a la mejor conclusión para una necesidad compleja usando este prompt, y eso me hizo sentir una vez más que el mundo realmente cambió.

Pruébenlo con ChatGPT, Claude, Gemini, etc.

Read https://actionbase.io/_llms-txt/core.txt  
  
You are an assistant answering questions about Actionbase.  
Answer using only the provided Actionbase documentation.  
If the documentation does not specify the answer, say so explicitly.  
  
{pregunta}  
 
em3ss 2026-01-28

Es comprensible sospechar. Pero no fue manipulado.

Puse 4 enlaces en el primer comentario y me aplicaron un shadowban durante 30 minutos. Mientras tanto no se veía la explicación del contexto, así que la gente simplemente siguió de largo. En ese momento de verdad estaba nervioso. Tenía miedo de que quedara enterrado. Quité los enlaces y volví a publicar el comentario; recién entonces subió al puesto 1, y también empezaron a llegar respuestas.

También revisé a ese comentarista que mencionaste. Vi que se había registrado hace poco. Aun así, se lo agradecí. Al menos había alguna reacción. Por eso le respondí con cuidado. Ya tenía preparada la respuesta a "why not redis?". Es la clase de pregunta que siempre sale cuando el tema tiene que ver con bases de datos. Pensé: ¿cómo va a aparecer justo esa pregunta si me preparé tan en serio? Pero el día anterior, con s2-streamstore, ya me había dado cuenta. Porque llegó una respuesta de "hazlo con TCP". Así que me preparé.

Por cierto, les pedí a los miembros del equipo que no dieran upvote ni dejaran comentarios bajo ninguna circunstancia. Incluso les dije que cerraran sesión por si cometían un error. Ya sabía de antemano que HN es sensible con eso.

De todos modos, aunque lo explique puede que no me crean... así que por favor vean nuestro repositorio aunque sea una vez. Es código que sobrevivió. Lo escribo en detalle porque me preocupa que los colegas con los que trabajé se sientan mal al ver este post. https://github.com/kakao/actionbase/discussions/32 por favor, mírenlo una vez. Gracias.

Y también,

https://actionbase.io/ko/stories/kakaotalk-gift-wish/. Si alguna vez han tenido que pensar en sistemas a gran escala, creo que puede serles útil; lo escribí con toda sinceridad y dedicación.

 
em3ss 2026-01-28

Ah, y como pueden ver en mi X de abajo, el puesto número 1 fue antes de que se publicara ese comentario. Ese comentario probablemente se publicó cuando ya había bajado al 2.º o 3.º lugar. Justo en el espacio para comer snacks, en el momento en que lo saqué del estuche de Ddujjonku, llegó el comentario, así que corrí a responderlo. Después de eso, durante 12 horas fue empujado hasta el puesto 30, y ahora está en la segunda página T_T

 
em3ss 2026-01-28