Patrón CQRS explicado FÁCIL en 10 minutos

Поділитися
Вставка
  • Опубліковано 12 лис 2024

КОМЕНТАРІ • 55

  • @NetMentor
    @NetMentor  2 роки тому +6

    Twitter: twitter.com/NetMentorTW
    Blog: www.netmentor.es/entrada/patron-cqrs-explicado-10-minutos

  • @Jocker88
    @Jocker88 2 роки тому +10

    Aún no había visto este vídeo, la mejor explicación sobre CQRS que he escuchado en los tres años que llevo en el sector. Tengo muchas, pero muchisimas ganas de que salga el libro.
    Gracias por seguir compartiendo :)

    • @CarlosSanchez18
      @CarlosSanchez18 2 роки тому

      Ya salió el libro?

    • @NetMentor
      @NetMentor  2 роки тому +3

      Tuve unos problemas personales y lo tuve que retrasar, con suerte para fin de año..gracias !

    • @miguekos1233
      @miguekos1233 Рік тому

      concuerdo contigo 100% que manera mas brutal de explicar esto

  • @chobechuca7986
    @chobechuca7986 2 роки тому +1

    Despues de ver este video siento que estoy vivo. Gracias maestro!!!

  • @vanessaoviedo540
    @vanessaoviedo540 2 роки тому +1

    Excelente explicaciòn en castellano! Gracias

  • @personaldsentidades1540
    @personaldsentidades1540 6 місяців тому

    Excelente. Muy bien explicado y claro. Saludos desde Argentina. 😊

  • @leal3416
    @leal3416 2 роки тому

    Unas Gracias se quedan cortas. Es un contenido de gran valor.

  • @alexpablo90
    @alexpablo90 Рік тому +1

    Excelente explicación, me gusta mucho tu manera de explicar.

  • @felnarg
    @felnarg 4 місяці тому

    Que buen canal me he encontrado 🫶🏽

  • @marcoguevara7389
    @marcoguevara7389 Рік тому +1

    Excelente contenido, muchas gracias!

  • @leonardojavierrossi4399
    @leonardojavierrossi4399 Рік тому +1

    Excelente video, muy bueno

  • @maurowasil3744
    @maurowasil3744 2 роки тому +1

    Muy bueno! Gracias por compartir

  • @Fran-pl3vn
    @Fran-pl3vn Рік тому +1

    Excelentes videos @NetMentor, muy claros. Me gustaría entender que tipos de mecanismos se podrían aplicar para persistir eventos ante cualquier eventualidad o perdidas que provoquen desincronización entre las bases.
    Gracias por tus contenidos.

    • @NetMentor
      @NetMentor  Рік тому

      Te recomiendo que mires el vídeo del patron productor/consumidor donde se menciona la dead letter queue
      ua-cam.com/video/SA2Htqafj-Q/v-deo.html
      un saludo!

  • @rominareyes8715
    @rominareyes8715 2 роки тому

    Excelente explicación, muchas gracias!

  • @EzequielRegaldo
    @EzequielRegaldo Рік тому +1

    Buen vídeo aunque sería más útil explicar de entrada que hace énfasis a la misma db y no "una db de lectura y otra de escritura" como si fuesen cosas separadas del todo ya que si tienes que solucionar el problema de esa forma es porque haces una mala elección de tecnologías y culpas a la estructura, solucionas el problema ? sí, pero a cambio de otro más grande. Desmenuzar tanto una arquitectura trae más problemas que soluciones, los micro servicios son buenos hasta que te das cuenta que solo es conveniente separar lo que sea necesario y no exagerar, sino tendrás muchos recursos en desuso que no estás explotando y de todos modos pagas por ellos por el % de disponibilidad que dejas en el nodo para evitar crash por falta de recursos, valga la redundancia. En donde trabajo cuando empezó la fiebre de los micro servicios tenían un micro servicio por endpoint, luego se dieron cuenta del desperdicio de recursos por idle state y ahora solo se levantan los endpoints stateless en 1 contenedor, los endpoints statefull en otro y se replican según demanda, comunicados por redis streams + la db por separado en sus propios contenedores. Y la diferencia ha sido de un 30% (+-5%) de diferencia. Lo cual al momento de pagar los VPS ha sido muy notable

  • @yonatancuervo3489
    @yonatancuervo3489 2 роки тому +2

    Excelente video

  • @josemanuelarrietapotes5129
    @josemanuelarrietapotes5129 2 роки тому

    Excelente video, Tienes que hacer uno de kafka integrado a microservicios.

    • @NetMentor
      @NetMentor  2 роки тому

      Hola! no tengo uno de kafka, pero tengo uno de rabbitMQ que al final es otro message broker, ua-cam.com/video/BYKC9w-eHN4/v-deo.html
      Un saludo!

  • @germanalonsotrujillofranco2222
    @germanalonsotrujillofranco2222 2 роки тому

    Muy buen canal, gracias por compartir

  • @edurcdev
    @edurcdev 10 місяців тому

    Hola!! excelente la clase,una consulta veo que trabajas en el ejemplo con IntelliJ IDEA me parece?? si es asi porque ese editor y no visual studio o VScode ?

    • @NetMentor
      @NetMentor  10 місяців тому

      sí, trabajo con rider desde 2017 o así, de aquella VS estaba bastante mal y ya me acostumbre, en mi opinión, rider sigue siendo mejor que VS pero entiendo quien en 2023/24 pueda soportar usar visual studio.
      respecto a VSCode esta aún muy verde en comparación.
      Un saludo

  • @nelsongomez8547
    @nelsongomez8547 Рік тому

    Hola buenas noches, excelente video.
    Tuve la oportunidad de ver en un proyecto el cual usaron CQRS y
    1.- Apuntaba a la misma base de datos (Es lo correcto? porque veo que en tu video haces referencia a DB separadas)
    2.- Hay una separaciones de clases *pero en el mismo proyecto* para:
    2.1.- Consulta
    2.2.- Eliminacion
    2.3.- Actualizacion
    2.4.- Creacion
    ==> Es lo correcto?
    Agradezco tu orientacion.
    Saludos

    • @NetMentor
      @NetMentor  Рік тому

      utilizar la misma db o un solo proyecto, No es lo correcto, pero tampoco incorrecto, depende del tamaño y uso del sistema, si solo tienes uno o dos endpionts que son crud básicos, hacer dos proyectos es programar de más, así que si es pequeño pues bien; y si fuera pequeño, pero realizas 100k gets por minuto, pues habría que separarlo en otro. Al final todo son pros y contras, y hay que evaluarlos, en mi opinión, si es un servicio pequeño y no tiene un uso excesivo (no necesite escalado) puede estar bien que sea 1 pero si es grande lo suyo es tenerlo partido, principalmente para el escalado

  • @TomasGarijo
    @TomasGarijo 2 роки тому +1

    Lo de los nombres es un debate que seguirá existiendo en los equipos, a mi personalmente no me importa que se ponga Command y Query, o bien en el namespace o en el nombre de la clase, si lo hiciéramos sabría de manera automática que se esta implementando CQRS. Yo suelo ser riguroso en los nombrados, el código se debe leer como si fuera una historia. Gracias por el contenido y por tu trabajo.

  • @manuelmontoya4613
    @manuelmontoya4613 2 роки тому

    Hola, creo que al final lo que entiendo (disculpa mi simpleza), es que la ventaja de tener dos BBDD es que por ejemplo las bbdd NoSql son mucho mas optimas para las consultas que las relacionales (si no toda la parafernalia extra de estos patrones modernos seria simple redundancia gratuita) quizá parezca un poco escéptico, pero es que soy un conceptista puro, lo breve si bueno dos veces mejor . Si acaso no acierto, con gusto acepto tu corrección

    • @NetMentor
      @NetMentor  2 роки тому +1

      esa es una otra es que las podemos escalar de forma diferente, en ciertas aplciaciones las lecturas van a ser 100 veces las escrituras, asi que podemos escalar una parte y no la otra.
      Luego esta el tema de que si haces event sourcing + cqrs + ddd puedes utilizar la base de datos de escritura como source of truth y hacer "pruebas" con la base de datos de lectura, ya que los datos en la de escritura serán siempre correctos.
      Pruebas como por ejemplo cambiar de una base de datos a otra, o migrar el servidor sin miedo a perderlo todo.

  • @fernandocanepari3795
    @fernandocanepari3795 2 роки тому

    Genial, excelente contenido y muy bien explicado!

  • @yoanbello6891
    @yoanbello6891 2 роки тому

    Quisiera como funcianaria el mediador en este patrón. Un saludo y gracias por los videos

    • @NetMentor
      @NetMentor  2 роки тому

      Pues hay gente que utiliza MediatR que es una libreria de . NET que representa el patron mediador para notificar que un domain event esta listo y entonces tienes el handler del integration event en la misma aplicación y en memoria (en vez de tener los eventos en el service bus) , pero la gran mayoria de esta gente lo utiliza 1 a 1.
      Te permite hacer decoupling de la lógica pero ya está, si la comunicación va a ser 1 - n. Te permite hacer pipelines y tal, y en ese escenario yo si utilizaria mediatr. Pero para comunicaciones 1 a 1 a mi me parece excesivo, pero bueno, no esta mal del todo.

  • @infotips2475
    @infotips2475 Рік тому

    Y si complementas la API Lectura con Redis , seria una excelente idea... Saludos !!!!

  • @Marc83bcn
    @Marc83bcn 2 роки тому +1

    Hola, una duda, siguiendo el ejemplo de productos, si mientras se lanza el comando update de un producto llega petición query para recuperar la info del mismo producto, podría darse el caso de que la query no recupere la info actualiza del producto que realiza el command? Me cuesta acabar de ver el tema de sincronizar las bbdd de lectura/escritura. Gracias

    • @NetMentor
      @NetMentor  2 роки тому

      Si, es exactamente lo que sucede y es un resultado esperado, este suceso se denomina consistencia eventual y lo veremos en el curso en un par de vídeos.
      Tengo una explicación en el blog: www.netmentor.es/entrada/consistencia-eventual-microservicios
      Un saludo !

    • @Marc83bcn
      @Marc83bcn 2 роки тому

      @@NetMentor Perfecto, muchas gracias por aclarar las dudas

  • @elperrocheems1044
    @elperrocheems1044 Рік тому

    crack maquina

  • @henryfiestas
    @henryfiestas 2 роки тому +1

    El video mejor explicado de CQRS. ¿Cuál es el link del libro?

    • @NetMentor
      @NetMentor  2 роки тому +1

      Me alegro de que te guste!
      desafortunadamente tuve unos problemas personales durante el verano y no he podido hacer nada, lo intentaré retomar este invierno. Un saludo y gracias!

  • @ulisescruzgonzalez2677
    @ulisescruzgonzalez2677 2 роки тому

    donde se consiguen tus libros, muy buen video

    • @NetMentor
      @NetMentor  2 роки тому

      Gracias! Por ahora no tengo ningún libro, voy a escribir que tiene que ver con sistemas distribuidos, pero por ahora no esta escrito (con suerte para final de año)
      Un saludo!

  • @german1804
    @german1804 2 роки тому

    Muy bien video, tenés algo de Elasticsearch?

    • @NetMentor
      @NetMentor  2 роки тому

      Hola, no, por ahora no tengo nada de elasticSearch y no creo que ponga nada pronto ya que tengo una gran lista de cosas antes de Elastic. Un saludo

  • @ioannisblougouras9083
    @ioannisblougouras9083 6 місяців тому

    Super interesantes tus Videos Amigo!. Tienes cursos de paga?

    • @NetMentor
      @NetMentor  6 місяців тому +1

      Hola!
      No, no tengo cursos de pago, pero tengo un libro que recién saqué está semana
      www.netmentor.es/libros/guia-completa-desarrollo-full-stack

    • @ioannisblougouras9083
      @ioannisblougouras9083 6 місяців тому

      @@NetMentor muchas gracias amigo!

  • @hector9079
    @hector9079 2 роки тому

    Muy bueno

  • @davidromero6053
    @davidromero6053 2 роки тому

    Yo tengo una duda, en el código que nuestras en el video veo que al hacer el create que puede darse el caso de que emitas una publicación de un evento y que luego realmente no llegues a persistir el dato porque pueda ocurrir algún error, problema de conexion etc. Aunque lo colocaras bien, primero persistiendo y luego emitiendo el mensaje podrías tener el mismo problema pero inverso. Como lidias con esos problemas de transacionalidad?

    • @NetMentor
      @NetMentor  2 роки тому

      en este caso tienes tres opciones:
      Si emites el evento al service bus, tu aplicación como tal ya no es responsable de que el resto funcionen bien, si el probelma es que el publicar el evento falla, entonces lo que puedes hacer es una especie de transaccón de que si el mensaje no se propaga, simplemente haces rollback de la base de datos.
      La segunda opción, y la más común es que cuando haces el heathcheck a rabbitMQ (o kafka o lo que uses) si da negativo te saltas todo lo que tienes en cache o en la bbdd local y haces llamadas todo el rato al otro microservicio, la infraestrucutra tendrá más carga de la habitual hasta que se arregle el problema.
      La última opción, aunque es más drástica y requere mucho más código, es tener un state machine, pero es mas para situaciones en las que por ejemplo se va la luz o se cae la app de repente (osea, el proceso se queda a medias) que basicamente guarda en el punto en el que la app ha parado y cuando la app vuelve a empezar, se ejecuta desde ahí.
      Un saludo!

    • @alexpablo90
      @alexpablo90 Рік тому

      @@NetMentor Tuve la misma duda, ¿cómo es el manejo de errores en este sistema?.
      Entiendo que creando una especie de trasacción se puede resolver no me imagino cómo implementar una transación con rabbitMQ (o cualquier otro).
      En la segunda opción, ¿qué codigo extra requiere?
      La tercer opción creo que sólo sería válida en situaciones muy especificias

    • @NetMentor
      @NetMentor  Рік тому

      Técnicamente la tercera opción la puedes conseguir implementando Microsoft Orleans (una librería de Microsoft), pero vaya, por normal general necesitas utilizar el patrón SAGA y si algo da error tener los workflows listos para "recuperar".
      Pero lo más normal en sistemas distribuidos es que el evento se vuelva a leer y si sigue dando error arreglarlo porque es un bug en alguna parte. Dependerá de lo crítica que sea esa parte de la aplicación en si puedes permitirte tener la información incompleta un rato o no.

  • @kmiiloberrio-dev
    @kmiiloberrio-dev 2 роки тому

    No entendí la parte donde el consumer se pega a rabbit MQ y consume el mensaje, este no seria el patrón producers/consumers?, y la pregunta es porque el mensaje desaparece de RabbitMQ, no debería de quedar allí, por si algún otro consumer lo necesita?, porque el consumer va y busca el mensaje?, no es el RabbitMQ quien debería llamar ese consumer y enviarle tal mensaje?, o estoy confundido en la practica y conceptos?

    • @NetMentor
      @NetMentor  2 роки тому +1

      Hola! CQRS y Producers/consumers son dos patrones completamente diferentes, que pueden trabajar a la vez perfectamente, ya que uno no afecta al otro. Por ejemplo, en todos los servicios que el sistema Distribt tienen, no todos cumplen CQRS, si vas al GitHub hay una imagen con etiquetas en donde se cumple cada patrón.
      El motivo por el que el mensaje desaparece de rabbitMQ está explicado en el vídeo de RabbitMQ (ua-cam.com/video/BYKC9w-eHN4/v-deo.html), es porque le exchange publica a las colas y las colas son 1 a 1 con la aplicación (RabbitMQ funciona diferente a Kafka, en Kafka si se queda el mensaje);
      El consumer va y busca el mensaje porque no es rabbitMQ el que hace un push, sino que es la app la que consume (cada X segundos) los mensajes.

    • @kmiiloberrio-dev
      @kmiiloberrio-dev 2 роки тому

      @@NetMentor gracias por la respuesta, pero entonces yo no puedo tener un producers/consumers usando rabbitMQ (solo me permite 1-1)? El tener el patrón de producers/consumers solo lo proporciona el exchange que se esté usando, en el caso de kafka? ¿Ósea es un patrón que viene implementado dentro de la tecnología del broker de mensajería? ¿No es algo que nosotros tengamos que hacer?

    • @NetMentor
      @NetMentor  2 роки тому +1

      Si puedes, te recomiendo que te mires este video ua-cam.com/video/BYKC9w-eHN4/v-deo.html
      Pero resumiendo, el mensaje en vez de ir a un Brooker fanout como en Kafka y de ahí se propaga lo.wie hace es ir a un "exchange" y del exchange puede ir a otros exchanges o a colas (y no es fanout como Kafka, sino que se puede configurar).
      Para aplicar producer /consumer necesitas pasar por las.colaas porque las apps no pueden escuchar de un exchange.
      Hay una opción para no borrar los.mensjaes en rabbitmq también, pero vaya que eso, es básicamente lo mismo implementado un poco diferente.
      Si que es verdad que depende del caso de uso, no vas a tener los mensajes para volver a ejecutarlos, pero en la práctica en Kafka se acaban borrando por tema espacio y dinero que cuesta almacenarlos.