fcbk
Conéctate con TwitterConéctate con Facebook
13

Concurrencia y paralelismo: cómo Sengrid usa Go

1Puntos

hace un mes

Siempre trato de usar analogías para entender toda clase de conceptos, pues a partir de algo sencillo es fácil extrapolar a problemas de mayor complejidad, misma lógica. Por eso abordaré el concepto de concurrencia y en qué se diferencia con paralelismo o procesos en paralelo.

Al final hablaré cómo Sendgrid, una compañía de servicios de marketing por email, utiliza Go como lenguaje primario para el desarrollo de sus aplicaciones.

¿Qué es concurrencia y paralelismo?

Cuando tienes varias tareas que ejecutar y las haces al mismo tiempo necesitas una concurrencia.

Ejemplo

Imagina que tienes dos tareas en el día: llegar de la casa al trabajo (Tarea 1) y hacer una presentación (Tarea 2).

  • Para llegar del trabajo a la casa tienes que tomar tres trenes: A B y C y esto toma 2 horas.
  • Para hacer la presentación toma de tu tiempo 4 horas.

Puedes ejecutar las tareas de tres maneras:

Ejecución secuencial: Puedes ir al trabajo y a la llegada empezar a hacer la presentación. Así entonces, el total de tiempo para ejecutar las dos tareas en este caso, sería de 6 horas.

Ejecución concurrente: te das cuenta que puedes emplear el tiempo en el que permaneces sentado en el tren para sacar tu laptop y adelantar la presentación, mientras llegas el trabajo. Los procesos son interrumpidos, pues no puedes trabajar en tu presentación mientras haces la fila para cada tren y es importante notar, que ambas tareas son ejecutadas por una misma persona.

Ejecución paralela: En este caso, tienes un compañero de equipo al cual le pides que trabaje contigo en la presentación. Al final llegas al trabajo y tienes la presentación lista. En este caso, nota que el trabajo de presentación fue ejecutado por dos personas

Para resumir:

  • En concurrencia trabajas en tareas que son ejecutadas al mismo tiempo y de forma independiente.
  • En paralelismo, divides el trabajo en sub-tareas para que pueda ser finalizado por más ejecutores.

Es especialmente en procesos concurrentes donde Go es fuerte gracias a Goroutines.

package main

import "fmt"funcf(n int) {for i := 0; i < 10; i++ {
    fmt.Println(n, ":", i)
  }
}

funcmain() {
  go f(0)
  var input string
  fmt.Scanln(&input)
}

Este programa consiste en dos Goroutines:

  1. La primera, es la función implícita (main function)
  2. La segunda es cuand se llama go f(0).

En goroutines se ejecuta la siguiente función sin necesidad de que la anterior esté finalizada y con la ayuda de Scaln el programa no termina sin haber dado la oportunidad de imprimir todos los números.

Sendgrid y la adopción de Go

Sendgrid es herramienta usada por empresas como Uber, Spotify o Airbnb para el envío de emails masivos y tiene un tráfico de 500 millones de emails enviados diariamente. Su lenguaje de backend en sus inicios fue Perl, cambiando a Python tiempo después.

“Estos lenguajes no cumplían con las necesidades del negocio y por tanto tomaron la decisión de cambiar a otros lenguajes, entre las opciones estaban Java, Scala y Go.”. Comenta Tim Jenkins, co-founder de Sendgrid.

Uno de sus grandes retos en desarrollo ha sido el uso de programación concurrente y la inclusión de este concepto en Go fue una de las razones principales para su adopción en Sendgrid. Aunque hay más ingenieros que desarrollan en Java, hacer programación concurrente es más complejo, diferente a Go.

Por otra parte, aunque son pocos los desarrolladores en el lenguaje de Google, su comunidad tiende a ser más entusiasta y realmente interesada en aprender cosas nuevas y experimentar.Esta ha sido la clase de desarrolladores que quieren en Sendgrid, según dice Tim en su blog.

Al final, la decisión no sólo estuvo al rededor de adoptar a Go como lenguaje de backend, sino aportar todos sus desarrollos de manera OpenSource con el objetivo de fortalecer la librerías y su comunidad. Aprende Go y desarrolla tus aplicaciones de backend en el Curso de Programación en Go.

Jose
Jose