{"id":5019,"date":"2018-04-19T15:11:07","date_gmt":"2018-04-19T22:11:07","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5019"},"modified":"2023-07-11T21:10:44","modified_gmt":"2023-07-12T04:10:44","slug":"event-sourcing-event-logging-an-essential-microservice-pattern","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/event-sourcing-event-logging-an-essential-microservice-pattern\/","title":{"rendered":"Event Sourcing | Event Logging - Un patr\u00f3n de microservicio esencial"},"content":{"rendered":"<p>Como mencion\u00e9 en mi anterior post sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/condemn-microservices-architecture-fail-even-start\/\">c\u00f3mo fracasar con los microservicios<\/a>depurar un sistema distribuido es una tarea dif\u00edcil. Muchas cosas pueden ir mal, y algunas de ellas est\u00e1n fuera de nuestro control, como la inestabilidad de la red, la falta de disponibilidad temporal, o incluso errores externos. Hoy vamos a discutir c\u00f3mo se puede utilizar el patr\u00f3n Event Sourcing \/ Event Logging para \"volver atr\u00e1s en el tiempo\" y entender lo que sali\u00f3 mal.<\/p>\n<p><span style=\"font-weight: 400\">Afortunadamente, existen multitud de herramientas para monitorizar la red y detectar y registrar eventos inesperados.<\/span>\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/condemn-microservices-architecture-fail-even-start\/\">Mallas de servicio<\/a> son ahora una opci\u00f3n popular, y tambi\u00e9n puede utilizar herramientas como <a href=\"https:\/\/opentracing.io\/\">OpenTracing<\/a> para el registro distribuido. Sin embargo, cuando hablamos de comprender el estado de nuestras entidades, no existe un marco r\u00e1pido de plug-and-play.<\/p>\n<p>Tus datos sobrevivir\u00e1n potencialmente a tu c\u00f3digo y, sin embargo, pasamos por alto c\u00f3mo evolucionan con el tiempo. En la mayor\u00eda de los sistemas, incluso preguntas sencillas como \"\u00bfc\u00f3mo lleg\u00f3 esta entidad a este estado?\" o \"\u00bfc\u00f3mo era mi estado hace un mes?\" son imposibles de responder, ya que no se ha guardado ning\u00fan historial de cambios. Llevar un registro de esos cambios es crucial para un sistema sano, no s\u00f3lo por motivos de seguridad o depuraci\u00f3n, sino por su enorme valor empresarial (su Product Owner se alegrar\u00e1).<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>La soluci\u00f3n<\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p>Una forma excelente de a\u00f1adir visibilidad a lo que est\u00e1 ocurriendo en tu servicio es a trav\u00e9s de Event Sourcing | Event Logging. El concepto fundamental detr\u00e1s de este patr\u00f3n de 10 a\u00f1os de antig\u00fcedad es que cada cambio en el estado de una aplicaci\u00f3n debe ser encapsulado en un objeto de evento y almacenado secuencialmente. Si esto te suena familiar, puede ser porque cualquier versi\u00f3n de sistemas de control o registros de transacciones de bases de datos es un usuario intensivo de este patr\u00f3n de eventos.<\/p>\n<p>Pero profundicemos para entender c\u00f3mo funciona. Suponiendo que estamos construyendo un <strong>Servicio de pedidos<\/strong> para un comercio electr\u00f3nico, veamos c\u00f3mo ser\u00edan el estado y los eventos de nuestra aplicaci\u00f3n:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5020\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM.png\" alt=\"\" width=\"476\" height=\"373\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM.png 1018w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM-300x235.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM-768x602.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM-20x16.png 20w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><\/p>\n<p>Numerosos autores definen tres reglas principales para el sistema de event sourcing\/logging:<\/p>\n<ul>\n<li>Los acontecimientos son siempre inmutables;<\/li>\n<li>Los eventos son siempre algo que ha sucedido en el pasado. Algunos desarrolladores confunden \u00f3rdenes (ej: PlaceOrder) con eventos (ej: OrderPlaced)<\/li>\n<li>En teor\u00eda, en cualquier momento se puede abandonar el estado actual y reconstruir todo el sistema con s\u00f3lo volver a procesar todos los mensajes recibidos.<\/li>\n<\/ul>\n<p>Otra cosa buena de este patr\u00f3n es que te empuja a pensar en los eventos de tu sistema antes de pensar en c\u00f3mo ser\u00e1 la estructura real. Puede ser contraintuitivo al principio, ya que hemos aprendido a dise\u00f1ar un sistema dibujando entidades y propiedades, pero est\u00e1 bien alineado con otra recomendaci\u00f3n com\u00fan de DDD: pensar primero en c\u00f3mo se comunicar\u00e1n tus servicios entre s\u00ed para identificar f\u00e1cilmente <strong><em>dominios<\/em><\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Origen de eventos | Flujo de registro de eventos<\/strong><\/h3>\n<p>El flujo m\u00e1s habitual para el aprovisionamiento de eventos es similar al siguiente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5024\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/event_sourcing_flow-1024x581.png\" alt=\"\" width=\"650\" height=\"369\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow-1024x581.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow-300x170.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow-768x436.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow-1320x749.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/event_sourcing_flow.png 1368w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\n<ul>\n<li><strong>Receptor de mensajes<\/strong> se encarga de convertir la solicitud entrante en un evento y validarlo.<\/li>\n<li><strong>Tienda de eventos<\/strong> es responsable de almacenar los eventos secuencialmente y notificar a los oyentes.<\/li>\n<li><strong>Escuchador de eventos:<\/strong> Como podr\u00e1s adivinar, este es el c\u00f3digo encargado de ejecutar la l\u00f3gica de negocio correspondiente seg\u00fan cada tipo de evento.<\/li>\n<\/ul>\n<p>Existen muchas implementaciones posibles de este patr\u00f3n, una de las cuales es mediante el uso de la funci\u00f3n <a href=\"https:\/\/www.couchbase.com\/blog\/es\/eventing\/\">Servicio de concursos<\/a>introducido en Couchbase 5.5. En resumen, te permite escribir funciones que se activan cada vez que se inserta\/actualiza\/elimina un documento. El mecanismo de eventos tambi\u00e9n te permite hacer <strong><em>rizo<\/em><\/strong> por lo que cada vez que un documento determinado se almacena en la base de datos, puede desencadenar un endpoint en su aplicaci\u00f3n para procesarlo. Veamos c\u00f3mo quedar\u00eda utilizando eventing:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5025\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-1024x578.png\" alt=\"\" width=\"626\" height=\"353\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-1024x578.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-300x169.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-768x434.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM-1320x745.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-5.31.22-PM.png 1332w\" sizes=\"auto, (max-width: 626px) 100vw, 626px\" \/><\/p>\n<p style=\"text-align: center\">Si quiere leer m\u00e1s sobre el tema, consulte el <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/eventing\/eventing-overview.html\">documentaci\u00f3n oficial de couchbase eventing<\/a>.<\/p>\n<p>Couchbase Eventing es as\u00edncrono, por lo que la implementaci\u00f3n anterior s\u00f3lo te sirve si tu aplicaci\u00f3n s\u00f3lo recibe llamadas as\u00edncronas. Tambi\u00e9n puede actuar como una capa extra de seguridad para activar una notificaci\u00f3n, por ejemplo, si alguien intenta actualizar un evento manualmente.<\/p>\n<p>En algunos sistemas, los campos y la estructura de los eventos pueden diferir bastante entre s\u00ed, y la estructura fija de los RDBM dificulta el modelado del almac\u00e9n de eventos. Por este motivo, los desarrolladores suelen almacenar sus eventos en forma de <em>Cadena JSON<\/em> en un <em>varchar<\/em> campo. Este enfoque tiene un problema importante: Hace que sus eventos sean dif\u00edciles de encontrar, ya que la mayor\u00eda de sus consultas ser\u00e1n lentas, complicadas y llenas de '<strong>gustos<\/strong>.  Una de las posibles soluciones es utilizar bases de datos de documentos, ya que la mayor\u00eda de ellas almacenan los documentos como JSON y disponen de un lenguaje similar a SQL para su consulta, como por ejemplo <a href=\"https:\/\/query-tutorial.couchbase.com\/tutorial\/#1\">N1QL<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Snapshotting - Versionado a su estado<\/strong><\/h3>\n<p>La adici\u00f3n de versiones\/historial a su estado se denomina a veces \"snapshotting\" en el mundo del aprovisionamiento de eventos. Es esencial para evitar reprocesar todos los eventos siempre que necesites saber cu\u00e1l era tu estado hace N d\u00edas. Tambi\u00e9n ayuda con la depuraci\u00f3n, ya que puede reconocer r\u00e1pidamente el punto en el tiempo en el que el estado de la aplicaci\u00f3n es diferente de lo que se espera despu\u00e9s de procesar un evento.<\/p>\n<p>El snapshotting es \u00fatil, barato, f\u00e1cil de implementar y excelente para informes temporales. Si ha decidido implementar patrones de Event Sourcing, haga un peque\u00f1o esfuerzo adicional para implementar tambi\u00e9n snapshotting.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5026\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM-1024x630.png\" alt=\"\" width=\"476\" height=\"293\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM-1024x630.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM-300x185.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM-768x473.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-12.02.22-PM.png 1202w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Corregir incoherencias <\/strong><\/h3>\n<p>Aqu\u00ed es donde todos tus esfuerzos dan sus frutos. Una vez que haya implementado el registro\/abastecimiento de eventos y el Snapshotting, puede utilizar una versi\u00f3n ligeramente modificada de la funci\u00f3n <a href=\"https:\/\/martinfowler.com\/eaaDev\/RetroactiveEvent.html\">Evento retroactivo<\/a> para corregir incoherencias.<\/p>\n<p>En resumen, si ha corregido un error y ahora tambi\u00e9n necesita ajustar el estado de las entidades afectadas, en lugar de actualizarlo manualmente, puede establecer el estado de su entidad al que ten\u00eda antes del error y reproducir todos los eventos relacionados desde entonces. Esto corregir\u00e1 autom\u00e1ticamente su estado sin <strong><em>manual<\/em><\/strong> intervenci\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5027\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-1024x583.png\" alt=\"\" width=\"533\" height=\"303\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-1024x583.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-300x171.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-768x437.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-1536x875.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM-1320x752.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-2.39.37-PM.png 1556w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><strong>Estado de retroceso<\/strong>: revierte el estado de una entidad al que ten\u00eda antes del fallo. Puede evitar <em>Pasos 1<\/em> y <em>2<\/em> simplemente reprocesando todos los eventos. En este caso, sin embargo, estamos restaurando un estado anterior porque queremos evitar reprocesarlo todo.<\/li>\n<li><strong>Ignorar instant\u00e1neas:<\/strong> todas las instant\u00e1neas posteriores a la restaurada deben marcarse como <strong><em>ignorado<\/em><\/strong> para evitar restaurar una instant\u00e1nea inconsistente en el futuro.<\/li>\n<li><strong>Eventos de reconstrucci\u00f3n<\/strong>: reconstruye todos los eventos desde el objetivo en adelante.<\/li>\n<\/ul>\n<p>Pero, \u00bfy si el evento contiene datos err\u00f3neos o no deber\u00eda haberse activado nunca? \u00bfPodemos actualizar o eliminar el evento y volver a procesarlo?<\/p>\n<p>Si recuerdas, la primera regla del aprovisionamiento de eventos es que \"<strong><em>Los eventos son siempre inmutables<\/em><\/strong>\" y eso es por una muy buena raz\u00f3n; necesitas confiar en el registro que est\u00e1s viendo. Pero eso no responde a nuestra pregunta; s\u00f3lo la modifica ligeramente: \u00bfc\u00f3mo podemos cambiar el registro de eventos sin cambiar el evento?<\/p>\n<p>Una forma sencilla de resolver este problema es marcar los eventos como <strong>ignorable<\/strong> para que podamos ignorarlos durante el proceso de reconstrucci\u00f3n:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5028\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-1024x545.png\" alt=\"\" width=\"582\" height=\"310\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-1024x545.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-300x160.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-768x409.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-1536x818.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-818x434.png 818w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM-1320x703.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.46.48-PM.png 1604w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/p>\n<p>\u00bfQu\u00e9 ocurre si un evento se ha disparado con datos err\u00f3neos o en el orden equivocado? Usando este enfoque, todo lo que tenemos que hacer es marcar el evento como ignorable y a\u00f1adir uno nuevo con los valores correctos o en la posici\u00f3n correcta, de la siguiente manera:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5029\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-1024x551.png\" alt=\"\" width=\"545\" height=\"293\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-1024x551.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-300x161.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-768x413.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-1536x826.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM-1320x710.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-12-at-1.51.56-PM.png 1562w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/p>\n<p>Genial, \u00bfverdad? Pero aqu\u00ed hay una tarea extra complicada: \u00bfc\u00f3mo podemos construir una secuencia de eventos que permita a\u00f1adir eventos en el medio?<\/p>\n<p>Una soluci\u00f3n ingenua es a\u00f1adir un contador flotante para cada entidad. Te permitir\u00e1 a\u00f1adir elementos en el medio infinitamente seg\u00fan la teor\u00eda de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Supertask\">supertareas<\/a> (en la pr\u00e1ctica, est\u00e1s limitado por el tama\u00f1o m\u00e1ximo float\/double), que normalmente es espacio m\u00e1s que suficiente para a\u00f1adir todos los eventos necesarios para fijar tu estado:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5030\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-1024x580.png\" alt=\"\" width=\"545\" height=\"309\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-1024x580.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-300x170.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-768x435.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-1536x870.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM-1320x748.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-19-at-11.59.17-PM.png 1800w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/p>\n<p>Por supuesto, el enfoque anterior tiene un mont\u00f3n de defectos, pero es rid\u00edculamente simple de implementar, f\u00e1cil de consultar, y funciona bastante bien para la mayor\u00eda de los casos. Si necesitas construir una estructura m\u00e1s robusta, considera almacenar tus eventos en una estructura de Lista Enlazada:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5031\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-1024x272.png\" alt=\"\" width=\"629\" height=\"167\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-1024x272.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-300x80.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-768x204.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM-1320x351.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-11-at-3.47.53-PM.png 1536w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>\u00bfQu\u00e9 pasa con los sistemas externos y otros microservicios?<\/strong><\/h3>\n<p>Un microservicio no es una isla, as\u00ed que es razonable pensar que uno de los efectos secundarios de reproducir eventos es que tu servicio puede enviar mensajes a otros externos. Esos mensajes podr\u00edan desencadenar incoherencias o propagar errores en otros sistemas, lo que potencialmente puede empeorar la situaci\u00f3n.<\/p>\n<p>Desgraciadamente, debido a la variedad de posibilidades, no existe una soluci\u00f3n milagrosa para resolver este problema, y cada caso debe tratarse individualmente. Algunas de las soluciones convencionales son:<\/p>\n<ul>\n<li>Cambiar la configuraci\u00f3n temporalmente para no enviar ning\u00fan mensaje externo o a\u00f1adir un interceptor que permita configurar qu\u00e9 mensajes deben enviarse;<\/li>\n<li>Redirigir peticiones espec\u00edficas a un servicio falso (un escenario t\u00edpico si est\u00e1 utilizando el patr\u00f3n Service Mesh).<\/li>\n<li>Permitir que otros servicios reconozcan que una determinada operaci\u00f3n ya se ha ejecutado en el pasado con los mismos par\u00e1metros, y entonces, en lugar de lanzar un error, simplemente devolver el mismo mensaje de \u00e9xito que antes.<\/li>\n<\/ul>\n<p>Naturalmente, hay un n\u00famero considerable de casos en los que no podr\u00e1 corregir las incoherencias externas de forma autom\u00e1tica, en este escenario se espera de otros sistemas que impriman un error legible por humanos y\/o activen una notificaci\u00f3n para que alguien intervenga.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Ventajas de la contrataci\u00f3n de eventos<\/strong><strong>\u00a0<\/strong><\/h3>\n<p>Aunque se trata de un patr\u00f3n sencillo, tiene muchas ventajas:<\/p>\n<ul>\n<li>El registro de sucesos tiene un gran valor empresarial;<\/li>\n<li>Funciona bastante bien con DDD y arquitecturas basadas en eventos.<\/li>\n<li>Audici\u00f3n del origen de todos los cambios en el estado de su aplicaci\u00f3n;<\/li>\n<li>Permite reproducir los eventos fallidos;<\/li>\n<li>F\u00e1cil depuraci\u00f3n, ya que puedes copiar todos los eventos de una entidad de destino a tu m\u00e1quina y depurar cada evento para entender c\u00f3mo la aplicaci\u00f3n alcanz\u00f3 un estado espec\u00edfico (ignora las implicaciones de seguridad de copiar datos de producci\u00f3n);<\/li>\n<li>Permite utilizar el <a href=\"https:\/\/martinfowler.com\/eaaDev\/RetroactiveEvent.html\">Evento retroactivo<\/a> patr\u00f3n para reconstruir\/arreglar su estado.<\/li>\n<\/ul>\n<p>Muchos autores tambi\u00e9n incluyen como ventaja la capacidad de realizar consultas temporales, pero considero que la consulta de m\u00faltiples eventos posteriores no es una tarea trivial. Por lo tanto, suelo percibir la <strong>consultas temporales<\/strong> como ventaja del patr\u00f3n de instant\u00e1neas.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Inconvenientes de la contrataci\u00f3n de eventos<\/strong><\/h3>\n<ul>\n<li>Es un poco menos intuitivo trabajar con llamadas s\u00edncronas, ya que primero tendr\u00e1s que transformar la petici\u00f3n en un evento.<\/li>\n<li>Cada vez que implante un cambio de \u00faltima hora, se ver\u00e1 obligado a migrar tambi\u00e9n su historial de eventos si quiere ser compatible con versiones anteriores (tambi\u00e9n conocido como actualizaci\u00f3n de eventos).<\/li>\n<li>Algunas implementaciones podr\u00edan necesitar un trabajo extra para comprobar el estado de los \u00faltimos eventos y asegurarse de que todos ellos han sido procesados.<\/li>\n<li>Los eventos pueden contener datos privados, as\u00ed que no olvides asegurarte de que tu registro de eventos est\u00e1 debidamente protegido.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><strong>Conclusi\u00f3n<\/strong><\/h2>\n<p>He mostrado una versi\u00f3n ligeramente modificada del patr\u00f3n Event Sourcing \/ Event Logging que me ha funcionado bien en los \u00faltimos a\u00f1os. La primera vez que o\u00ed hablar de \u00e9l fue hace casi 10 a\u00f1os en el <a href=\"https:\/\/martinfowler.com\/eaaDev\/EventSourcing.html\">famosa entrada en el blog de Martin Fowler<\/a> (de lectura obligada). Desde entonces, me ha ayudado mucho a que el estado de mis microservicios sea casi inquebrantable, por no hablar de todas las capacidades de generaci\u00f3n de informes.<\/p>\n<p>Sin embargo, no es algo que deba utilizarse indiscriminadamente en todos sus servicios. Personalmente, creo que s\u00f3lo los m\u00e1s importantes merecen la pena. Probablemente no necesites guardar el historial de todas las veces que el usuario ha cambiado su propio nombre en el sistema, por ejemplo.<\/p>\n<p>&nbsp;<\/p>\n<p>Si tiene alguna pregunta, no dude en tuitearme en <a href=\"https:\/\/twitter.com\/deniswsrosa\">@deniswsrosa<\/a><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>As I mentioned in my previous post about how to fail with microservices, debugging a distributed system is a challenging task. Many things can go wrong, and some of them are out of our control, such as network instability, temporary [&hellip;]<\/p>","protected":false},"author":8754,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814],"tags":[],"ppma_author":[9059],"class_list":["post-5019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Event Sourcing Pattern Microservice | Event Based Logging<\/title>\n<meta name=\"description\" content=\"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/event-sourcing-event-logging-an-essential-microservice-pattern\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern\" \/>\n<meta property=\"og:description\" content=\"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/event-sourcing-event-logging-an-essential-microservice-pattern\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-19T22:11:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-12T04:10:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM.png\" \/>\n<meta name=\"author\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@deniswsrosa\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/\"},\"author\":{\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\"},\"headline\":\"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern\",\"datePublished\":\"2018-04-19T22:11:07+00:00\",\"dateModified\":\"2023-07-12T04:10:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/\"},\"wordCount\":1915,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Application Design\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/\",\"name\":\"Event Sourcing Pattern Microservice | Event Based Logging\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-04-19T22:11:07+00:00\",\"dateModified\":\"2023-07-12T04:10:44+00:00\",\"description\":\"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\",\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"caption\":\"Denis Rosa, Developer Advocate, Couchbase\"},\"description\":\"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.\",\"sameAs\":[\"https:\/\/x.com\/deniswsrosa\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/denis-rosa\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Event Sourcing Pattern Microservice | Event Based Logging","description":"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/event-sourcing-event-logging-an-essential-microservice-pattern\/","og_locale":"es_MX","og_type":"article","og_title":"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern","og_description":"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/event-sourcing-event-logging-an-essential-microservice-pattern\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-04-19T22:11:07+00:00","article_modified_time":"2023-07-12T04:10:44+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-11-at-4.59.17-PM.png","type":"","width":"","height":""}],"author":"Denis Rosa, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@deniswsrosa","twitter_misc":{"Written by":"Denis Rosa, Developer Advocate, Couchbase","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/"},"author":{"name":"Denis Rosa, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257"},"headline":"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern","datePublished":"2018-04-19T22:11:07+00:00","dateModified":"2023-07-12T04:10:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/"},"wordCount":1915,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Application Design"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/","url":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/","name":"Event Sourcing Pattern Microservice | Event Based Logging","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-04-19T22:11:07+00:00","dateModified":"2023-07-12T04:10:44+00:00","description":"This Couchbase blog post discusses using the Event Sourcing and Event Logging pattern to \u201cgo back in time\u201d and understand what went wrong in your network.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/event-sourcing-event-logging-an-essential-microservice-pattern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Event Sourcing | Event Logging \u2013 An Essential Microservice Pattern"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257","name":"Denis Rosa, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6","url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","caption":"Denis Rosa, Developer Advocate, Couchbase"},"description":"Denis Rosa es un Developer Advocate para Couchbase y vive en Munich - Alemania. Tiene una s\u00f3lida experiencia como ingeniero de software y habla con fluidez Java, Python, Scala y Javascript. A Denis le gusta escribir sobre b\u00fasqueda, Big Data, AI, Microservicios y todo lo que pueda ayudar a los desarrolladores a hacer una aplicaci\u00f3n hermosa, m\u00e1s r\u00e1pida, estable y escalable.","sameAs":["https:\/\/x.com\/deniswsrosa"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/denis-rosa\/"}]}},"authors":[{"term_id":9059,"user_id":8754,"is_guest":0,"slug":"denis-rosa","display_name":"Denis Rosa, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","first_name":"Denis","last_name":"Rosa, Developer Advocate, Couchbase","user_url":"","author_category":"","description":"Denis Rosa es un Developer Advocate para Couchbase y vive en Munich - Alemania. Tiene una s\u00f3lida experiencia como ingeniero de software y habla con fluidez Java, Python, Scala y Javascript. A Denis le gusta escribir sobre b\u00fasqueda, Big Data, AI, Microservicios y todo lo que pueda ayudar a los desarrolladores a hacer una aplicaci\u00f3n hermosa, m\u00e1s r\u00e1pida, estable y escalable."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/8754"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5019"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5019\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5019"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}