Esperando a Servicios en Docker-Dompose — Ahora en Go

Una alternativa a utilizar Bash, escrita en Go

Pablo Cumpián Díaz
DotTech
2 min readJun 25, 2020

--

Este post es una réplica a este artículo de Alfredo Bautista Santos.

Tal y como comenta nuestro compañero, sincronizar el arranque de nuestros contenedores puede ser un problema. Una forma de verlo es como el de un gráfico de dependencias.

El caso más típico es el de tener un servidor HTTP que conecte con servidores de bases de datos y que para establecer conexiones con ellos deba esperar a que hayan abierto sus puertos. Antes de todo ello lo corriente es que hagan uso de un tiempo no despreciable levantando el sistema y cargando/restaurando datos, entre otras tareas.

El script que propone Alfredo para afrontar este problema tiene dos grandes ventajas:

  • La espera está desacoplada de otro tipo de tareas.
  • Es agnóstica con respecto a lo que le rodea (un script en Bash).

Pero también tiene algunos inconvenientes, poniéndonos tiquismiquis:

  • Nuestro contenedor/servicio tiene que ejecutar Bash, lo que implica que entran en juego más procesos del sistema en nuestro contenedor. Por simplicidad pienso que hay que mantener la relación 1:1 entre proceso y contenedor, ya que por definición un contenedor es un proceso aislado con sus recursos.
  • Bash es una dependencia, y las utilidades que tiene el script dentro también lo son.
  • Por Dios, es Bash.

Mi propuesta general es que quien tiene que esperar a arrancar es el proceso del servidor HTTP para recibir peticiones, por consiguiente la espera debe estar dentro de la lógica de este.

Mi propuesta particular es una solución para Go a través del uso de canales y goroutines que permiten reintentar conexiones tras un timeout. Definimos los servidores, su URL y puerto, e iniciamos el checkeo haciéndolos circular por dos canales (para los que estén ready y los que no), hasta que todos estén disponibles y se devuelva el control a la función que ha llamado. Una aproximación simplificada sería la siguiente:

Sí, sí: existe busy waiting, y el timeout es arbitrario, pero es simple en caso de que un circuit breaker se salga de nuestra escala.

El uso de nuestra utilidad sería algo parecido a lo siguiente:

Un ejemplo de uso está en este repositorio con el código al completo. Si nos fijamos en los resultados que muestra el log del servicio www:

Log desplegado al hacer docker-compose up

Conclusión

Si no estamos utilizando orquestación ésta puede ser una alternativa a la descrita por Alfredo Bautista Santos. ¿Cuál es vuestra opinión?

--

--

Pablo Cumpián Díaz
DotTech

Computer Science student at @UNED . Writing about #golang and #javascript.