Mejores prácticas de programación funcional Scala o Clojure

11

Realicé una gran cantidad de codificación de autoaprendizaje, obtuve algo de experiencia con modelos de programación paralela: actores, memoria transaccional de software, flujo de datos.

Cuando trato de aplicar estas arquitecturas a la vida real, en aplicaciones web de alta carga, cualquier modelo no admite durabilidad y persistencia para los datos. Las tareas de la vida real requieren guardar datos al final. Esto significa que aún tengo que usar DB y capturar sincronizaciones de DB, posibles cuellos de botella de escalabilidad, etc.

¿Alguien conoce un buen ejemplo de arquitectura (src o texto o diagrama o planos) que use Akka Actors o Software Transaction Memory e implemente la persistencia al final?

Cualquier buen ejemplo / idea para memoria transaccional, actores, flujo de datos, espacios de tupla en aplicaciones de la vida real es bienvenido.

mosquito
fuente
¿Necesitas tanto akka como stm?
om-nom-nom
Parece inusual que consideres la persistencia como "al final". Creo que la "captura de sincronizaciones de DB, posibles cuellos de botella de escalabilidad, etc." son un problema precisamente porque están en el medio de las cosas, más que al final.
Dan Burton,
De acuerdo en que la persistencia ocurre con más frecuencia que al final
@Stas ¿Cómo se relaciona la pregunta con (1) Scala y Clojure, (2) mejores prácticas? Lo que he leído es (1) independiente del lenguaje y (2) relacionado solo con la concurrencia (en particular Durabilidad / Persistencia).
sakisk

Respuestas:

5

Los modelos de actor / STM y la persistencia de la base de datos son algo ortogonales: puede tener fácilmente uno sin el otro, y creo que existe el peligro de confundirlos.

Lograr durabilidad (la D en ACID) es extremadamente complejo en un entorno transaccional, y particularmente en un entorno distribuido donde hay actores / procesos que se coordinan mediante el paso de mensajes. Te metes en problemas espinosos como el problema de los generales bizantinos .

Como resultado, creo que siempre habrá algún grado de adaptación de la solución para cumplir con sus requisitos específicos de persistencia. No hay soluciones de "talla única".

Vale la pena mirar (perspectiva Clojure):

mikera
fuente
5

El modelo de actor funciona bastante bien con la segregación de responsabilidad de comando / consulta (CQRS) , ya que los mensajes a los actores que realizan la manipulación de datos se pueden usar como equivalentes de "comando".

Entonces, ¿qué tiene que ver eso con su problema de persistencia? Bueno, trabajas en la memoria y escribes todos los comandos en un registro, que es una operación más barata porque es solo para agregar, y vuelcas instantáneas de vez en cuando para reducir el tiempo requerido para volver a cargar la base de datos si es necesario (además de que es posible recuperar el espacio utilizado por el registro).

Esta es una técnica bastante común. Mire a VoltDB y Redis para obtener más inspiración.

Daniel C. Sobral
fuente
4

Rich Hickey tiene una nueva creación llamada Datomic. Es un nuevo enfoque para la persistencia, el desacoplamiento del almacenamiento, la gestión de transacciones y las consultas. Se basa en registros inmutables y utiliza un lenguaje de consulta llamado Datalog (comparte características con Prolog). El objetivo clave era permitir una distribución fácil y la implementación en la nube. Se basa en el almacenamiento como un servicio (por lo tanto, no es una implementación concreta, sino que se acopla libremente a través de una API over-the-wire).

En Clojure tenemos STM que nos da ACI, falta la D. Datomic agrega la D.

Marko Topolnik
fuente