Todo sobre el patrón CQRS(Command Query Responsability Segregation) mejora del rendimiento, formas de implementarlo, pros/contras y lo implementamos con Debezium, Postgresql, Redis y SpringBoot con Java.
Por fin es Viernes! Y aquí tenéis el post sobre el vídeo dedicado a arquitecturas #CQRS con #Debezium www.albertcoronado.com/2022/10/21/implementando-el-patron-cqrs-con-debezium/ y el código ya está publicado en Github github.com/acoronadoc/java-springboot-cqrs-architecture-sample
Conocía el patrón pero los ejemplos prácticos vistos a vista de pájaro son muy limitados en la red, me ha ayudado a marcar hoja de ruta en algunos flecos en mi conocimiento, muchas gracias por todo el contenido que haces.
Está genial. Solo para complementar. Para iniciar, no necesariamente tienes que tener dos bases de datos, también puede ser implementado basado en drivers,libs, etc. Ejemplo en c# : tienes los comandos con entity framework y las queries con dapper(optimizado para lectura)
Debes tener en cuenta que el valor agregado de una característica normalmente se requiere pagar con otra. No es una bala de plata. Estás dispuesto a sacrificar espacio por velocidad (y disponibilidad) a consultas? Eso sólo lo da el caso de uso que quieras implementar. Recuerdo una caída de github donde no podías hacer push pero podías consultar y descargar los repos. Un excelente ejemplo donde aplica ésta técnica.
Excelente como siempre líder pero creo que esta explicación aplicada a implementar correctamente el Patrón CQRS en Wordpress sería de mucha ayuda para las personas que quieran escalar de mejor manera una solución creada en ese CMS, sé que ese vídeo sería una popular en RU-vid, se puede llamar algo así como: Aprende como hacer tu wordpress 50% más rápido y escalable con CQRS, eso haría popular el vídeo y le sería de mucha ayuda a personas como yo.
Interesante vídeo, se encuentra a faltar remarcar que este patrón no es usable en ningún caso de uso que requiera leer respetando la consistencia de las escrituras. En un app social sí que puede ser de gran ayuda para tener mejor rendimiento
Puedo tener una sola BD pero con dos modelos distintos?? Un modelo relacional que se encargara de los commands.y un modelo con un par de tabla sin constraints donde tendremos los datos replicados del modelo relacional la cual usare para las querys.. La sincronizacion la realizare a traves de triggers...
Hola, al realizar una operación de escritura en la base de datos relacional que se publican los cambios para replicarse en la base de datos no relacional, como sabe a que documento de Redis debe ir para aplicar esos cambios? entiendo que los id en la base de datos para las tablas en la base de datos SQL son unos y los Id de los documentos en Redis son otros, como los relacionas para saber en que documento aplicar los cambios ? Gracias
Una duda: ¿Como controlas los datos que si que están persistidos en la PostgreSQL y que por el motivo que sea ya no están en Redis? un ejemplo de esto sería que Redis al ser BBDD en RAM si se reinicia se pierde toda la información y tal como está implementada esa arquitectura, solo se actualiza Redis si se cambian registros en PostgreSQL, en ese momento ambas bases de datos ya no están sincronizadas. Otra cuestión es ¿si la base de datos en PostgreSQL es muy grande?, eso no se puede cargar en RAM siempre via Redis, por lo que igualmente ¿toca estar viendo que datos no estan disponibles en Redis para irlos a buscar a PostgreSQL?, ya que realmente Redis está haciendo como de cache de lectura de Postgre. Yo normalmente he utilizado algo similar, pero directamente usando PostgreSQL cluster (no recuerdo si fue con pg_pool o algo similar) con 1 master y 2 slaves por ejemplo haciendo que las lecturas las resuelvan los slaves, y las escrituras todas al master, y usando los WAL se mantienen la sincronización entre todos En cualquier caso muy interesante. Muchas gracias
HJola, muy interesante, entonces el debezium ya actua como si fuera un server donde realmente yo como developer lo que tengo que llegar a hacer la mayoria de las veces es simplemente configurar la conexion? , o hay ocasiones donde toque mover codigo?¡
Me pregunto cómo aumentaría el rendimiento teniendo un cluster de CouchDB de lecturas y otro cluster de CouchDB de escritura. La ventaja sería el aclamado sistema de replicación de CouchDB.
Excelente video. Muchas gracias. Tengo entendido que CQRS es un patrón que se considera cuando el workload del sistema es un mayor porcentaje de lecturas versus escrituras, ya que opitmizar un único modelo para dicho escenario es muy difícil. Al segregar en dos modelos distintos permite optimizar cada workload por separado, lo que permite usar productos distintos como lo hiciste en el video usando PostgreSQL y Redis. Por otro lado, si no fuera por Debezium capturar los cambios en las bases de datos de forma standard sería complicado. Por último, si bien Kafka es una buena opción como repositorio de mensajes, ¿sería una opcion también usar un broker tradicional como RabittMQ o AMQ, por ejemplo?
Genial el video 🎉, consideras que se podrías haber evitado incluir la lógica para almacenar el dato en redis, delegando esa responsabilidad a un Kafka connector para redis y de esta forma desentender de esa responsabilidad a tu aplicación, que opinas al respecto ?
hola me sale este error cuando coloco el script para debezium : {"error_code":400,"message":"Connector configuration is invalid and contains the following 1 error(s): The 'topic.prefix' value is invalid: A value is required You can also find the above list of errors at the endpoint `/connector-plugins/{connectorType}/config/validate`"}%
No conocia este patron CQRS. Pero me parece muy interesante. Yo en mi trabajo tengo muchisimas inserccionenes de dispositivos IOTS que me mandan información de las sondas cada 5 minutos. Estoy buscando la manera de poder replicar mi base de datos mysql que sea tolerante a fallos y que no sea la tipica base de datos Maestro-Esclavo. Mi insfraestructura la he montado yo en un servidor que tengo a tal efecto (nada de amazonws o google cloud) ¿Alguien por aqui con alguna solución para replicar de forma segura la base de datos reduntante por si en algun momento se cae poder tener una segunda base de datos como si fuese la principal?
¿No has pensado en implementar tu BD en MongoDB? podrías crear un Cluster de servidores de BD y de esa manera ya no tienes el problema de una sola BD que podría fallar. El Cluster mantiene todo siempre andando. Incluso no necesitas que todos los servidores del Cluster estén el mismo lugar físico (que es lo recomendable).