¿Por qué tantos programadores odian absolutamente las capas de prevalencia de objetos?

9

La prevalencia es una técnica simple para proporcionar propiedades ACID a un modelo de objetos en memoria basado en la serialización binaria y el registro de escritura anticipada. Funciona así:

  • Comience con una instantánea. Serialice el modelo de objetos y escríbalo en un archivo.
  • Crea un archivo de diario. Para cada llamada al modelo de objetos, serialice la llamada y sus argumentos.
  • Cuando el diario se hace demasiado grande, está cerrando, o de lo contrario es conveniente, realice un punto de control: escriba una nueva instantánea y trunca el diario.
  • Para retroceder o recuperarse de un choque o golpe de poder, cargue la última instantánea y vuelva a ejecutar todas las llamadas grabadas en el diario.

Las precauciones necesarias para que esto funcione son:

  • No permita que las referencias de objetos mutables escapen o entren en la capa de prevalencia. Necesita algún tipo de esquema proxy u OID, como si estuviera haciendo RPC. (Este es un error de novato tan común que se ha apodado el ' problema del bautismo ').
  • Toda la lógica accesible desde una llamada debe ser completamente determinista y no debe realizar llamadas de E / S o SO con sentido de lógica empresarial. Escribir en un registro de diagnóstico probablemente esté bien, pero generalmente no se obtiene la hora del sistema o se inicia un delegado asincrónico. Esto es para que el diario se reproduzca de manera idéntica incluso si se restaura en una máquina diferente o en un momento diferente. (La mayoría del código de prevalencia proporciona una llamada de hora alternativa para obtener la marca de tiempo de la transacción).
  • La concurrencia del escritor introduce ambigüedad en la interpretación de la revista, por lo que está prohibido.

¿Es porque ...

  • la gente desarrolló un mal gusto por ellos después de tratar de usar uno en un proyecto que no estaba bien adaptado * ?
  • ¿La defensa estridente de Klaus Wuestefeld apagó a la gente ?
  • ¿A las personas que les gusta el modelo de programación imperativo no les gusta separar la E / S del cálculo , prefiriendo en cambio intercalar la computación con E / S y enhebrar llamadas?
  • las capas de prevalencia son conceptualmente simples y están tan íntimamente ligadas a las características del marco que habitan que generalmente están hechas a medida para el proyecto, lo que las hace demasiado extrañas / no estándar / riesgosas.
  • es demasiado difícil mantener la línea recta, ¿qué debes tener cuidado de no hacer?
  • Las cabezas de los novatos parecen explotar cuando se enfrentan a algo que no es el mismo tipo de aplicación de base de datos de dos niveles que aprendieron a escribir en la escuela. ;)

* Los ataques todo el conjunto de datos en la RAM , que no necesitan escritor concurrencia, y no es necesario hacer consultas ad-hoc, informes o exportar a un almacén de datos. Con disculpas por SQLite, la prevalencia es una mejora en los archivos guardados, no un reemplazo para Oracle.

Jeffrey Hantin
fuente
Ajá. Me preguntaba si tenía un nombre. Siempre tuvo sentido para mí, nunca tuve un nombre para eso.
greyfade
99
¿De qué estás hablando?
TheLQ
Esta es la primera vez que escucho de esto. ¿Qué es?
Jonn
Explicación agregada.
Jeffrey Hantin
1
Ohhh ... Conozco el concepto, pero nunca he hecho esto antes. Me parece bastante ingenioso. Estoy bastante seguro de que no es algo que muchos desarrolladores "odian absolutamente".
Jonn

Respuestas:

6

Creo que parte del problema es que tienen un caso de uso MUY específico (su razón no es adecuada). He creado y trabajado en sistemas que utilizan este enfoque y cuando tiene un problema que en realidad es este problema, puede ser una solución maravillosa.

Otra parte es que se parece mucho a algunos de los fragmentos de almacenamiento de datos personalizados más dolorosos que solía encontrar hace más de 10 años y tiene algunos de los mismos escollos (piense, por ejemplo, en btreive actualizado) que trae su punto "demasiado personalizado", pero también hace que sea difícil encontrar piezas que funcionen con cortesía.

La última parte es que pueden ser muy difíciles de consultar en muchos casos y la gente en general está bastante acostumbrada a poder obtener sus respuestas en este momento.

Cuenta
fuente
11

Creo que primero debes demostrar que tantos desarrolladores los odian por completo. No creo que ese sea el caso. Considere que Fowler, hace un tiempo, formalizó un tipo de patrón para esto aquí .

Steven Evers
fuente
Sí, estoy un poco confundido. Parecen una gran herramienta si los usas por la razón correcta.
Matt Olenik
Solo digo esto porque capté una cantidad absolutamente increíble de dolor por esto de parte de mis compañeros de trabajo.
Jeffrey Hantin
1
@Jeffrey Hantin: Suenan perezosos y de mente cerrada.
Steven Evers
1
Ah, y la piedra angular real del patrón es c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin
4

La respuesta a la pregunta es que si bien la teoría es simple, la práctica no lo es.

Simplemente probar una configuración de este tipo requiere docenas de casos de prueba, agregar un proceso mutli o código de subprocesos múltiples y esto salta a cientos de posibles condiciones que deben probarse, tanto para la persistencia como para la recuperación.

Cualquier monitor de transacciones como CICS, Tuxedo, Weblogic, Websphere, JBOSS o .NET, proporcionará todas estas instalaciones de manera limpia y probada. Y cualquier base de datos proporcionará "suficiente" transaccional / persistencia para la mayoría de las aplicaciones.

Es sobre todo un caso de que la rueda fue inventada y perfeccionada hace mucho tiempo.

James Anderson
fuente
esto, y la tendencia de muchos "arquitectos" a tener un "sabor" favorecido que buscan empujar a cualquier cosa, sin importar cuán inapropiado sea ese diseño para el problema que necesita solución.
Jwenting
@jwenting ¿Entonces eso cae dentro del punto de 'defensa estridente'?
Jeffrey Hantin
2

Los requisitos previos suenan un poco onerosos para codificar, especialmente con la mayoría de los sistemas que no necesitan el cumplimiento de ACID cuando se ejecutan en la memoria. La sobrecarga también suena un poco desagradable: hay mucho seguimiento de estado involucrado allí.

Wyatt Barnett
fuente