Como arquitectos, una de nuestras responsabilidades en el proceso de modernización de aplicaciones y de cambio de arquitectura para llegar a un escenario de aplicaciones compuestas, es la de definir el stack tecnológico (componentes de infraestructura y framework de desarrollo).
Hemos puesto en marcha componentes de infraestructura como sistema de contenedores, service mesh, API gateway, broker de mensajería, sistema de identidad y acceso, base de datos documental, etc.
Se ha apostado por un lenguaje de programación (Java), librerías, un framework (Spring) y una batería concreta y limitada de piezas de ese framework.
Nuestra sorpresa ha sido mayúscula cuando hemos visto que, dentro del framework, para utilizar una base de datos de tipo grafo, Neo4J, es mucho más eficiente una componente genérica, Spring Data JDBC, que una de específica Spring Data Neo4J.
En la tabla podéis observar el análisis comparativo realizado al ver que los servicios que estábamos desarrollando contra Neo4J, mediante Spring Data Neo4J, nos estaban obligando a irnos a un bar a tomarnos un bocata de chorizo, cargadito de colesterol, mientras esperábamos a que el servicio resolviese las peticiones:
Spring Data Neo4J | JDBC | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Request | % of cumulative time | Hits | Mean time (ms) | Max time (ms) | Standard deviation | % of cumulative cpu time | Mean cpu time (ms) | Mean allocated Kb | % of system error | % of cumulative time | Hits | Mean time (ms) | Max time (ms) | Standard deviation | % of cumulative cpu time | Mean cpu time (ms) | Mean allocated Kb | % of system error |
ApplicationComponentController.getSystemInfo | 32 | 2 | 7,605 | 10,982 | 4,775 | 16 | 164 | 207,992 | 0 | 37 | 4 | 297 | 1,017 | 480 | 25 | 53 | 4,171 | 0 |
ApplicationComponentListAndCreator.getById | 32 | 2 | 7,598 | 10,976 | 4,777 | 16 | 164 | 207,384 | 0 | 37 | 4 | 296 | 1,014 | 478 | 24 | 53 | 4,138 | 0 |
ApplicationComponentController.getSystemDependencies | 8 | 3 | 1,310 | 2,028 | 1,130 | 22 | 145 | 122,877 | 0 | 6 | 4 | 56 | 66 | 9 | 1 | 3 | 36 | 0 |
ApplicationComponentListAndCreator.getSystemDependencies | 8 | 3 | 1,310 | 2,028 | 1,130 | 22 | 145 | 122,875 | 0 | 6 | 4 | 55 | 65 | 9 | 1 | 3 | 34 | 0 |
ApplicationComponentListAndCreator.getSolutionsOfSystem | 6 | 3 | 929 | 2,770 | 1,594 | 8 | 57 | 63,710 | 0 | 2 | 2 | 43 | 47 | 4 | 0 | 2 | 29 | 0 |
ApplicationComponentController.getSolutionsOfSystem | 6 | 3 | 929 | 2,770 | 1,594 | 8 | 57 | 63,717 | 0 | 2 | 2 | 43 | 47 | 4 | 0 | 3 | 31 | 0 |
ApplicationComponentListAndCreator.getSystemDependents | 2 | 3 | 433 | 1,245 | 703 | 2 | 15 | 48,974 | 0 | 2 | 2 | 59 | 67 | 11 | 0 | 3 | 42 | 0 |
ApplicationComponentController.getSystemDependents | 2 | 3 | 433 | 1,245 | 703 | 2 | 15 | 48,977 | 0 | 2 | 2 | 60 | 69 | 12 | 0 | 3 | 44 | 0 |
El análisis está hecho añadiendo al proyecto la librería JavaMelody.
En conclusión, a veces es mejor usar una llave inglesa para clavar un clavo que hacerlo con la herramienta específicamente diseñada para ello, el martillo.