Plataforma Abierta de Telecomunicaciones

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 15 de marzo de 2022; las comprobaciones requieren 3 ediciones .
Erlang/OTP
Tipo de Marco de software
Desarrollador Ericsson
Escrito en Erlang
Sistema operativo plataforma cruzada
Primera edición 1996
ultima versión 25.0 [1] (18 de mayo de 2022 ) ( 2022-05-18 )
Licencia Licencia Apache 2.0
Sitio web erlang.org

Open Telecom Platform , OTP , Erlang/OTP (“plataforma abierta de telecomunicaciones”) es un marco de software (framework) que contiene un conjunto de bibliotecas y patrones de diseño para crear aplicaciones distribuidas escalables en el lenguaje de programación Erlang [2] .

El marco fue creado por Ericsson como parte del proyecto de enrutadores ATM de la serie AXD en la unidad de producción del mismo nombre [3] y lanzado en 1996 [4] , incorporando muchos años de experiencia en la creación de sistemas tolerantes a fallas [3] .

La alta confiabilidad de las aplicaciones es posible gracias al mecanismo de manejo de excepciones simple pero poderoso en el que se construyeron las bibliotecas genéricas. Usando las bibliotecas del marco OTP, el desarrollador de Erlang programa el comportamiento deseado y las bibliotecas se encargan del manejo de excepciones. Este enfoque acorta el código y normalmente introduce menos errores [5] .

En su disertación, Joe Armstrong explica el enfoque para programar sistemas altamente confiables elegido en OTP por la necesidad de abstraer la concurrencia :  una OTP depurada y probada se encarga de la ejecución paralela, mientras que los programadores de aplicaciones menos calificados pueden crear el resto de componentes de una manera más simple y estilo "secuencial" más familiar [6] .

Conceptos básicos

La formalización de los patrones de diseño típicos de la programación competitiva son los comportamientos ( comportamientos ing.  ), implementados como módulos de la biblioteca estándar de Erlang. Los módulos definen funcionalidad genérica para procesos de algún tipo. El programador sólo necesita crear su propio módulo con funciones de devolución de llamada , especificando la funcionalidad . 

El comportamiento de OTP se construye a partir de procesos de trabajo y procesos de supervisión que conforman el árbol de supervisión .   

Los módulos y los árboles de observación juntos forman una aplicación OTP (que no debe confundirse con una aplicación en el sentido de un producto de software terminado). Una aplicación OTP es un componente que implementa alguna funcionalidad que se puede iniciar y detener de forma independiente como un todo, y también se puede reutilizar en otros sistemas [7] . Un ejemplo de una aplicación incluida con Erlang/OTP es Mnesia .

Componentes del comportamiento

La interacción del módulo de comportamiento y el módulo de función de devolución de llamada se produce de acuerdo con el esquema [8] :

Módulo de comportamiento ↔ Proceso ↔ Módulo de función de devolución de llamada

El módulo de comportamiento contiene una funcionalidad común a los procesos de un determinado tipo, incluidas las operaciones características [8] :

El programador describe la funcionalidad específica en el módulo de función de devolución de llamada e incluye lo siguiente [8] :

Así, se pueden distinguir las siguientes partes en el comportamiento [9] :

Algún comportamiento es, por así decirlo, un modelo para un "tipo" particular de procesos (por ejemplo, procesos de tipo gen_fsm). Hablando de manera informal, los procesos del mismo "tipo" ejecutan aproximadamente el mismo código, lo que significa que "entienden" un determinado conjunto de mensajes. Los procesos del mismo "tipo" difieren solo en su estado individual. Se puede trazar una analogía bastante clara entre los procesos y los objetos OOP , con la posible diferencia de que los procesos se ejecutan de forma independiente y concurrente [11] .

Comportamientos básicos y aplicaciones OTP

Servidor genérico (gen_server)

El servidor genérico implementa el modelo cliente-servidor . El inicio del módulo de devolución de llamada para este comportamiento al menos podría verse así [9] :

- módulo ( miservidor ). - comportamiento ( gen_server ). - exportar ([ init / 1 , handle_call / 3 , handle_cast / 2 , handle_info / 2 , finish / 2 , code_change / 3 ]). % seguido de una descripción de las funciones relacionadas con la interfaz de comportamiento

Además de las funciones de devolución de llamada, un módulo puede contener funciones API . En el caso, gen_serverdichas funciones podrían estar iniciando un proceso, así como enviando mensajes síncronos y asíncronos a este proceso. Las funciones API suelen ser contenedores para llamar a las funciones de biblioteca correspondientes. Continuando con el ejemplo anterior [12] :

- exportar ([ start_link / 1 , get_something / 0 , stop / 0 ]). start_link ( Puerto ) -> gen_server : start_link ({ local , ? SERVIDOR }, ? MÓDULO , [ Puerto ], []). % seguido de otras funciones declaradas en la directiva de exportación

La documentación de Erlang/OTP ofrece una descripción de las funciones del módulo de comportamiento y sus funciones de devolución de llamada asociadas en forma de tabla [13] .

Módulo de servidor genéricogen_server: Módulo de devolución de llamada
start_link init/1
call, multi_call handle_call/3
cast, abcast handle_cast/2
- handle_info/2
- terminate/2
- code_change/3

Controlador de eventos (gen_event)

Comportamiento para organizar el manejo de eventos, al igual que en gen_servertérminos de funcionalidad. Una diferencia importante es la capacidad gen_eventde gen_serveragregar o eliminar dinámicamente múltiples controladores de eventos, mientras que el servidor genérico recibe un módulo de funciones de devolución de llamada al inicio. Dado que los eventos son manejados por diferentes módulos, se debe tener cuidado al manejar el estado del bucle [14] .

Máquina de estado (gen_fsm)

Un comportamiento de uso poco frecuente que le permite organizar la lógica de su máquina de estado .

Supervisor

Las tareas del observador incluyen iniciar, detener y monitorear procesos secundarios, que a su vez pueden ser procesos de observador y otros tipos de procesos de trabajo [15] . El observador raíz, es decir, el observador de aplicaciones que observa otros procesos, generalmente recibe un nombre de la forma название_приложения_sup[16] .

Aplicación (aplicación)

En el contexto de OTP, una aplicación tiene un significado especial: es un componente de software (o servicio )[17] ), que consta de un conjunto de archivos de módulo y archivos de metadatos que tienen una estructura de archivos definida por acuerdo en el disco [18] . El sistema Erlang puede iniciar y detener una aplicación OTP como una sola entidad por nombre. Un módulo de comportamientoapplicationgeneralmente tiene un nombre de vistaимя_приложения_appy requiere solo dos funciones para exportarse:start/1ystop/1 [19] .

Características

Erlang/OTP ofrece a los desarrolladores de aplicaciones las siguientes características [20] :

  • Aislamiento ( aislamiento en inglés  ): el impacto de un error en una parte del sistema en otras es mínimo.
  • Redundancia ( redundancia en inglés  ) y conmutación por error automática ( conmutación por error automática en inglés ): en caso de falla de un componente, otro puede asumir su función mediante el uso de procesos de observación. 
  • Identificación de fallas utilizando herramientas del sistema Erlang y herramientas integradas para identificar las causas de los errores . 
  • Actualización de código activo: significa actualizar el software sin apagar el sistema.

OTP en Elixir

El lenguaje Elixir permite el uso de comportamientos y aplicaciones OTP. El siguiente ejemplo muestra un servidor que evalúa el valor de una función. Todas las funciones relacionadas con el servidor se delegan a GenServer [21] :

defmodule Dup.Server use GenServer def handle_call ( :calc_double , _from , x ) do { : reply , x , 2 * x } end end

La función handle_callrecibe del cliente (ignorado en este ejemplo) _from, así como el estado actual del servidor x. Devuelve el estado actual y duplica la variable de estado.

Notas

  1. OTP 25.0 .
  2. Cesarini, Thompson, 2012 , pág. 38.
  3. 1 2 Armstrong, Una historia de Erlang, 2007 .
  4. Cesarini, Thompson, 2012 , pág. 25-26.
  5. Cesarini, Thompson, 2012 , pág. 29
  6. Joe Armstrong, Creación de sistemas distribuidos confiables en presencia de errores de software. Archivado el 16 de mayo de 2008 en Wayback Machine , una disertación, 2003.
  7. aplicación, Manual de referencia del kernel, versión  2.16.3 . Ericsson AB (2013). Archivado desde el original el 1 de noviembre de 2013.
  8. 1 2 3 Cesarini, Thompson, 2012 , pág. 292-293.
  9. 1 2 Martin Logan, et al, 2011 , pág. 97-98.
  10. Terminología de Martin Logan, et al. La documentación de Erlang/ORP solo habla de procesos.
  11. Martin Logan, et al, 2011 , pág. 99-100.
  12. Martin Logan, et al, 2011 , pág. 103-104.
  13. Manual de referencia de STDLIB, gen_server . Consultado el 13 de diciembre de 2013. Archivado desde el original el 14 de febrero de 2014.
  14. Martin Logan, et al, 2011 , pág. 179-182.
  15. Manual de referencia de STDLIB, gen_server . Consultado el 13 de diciembre de 2013. Archivado desde el original el 8 de diciembre de 2013.
  16. Martin Logan, et al, 2011 , pág. 126.
  17. Thomas, 2014 , OTP: Aplicaciones.
  18. Martin Logan, et al, 2011 , pág. 120.
  19. Martin Logan, et al, 2011 , pág. 124.
  20. McCreary, Kelly, 2013 .
  21. Thomas, 2014 , Un servidor OTP.

Literatura

  • Martin Logan, Eric Merritt, Richard Carlsson. Erlang y OTP en acción. - Manning, 2011. - 397 págs. — ISBN 9781933988788 .
  • Cesarini F., Thompson S. Programación en Erlang = Programación Erlang. - M. : DMK Press, 2012. - 488 p. - ISBN 978-5-94074-617-1 .
  • Armstrong, Joe (enero de 2007). "Una historia de Erlang" . Actas de la Tercera Conferencia ACM SIGPLAN sobre Historia de los Lenguajes de Programación . HOPL III. San Diego, California: ACM. páginas. 6-1-6-26. DOI : 10.1145/1238844.1238850 . 978-1-59593-766-7 . Consultado el 6 de diciembre de 2013 . Parámetro obsoleto utilizado |month=( ayuda )
  • Dan McCreary, Ann Kelly. 10.5. Estudio de caso: creación de sistemas NoSQL con Erlang // Cómo entender NoSQL: una guía para gerentes y el resto de nosotros. - Publicaciones de Manning, 2013. - 312 p. - ISBN 978-1-61729-107-4 .
  • Francesco Cesarini, Andy Gross y Justin Sheehy. Riak y Erlang/OTP Archivado el 25 de septiembre de 2013 en Wayback Machine .
  • David Thomas. Programación Elixir. - Estantería pragmática, 2014. - 280 p. — ISBN 978-1-937785-58-1 .

Enlaces