Erlang/OTP 19.0

Justo ayer, 22 de junio, fue liberada la versión 19.0 de Erlang/OTP. En principio me ha decpecionado no encontrar en la distribución las herramientas rebar3, hex y relx tal y como se prometió hace tiempo, pero posee interesantes mejoras, ¿lo revisamos?

De entre las nuevas características más sonadas de Erlang 19.0, considero muy importante la agregación de un nuevo comportamiento para máquinas de estado (no finitas) llamado gen_statem y por supuesto la extensión para mnesia llamada mnesia_ext que nos permite no quedarnos solo en tablas ETS o DETS para utilizar en Mnesia, sino agregar otros backends.

Iremos paso a paso analizando cada mejora.

gen_statem

Podemos pensar que con gen_fsm ya tenemos lo suficiente y no necesitamos realmente este nuevo comportamiento, pero si se ha implementado para mejorar el rendimiento de la aplicación ssh dentro de Erlang/OTP es por algo.

En la documentación de Principios de OTP (en inglés) encontramos una explicación detallada de este nuevo comportamiento. En principio incluye el comportamiento estándar de FSM pero además, permite cambiar el comportamiento (a través del init/1 retornando handle_event_function) para que todos los estados sean gestionados en la misma función.

La ventaja de este último modo es poder definir el estado como algo diferente a un atom y también poder realizar concordancia (match) no solo con el estado, sino también con el evento en sí. Por lo que si un evento es tratado en todos los estados de la misma forma, podríamos escribir la función así:

handle_event(cast, {button, up}, _State, Data) ->
    % cualquier cosa
    {next_state, going_up, Data};

La duda que me queda es si en un futuro FSM pueda desaparecer en pro de dejar este comportamiento como único para tratar todo tipo de máquinas de estados. Seguramente se mantenga de momento y por bastantes versiones aunque sea al menos por mantener la compatibilidad hacia atrás.

mnesia_ext

De esta característica ya había hablado anteriormente cuando intenté hacerla funcionar para usar un backend de LevelDB. Parece que Klarna se mantuvo trabajando en la extensión a través de su repositorio en github y gracias a eso hoy no solo tenemos disponible la extensión dentro de Erlang/OTP y disponible para ampliar a cualquier backend que queramos implementar, sino que ya de por sí tenemos varios backends que podemos usar.

Por ejemplo, este backend de Klarna para PostgreSQL que nos permite realizar el trabajo que realizamos normalmente con mnesia, pero almacenando toda la información en tablas de PostgreSQL.

crypto EVP

Implementación de los nuevos cifrados en crypto. Después de tantas vulnerabilidades en los sistemas de cifrado SSL en general, Erlang se quedó un poco atrás. Muchos sistemas de cifrado han sido marcados como inseguros y se han agregado un nuevo número de sistemas de cifrado.

Esto ha propiciado que se haya reestructurado la API de crypto y se haya aprovechado para hacer mejoras en el rendimiento e incluso para dar soporte a hardware de aceleración criptográfica.

Conclusiones

Hay muchas más mejoras en rendimiento (como open_port que han conseguido que vaya entre 3 y 5 veces más rápido) y nuevas adiciones (algunas experimentales como el soporte para socket unix en gen_udp), pero considero que no son cosas tan importantes como las ya remarcadas.

Personalmente considero que no hay tantas nuevas características como para avanzar a una nueva versión completa. Esperaba encontrar las herramientas del ecosistema y aún más mejoras en la implementación de los mapas sin embargo no me desagrada lo nuevo y espero que siga habiendo más próximamente.

¿Te animas a hacer una máquina de estados?, ¿te interesa implementar un backend para LevelDB, SQLite, Tokyo Cabinet o Redis? ¿quizás convertir a mnesia en el sistema de conexión a base de datos en Erlang? ¿qué propondrías agregar en futuras liberaciones? ¡Déjanos tu comentario!