Este artículo explora un desafío específico dentro de una serie sobre sistemas distribuidos en Fly.io: la construcción de un contador de crecimiento (grow-only counter) utilizando un servicio de almacenamiento clave-valor secuencialmente consistente (SeqKV) de Maelstrom. El objetivo es crear un contador que pueda ser incrementado y leído de manera confiable en un entorno distribuido, donde múltiples nodos pueden intentar modificar el contador simultáneamente.
Inicialmente, se presenta una solución ingenua que intenta implementar el contador utilizando una sola clave en el SeqKV. Esta solución, aunque simple, falla debido a condiciones de carrera: múltiples nodos leen el valor actual del contador, lo incrementan y lo escriben de nuevo, lo que resulta en la pérdida de algunas actualizaciones. Para resolver este problema, se exploran dos enfoques principales. El primero utiliza la operación CompareAndSwap (CAS) proporcionada por el SeqKV para realizar la actualización de manera atómica. Aunque esto evita la condición de carrera, la solución basada en CAS resulta ser no determinista, lo que significa que los resultados pueden variar entre ejecuciones.
El segundo enfoque se inspira en los tipos de datos replicados sin conflicto (CRDTs), específicamente en el contador de crecimiento (G-Counter). En lugar de utilizar una única clave, cada nodo mantiene su propio contador local, asignado a un identificador único. El contador global se obtiene sumando los valores de todos los contadores locales. Esta estrategia elimina las condiciones de carrera porque cada nodo solo modifica su propia copia del contador. Aunque esta implementación no cumple estrictamente con la definición formal de un CRDT (falta la operación de 'merge' y 'compare'), logra el objetivo de evitar conflictos al distribuir el estado del contador entre los nodos. La clave aquí es que el SeqKV actúa como un mecanismo centralizado para compartir el estado de los contadores locales, reemplazando la necesidad de un protocolo de difusión (gossip) típico de los CRDTs puros.
En resumen, el artículo demuestra cómo construir un contador distribuido confiable utilizando un servicio SeqKV, destacando la importancia de evitar condiciones de carrera y explorando la relación entre este problema y los CRDTs. La solución final, aunque no es un CRDT completo, proporciona una forma práctica de implementar un contador de crecimiento en un entorno distribuido, aprovechando la consistencia secuencial del SeqKV para garantizar la integridad de los datos.
