SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
EVENTOS, MENSAJERÍA
Y OTRAS FÁBULAS
CARLOS @BUENOSVINOS - #PULPOCON19
@BUENOSVINOS
Domain-Driven
Design in PHP
Carlos Buenosvinos, Christian Soronellas and Keyvan Akbary
https://leanpub.com/ddd-in-php
INTENTO AYUDAR A MEJORAR
TÉCNICAMENTE CON CAMBIOS PEQUEÑOS,
BARATOS, PROGRESIVOS Y RÁPIDOS
BASADO EN MIS CLIENTES
BUENOSVINOS MATURITY MODEL
▸ Level 1: Spaguetti
▸ Level 2: Framework Fanboy
▸ Level 3: Hexagonal Architecture
▸ Level 4: Hexagonal + Domain Events
▸ Level 5: Stepping Store (CQRS w/o ES)
▸ Level 6: CQRS + Event Sourcing
OBJETIVO
OBJETIVO DE LA CHARLA
▸ Ayudaros con trucos y consideraciones para
mover nuestras aplicaciones del nivel 3 al nivel
4 de una forma práctica y reduciendo los
costes de transición (de menor coste/
complejidad a mayor sin comprometer mucho
el siguiente paso).
▸ Level 3: Hexagonal Architecture
▸ Level 4: Hexagonal + Domain Events
NIVEL 3: HEXAGONAL
MATERIAL EN VIDEOS
REFACTORIZAR HACIA HEXAGONAL
▸ https://carlosbuenosvinos.com/rigor-talks-php-13-refactor-use-case-i-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-14-refactor-use-case-ii-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-15-refactor-use-case-iii-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-16-refactor-use-case-iv-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-17-refactor-use-case-v-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-18-tell-dont-ask-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-19-refactor-use-case-vi-spanish/
DE NIVEL 3 A 4
(HEX + EVENTOS)
“A DOMAIN EVENT IS A
RECORD OF SOME
BUSINESS-SIGNIFICANT
OCCURRENCE IN A
BOUNDED CONTEXT”
Vaughn Vernon
MATERIAL EN VIDEOS
EVENTOS DE DOMINIO
▸ https://carlosbuenosvinos.com/rigor-talks-php-22-domain-events-i-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-23-domain-events-ii-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-24-domain-events-iii-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-25-persisting-domain-events-spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-26-distributing-domain-events-using-rest-
spanish/
▸ https://carlosbuenosvinos.com/rigor-talks-php-27-distributing-domain-events-using-rabbitmq-
spanish/
LOS BENEFICIOS DE LOS EVENTOS DE DOMINIO
SON: MEJORAN EL DESACOMPLAMIENTO Y
MEJORAN EL RENDIMIENTO (USÁNDOSE DE
FORMA ASINCRONÍA)
DESACOPLAMIENTO Y
ASINCRONÍA…
Y SI NO ESTUVIERAMOS LISTOS
PARA EVENTOS/MENSAJERÍA
(TODAVÍA)…
PODEMOS OBTENER LOS MISMOS
BENEFICIOS SIN USAR EVENTOS DE
DOMINIO?
IF (MONOLITO)
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
MEJORAR DESACOPLAMIENTO (PERO NO ASINCRONÍA)
▸ /src
▸ /User
▸ /Billing
▸ /Inventory
▸ Prohibir la instanciación (new MyClass) entre carpetas de
cada Bounded Context (Billing vs. Inventory, por ejemplo) y
usar llamadas API REST entre cada Bounded Context
▸ Git precommit Hook + Check Style
▸ Autoload Composer (@dev)
▸ Runtime con Factory (Caller Stack simulando friend
visibility)
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
MEJORAR DESACOPLAMIENTO (PERO NO ASINCRONÍA)
MI MONOLITO
(DESDE BILLING)
MI MONOLITO
200
/users/…
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
MEJORAR ASINCRONÍA (LLAMADAS QUE NO REQUIEREN RESPUESTA)
MI MONOLITO
(DESDE BILLING)
MI MONOLITO
201
/users/…
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
OPCIONES EN EL LADO SERVIDOR
C. Background Job (BD, REDIS, RabbitMQ)
A. fastcgi_finish_request
MI MONOLITO B. cron
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
MEJORAR ASINCRONÍA (LLAMADAS QUE REQUIEREN RESPUESTA / POOLING)
MI MONOLITO
(DESDE BILLING)
MI MONOLITO
201 (+ ?pool_url)
/users/…
pool_url
NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO)
MEJORAR ASINCRONÍA (LLAMADAS QUE REQUIEREN RESPUESTA / PUSH WEBHOOK)
MI MONOLITO
(DESDE BILLING)
MI MONOLITO
201
webhook_url
/users/… (+ webhook_url)
IF (SERVICES)
NO ESTOY LISTA PARA EVENTOS (Y ADEMÁS TENGO SERVICIOS)
IGUAL QUE CON MONOLITO PERO HAY 2 O MÁS SERVICIOS
SERVICIO 1 SERVICIO 2
201
201 (+ webhook_url)
webhook_url
https://www.youtube.com/watch?v=kBlmEfljrn0
Y SI ESTUVIÉRAMOS LISTOS
PARA EVENTOS/MENSAJERÍA…
BÁSICOS
BÁSICOS
DISPARANDO EVENTOS (ESTÁTICAMENTE)
DISPARANDO EVENTOS (DESDE LA ENTIDAD)
SI NO TENÉIS SYMFONY O SIMILAR, NO PASA NADA…
Domain Event
Publisher
Example
TRUCOS
PERSISTIR TODOS LOS EVENTOS EN BBDD
Domain Event
Listener
(MySQL Example)
PUBLICAR API REST CON LOS EVENTOS
MESSAGE IDS
MESSAGE IDS
MESSAGE ID, CAUSATION ID & CORRELATION ID
MESSAGE IDS
MESSAGE ID, CAUSATION ID & CORRELATION ID
MESSAGE IDS
MESSAGE ID, CAUSATION ID & CORRELATION ID
META INFO
META INFO
META DATOS INTERESANTES
▸ webhooks_endpoint_url
▸ De la misma forma que con HATEOAS en
APIs REST
▸ documentation_url
▸ Para la mejora de Experiencia de
Developer
▸ deprecated
▸ Campos deprecados o consideraciones a
tener en cuenta
VERSIONADO
VERSIONADO
MUCHAS DIFICULTADES…
▸ Eventos ya enviados
▸ Retrocompatibilidad para Consumers viejos
▸ Replay de eventos viejos con código nuevo
▸ …
VERSIONADO
ALGUNAS CONSIDERACIONES PARA EVITAR PARTE DEL DOLOR
▸ Sólo agrega campos nuevos al Evento (a los consumers viejos no le importará)
▸ user.birthday en ISO 8601 y agregamos user.birthday_in_timestamp
▸ No eliminamos campos del Evento (podemos marcarlos como deprecated en
la información meta)
▸ No modificamos contenido de Eventos ni formatos (agregamos campo nuevo)
CHOREOGRAPHED VS.
ORCHESTRATED
CHOREOGRAPHED VS. ORCHESTRATED
EJEMPLO: RESTAURANTE ASÍNCRONO (REQUERIMIENTO INICIAL)
WAITER COOK
ASSISTANT MANAGERCASHIER
1. Toma el pedido 2. Cocina el pedido
3. Calcula $4. Cobra el pedido
CHOREOGRAPHED VS. ORCHESTRATED
COMUNICACIÓN: EVENT IN, EVENT OUT
WAITER COOK
ASSISTANT MANAGERCASHIER
OrderPlaced
OrderCooked
OrderAccountedOrderCashed
CHOREOGRAPHED VS. ORCHESTRATED
COMUNICACIÓN: COMMAND IN, COMMAND OUT
WAITER COOK
ASSISTANT MANAGERCASHIER
CookOrder
AccountOrder
CashOrder
FEATURE NUEVO: EL
CLIENTE PAGA PRIMERO…
CHOREOGRAPHED VS. ORCHESTRATED
DIFÍCIL IMPLEMENTAR EL FLUJO CON EVENT IN/EVENT OUT
WAITER COOK
ASSISTANT MANAGERCASHIER
OrderPlaced
OrderCooked
OrderAccountedOrderCashed
CHOREOGRAPHED VS. ORCHESTRATED
SOLUCIÓN: PROCESS MANAGER (EVENT IN, COMMAND OUT)
WAITER COOK
ASSISTANT MANAGERCASHIER
ORCHESTRATOR
(PROCESS MANAGER)
OrderPlaced
CookOrder
OrderCooked
order.userPaysFirst: True / False
Múltiples flujos
o diferentes PM
CHAOS MESSAGING
DEVELOPMENT
FORCEMOS EN DESARROLLO LO QUE PUEDE
OCURRIR EN PRODUCCIÓN (PÉRDIDA DE
MENSAJES Y DUPLICIDAD DE MENSAJES)
CHAOS MESSAGING DEVELOPMENT
CUSTOM TRANSPORTER FOR DUPLICATING MESSAGES (EXAMPLE IN SYMFONY)
CHAOS MESSAGING DEVELOPMENT
CUSTOM TRANSPORTER FOR DROPPING MESSAGES (EXAMPLE IN SYMFONY)
CHAOS MESSAGING DEVELOPMENT
SI DUPLICÁIS UN 20% DE MENSAJES Y PERDÉIS UN 20% DE MENSAJES (CUALQUIER RED SERÁ MEJOR)
SERVICIO A SERVICIO B
20% DROPPED MESSAGES
20% DUPLICATED MESSAGES
BATALLANDO CON
DUPLICIDAD Y PÉRDIDAS
BATALLANDO CON DUPLICIDAD Y PÉRDIDAS
QUÉ PASA SI SE DUPLICARAN (20% DE COOKORDER) MENSAJES?
WAITER COOK
ASSISTANT MANAGERCASHIER
ORCHESTRATOR
(PROCESS MANAGER)
OrderPlaced
CookOrder
OrderCooked
CashOrder
CHOREOGRAPHED VS. ORCHESTRATED
PROBLEMA: COOK RECIBE COOKORDER DUPLICADOS
COOKORCHESTRATOR
(PROCESS MANAGER)
CookOrder
SOLUCIÓN #1: CONTROL DE IDS VISTOS EN COOK
SOLUCIÓN #2: COOKORDER ES IDEMPOTENTE (ORDER IS COOKED?)
CookOrder
CookOrder
OrderCooked
BATALLANDO CON DUPLICIDAD Y PÉRDIDAS
QUÉ PASA SI SE PERDIERAN (20% DE COOKORDER) MENSAJES?
WAITER COOK
ASSISTANT MANAGERCASHIER
ORCHESTRATOR
(PROCESS MANAGER)
OrderPlaced
CookOrder
OrderCooked
CashOrder
CHOREOGRAPHED VS. ORCHESTRATED
PROBLEMA: COOK NO RECIBE COOKORDER
COOKORCHESTRATOR
(PROCESS MANAGER)
SOLUCIÓN #1: TIMEOUT EN N SEGUNDOS Y REPUBLICAR
CRON / REDIS LOCAL / NO USANDO PHP
CookOrderTimeout
BATALLANDO CON DUPLICIDAD Y PÉRDIDAS
WAITER COOK
ASSISTANT MANAGERCASHIER
ORCHESTRATOR
(PROCESS MANAGER)
OrderPlaced
CookOrder
OrderCooked
CashOrder
CONCLUSIONES
RESUMEN
▸ Antes de usar Eventos y Mensajería podemos:
▸ Separar los BC en Módulos con restricciones de
instanciación y usando REST contra la misma app.
Usar fastcgi_finish_request, crons o background
tasks. Webhooks
▸ Evitar lo máximo los problemas de versionado de
Eventos añadiendo campos (sin eliminar ni modificar
existentes)
▸ Usar Correlation Id, Causation Id además del Message
Id para mejorar la observability
▸ Meter META INFO en los Eventos como Documentación
CONCLUSIONES
RESUMEN (II)
▸ Coreografía vs. Orchestración
▸ Chaos Messaging
▸ Idempotencia y control de Ids para Duplicación
▸ TimeOut para pérdida de paquetes
GRACIAS A TOD@S!
(MENUDA CHAPA / FUMADA)
@BUENOSVINOS

Mais conteúdo relacionado

Semelhante a Eventos, mensajería y otras fábulas - PulpoCon 2019

AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...
AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...
AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...Amazon Web Services LATAM
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayPlain Concepts
 
Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017 Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017 Diego Amuy
 
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_selenium
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_seleniumTech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_selenium
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_seleniumEduardo Riol
 
Microservicios y Gestion de APIs
Microservicios y Gestion de APIsMicroservicios y Gestion de APIs
Microservicios y Gestion de APIsJorge Rodriguez
 
Tutorial MIneria de datos en sql server
Tutorial  MIneria de datos en sql serverTutorial  MIneria de datos en sql server
Tutorial MIneria de datos en sql serverRis Fernandez
 
Modificando el software de manera progresiva
Modificando el software de manera progresivaModificando el software de manera progresiva
Modificando el software de manera progresivaJaime Perera Merino
 
Taller avanzado de WordPress por Alvaro Fontela para CEMD
Taller avanzado de WordPress por Alvaro Fontela para CEMDTaller avanzado de WordPress por Alvaro Fontela para CEMD
Taller avanzado de WordPress por Alvaro Fontela para CEMDRaiola Networks
 
064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al MaximoGeneXus
 
064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al MaximoGeneXus
 
Portabilidad y transportabilidad
Portabilidad y transportabilidadPortabilidad y transportabilidad
Portabilidad y transportabilidadjuanmanuelsalgado
 
WooCommerce desde otro punto de vista
WooCommerce desde otro punto de vistaWooCommerce desde otro punto de vista
WooCommerce desde otro punto de vistaPablo Poveda Ortega
 
Automatización en AWS con Chatbot Serverless (Amazon Lex)
Automatización en AWS con Chatbot Serverless (Amazon Lex)Automatización en AWS con Chatbot Serverless (Amazon Lex)
Automatización en AWS con Chatbot Serverless (Amazon Lex)Globant
 
Omega peripherals virtualización de entornos críticos
Omega peripherals   virtualización de entornos críticosOmega peripherals   virtualización de entornos críticos
Omega peripherals virtualización de entornos críticosOmega Peripherals
 
Escalabilidad en azure web sites y sql database
Escalabilidad en azure web sites y sql databaseEscalabilidad en azure web sites y sql database
Escalabilidad en azure web sites y sql databaseEduardo Castro
 
Desafiando las transformaciones con WSO2 ESB
Desafiando las transformaciones con WSO2 ESBDesafiando las transformaciones con WSO2 ESB
Desafiando las transformaciones con WSO2 ESBWSO2
 
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...SOFTENG
 

Semelhante a Eventos, mensajería y otras fábulas - PulpoCon 2019 (20)

AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...
AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...
AWS Cloud Experience CA: Desplegando y Desarrollando Aplicaciones Modernas en...
 
Derribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev DayDerribando la torre de marfil - Plain Concepts Dev Day
Derribando la torre de marfil - Plain Concepts Dev Day
 
Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017 Presentación de Lyracons en el Meet Magento Argentina 2017
Presentación de Lyracons en el Meet Magento Argentina 2017
 
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_selenium
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_seleniumTech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_selenium
Tech day#7 – especificaciones_ejecutables_y_BDD_con_cucumber_y_selenium
 
Cien usos con serverless
Cien usos con serverlessCien usos con serverless
Cien usos con serverless
 
Microservicios y Gestion de APIs
Microservicios y Gestion de APIsMicroservicios y Gestion de APIs
Microservicios y Gestion de APIs
 
Tutorial MIneria de datos en sql server
Tutorial  MIneria de datos en sql serverTutorial  MIneria de datos en sql server
Tutorial MIneria de datos en sql server
 
Modificando el software de manera progresiva
Modificando el software de manera progresivaModificando el software de manera progresiva
Modificando el software de manera progresiva
 
Taller avanzado de WordPress por Alvaro Fontela para CEMD
Taller avanzado de WordPress por Alvaro Fontela para CEMDTaller avanzado de WordPress por Alvaro Fontela para CEMD
Taller avanzado de WordPress por Alvaro Fontela para CEMD
 
064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo
 
064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo064 K2 B Tools 4 0 Productividad Al Maximo
064 K2 B Tools 4 0 Productividad Al Maximo
 
Portabilidad y transportabilidad
Portabilidad y transportabilidadPortabilidad y transportabilidad
Portabilidad y transportabilidad
 
WooCommerce desde otro punto de vista
WooCommerce desde otro punto de vistaWooCommerce desde otro punto de vista
WooCommerce desde otro punto de vista
 
Automatización en AWS con Chatbot Serverless (Amazon Lex)
Automatización en AWS con Chatbot Serverless (Amazon Lex)Automatización en AWS con Chatbot Serverless (Amazon Lex)
Automatización en AWS con Chatbot Serverless (Amazon Lex)
 
Omega peripherals virtualización de entornos críticos
Omega peripherals   virtualización de entornos críticosOmega peripherals   virtualización de entornos críticos
Omega peripherals virtualización de entornos críticos
 
Presentacion gvLOGOS-GEDES
Presentacion gvLOGOS-GEDESPresentacion gvLOGOS-GEDES
Presentacion gvLOGOS-GEDES
 
Servicios web
Servicios webServicios web
Servicios web
 
Escalabilidad en azure web sites y sql database
Escalabilidad en azure web sites y sql databaseEscalabilidad en azure web sites y sql database
Escalabilidad en azure web sites y sql database
 
Desafiando las transformaciones con WSO2 ESB
Desafiando las transformaciones con WSO2 ESBDesafiando las transformaciones con WSO2 ESB
Desafiando las transformaciones con WSO2 ESB
 
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
RoadShow-Azure-PartnersMicrosoft-Nov-2010-Caso de éxito de Softeng Portal Bul...
 

Mais de Carlos Buenosvinos

Kit de Supervivencia para CTOs y Engineering Managers
Kit de Supervivencia para CTOs y Engineering ManagersKit de Supervivencia para CTOs y Engineering Managers
Kit de Supervivencia para CTOs y Engineering ManagersCarlos Buenosvinos
 
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)Carlos Buenosvinos
 
Road From Hex. Architecture to Event Sourcing
Road From Hex. Architecture to Event SourcingRoad From Hex. Architecture to Event Sourcing
Road From Hex. Architecture to Event SourcingCarlos Buenosvinos
 
De Arquitectura Hexagonal a Event Sourcing
De Arquitectura Hexagonal a Event SourcingDe Arquitectura Hexagonal a Event Sourcing
De Arquitectura Hexagonal a Event SourcingCarlos Buenosvinos
 
Primeros Pasos Liderando Equipos Técnicos - Techne 2018
Primeros Pasos Liderando Equipos Técnicos - Techne 2018Primeros Pasos Liderando Equipos Técnicos - Techne 2018
Primeros Pasos Liderando Equipos Técnicos - Techne 2018Carlos Buenosvinos
 
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017Carlos Buenosvinos
 
A Journey from Hexagonal Architecture to Event Sourcing
A Journey from Hexagonal Architecture to Event SourcingA Journey from Hexagonal Architecture to Event Sourcing
A Journey from Hexagonal Architecture to Event SourcingCarlos Buenosvinos
 
Integrating Bounded Contexts Tips - Dutch PHP 2016
Integrating Bounded Contexts Tips - Dutch PHP 2016Integrating Bounded Contexts Tips - Dutch PHP 2016
Integrating Bounded Contexts Tips - Dutch PHP 2016Carlos Buenosvinos
 
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015Carlos Buenosvinos
 
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / Medio
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / MedioDesarrollo Profesional con PHP 2014/15 - Nivel Bajo / Medio
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / MedioCarlos Buenosvinos
 
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)Carlos Buenosvinos
 
PHP 2014/15 - Visión global del ecosistema PHP
PHP 2014/15 - Visión global del ecosistema PHPPHP 2014/15 - Visión global del ecosistema PHP
PHP 2014/15 - Visión global del ecosistema PHPCarlos Buenosvinos
 
Desarrollo móvil con Titanium, PhoneGap y otros
Desarrollo móvil con Titanium, PhoneGap y otrosDesarrollo móvil con Titanium, PhoneGap y otros
Desarrollo móvil con Titanium, PhoneGap y otrosCarlos Buenosvinos
 
Introducción a Agile y Scrum (BetaBeers.com)
Introducción a Agile y Scrum (BetaBeers.com)Introducción a Agile y Scrum (BetaBeers.com)
Introducción a Agile y Scrum (BetaBeers.com)Carlos Buenosvinos
 
Team Engagement PHP Barcelona 2011
Team Engagement PHP Barcelona 2011Team Engagement PHP Barcelona 2011
Team Engagement PHP Barcelona 2011Carlos Buenosvinos
 
Scrum al Detalle: Revision práctica y perversiones humanas
Scrum al Detalle: Revision práctica y perversiones humanasScrum al Detalle: Revision práctica y perversiones humanas
Scrum al Detalle: Revision práctica y perversiones humanasCarlos Buenosvinos
 
Zend PHP 5.3 Demo Certification Test
Zend PHP 5.3 Demo Certification TestZend PHP 5.3 Demo Certification Test
Zend PHP 5.3 Demo Certification TestCarlos Buenosvinos
 

Mais de Carlos Buenosvinos (20)

Kit de Supervivencia para CTOs y Engineering Managers
Kit de Supervivencia para CTOs y Engineering ManagersKit de Supervivencia para CTOs y Engineering Managers
Kit de Supervivencia para CTOs y Engineering Managers
 
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)
Deliveritis Crónica - CAS Spain 2020 (Agile Is The New Normal)
 
Road From Hex. Architecture to Event Sourcing
Road From Hex. Architecture to Event SourcingRoad From Hex. Architecture to Event Sourcing
Road From Hex. Architecture to Event Sourcing
 
De Arquitectura Hexagonal a Event Sourcing
De Arquitectura Hexagonal a Event SourcingDe Arquitectura Hexagonal a Event Sourcing
De Arquitectura Hexagonal a Event Sourcing
 
Primeros Pasos Liderando Equipos Técnicos - Techne 2018
Primeros Pasos Liderando Equipos Técnicos - Techne 2018Primeros Pasos Liderando Equipos Técnicos - Techne 2018
Primeros Pasos Liderando Equipos Técnicos - Techne 2018
 
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
A Journey from Hexagonal Architecture to Event Sourcing - SymfonyCon Cluj 2017
 
A Journey from Hexagonal Architecture to Event Sourcing
A Journey from Hexagonal Architecture to Event SourcingA Journey from Hexagonal Architecture to Event Sourcing
A Journey from Hexagonal Architecture to Event Sourcing
 
Scrum, no eres tú, soy yo
Scrum, no eres tú, soy yoScrum, no eres tú, soy yo
Scrum, no eres tú, soy yo
 
Integrating Bounded Contexts Tips - Dutch PHP 2016
Integrating Bounded Contexts Tips - Dutch PHP 2016Integrating Bounded Contexts Tips - Dutch PHP 2016
Integrating Bounded Contexts Tips - Dutch PHP 2016
 
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015
Economía del Desarrollo de Software - PHP Barcelona - Marzo 2015
 
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / Medio
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / MedioDesarrollo Profesional con PHP 2014/15 - Nivel Bajo / Medio
Desarrollo Profesional con PHP 2014/15 - Nivel Bajo / Medio
 
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
Hexagonal Architecture - PHP Barcelona Monthly Talk (DDD)
 
PHP 2014/15 - Visión global del ecosistema PHP
PHP 2014/15 - Visión global del ecosistema PHPPHP 2014/15 - Visión global del ecosistema PHP
PHP 2014/15 - Visión global del ecosistema PHP
 
Desarrollo móvil con Titanium, PhoneGap y otros
Desarrollo móvil con Titanium, PhoneGap y otrosDesarrollo móvil con Titanium, PhoneGap y otros
Desarrollo móvil con Titanium, PhoneGap y otros
 
Introducción a Agile y Scrum (BetaBeers.com)
Introducción a Agile y Scrum (BetaBeers.com)Introducción a Agile y Scrum (BetaBeers.com)
Introducción a Agile y Scrum (BetaBeers.com)
 
Team Engagement PHP Barcelona 2011
Team Engagement PHP Barcelona 2011Team Engagement PHP Barcelona 2011
Team Engagement PHP Barcelona 2011
 
Scrum al Detalle: Revision práctica y perversiones humanas
Scrum al Detalle: Revision práctica y perversiones humanasScrum al Detalle: Revision práctica y perversiones humanas
Scrum al Detalle: Revision práctica y perversiones humanas
 
Zend PHP 5.3 Demo Certification Test
Zend PHP 5.3 Demo Certification TestZend PHP 5.3 Demo Certification Test
Zend PHP 5.3 Demo Certification Test
 
Scrum en Grupo Intercom
Scrum en Grupo IntercomScrum en Grupo Intercom
Scrum en Grupo Intercom
 
Comparativa Zend vs Symphony
Comparativa Zend vs SymphonyComparativa Zend vs Symphony
Comparativa Zend vs Symphony
 

Eventos, mensajería y otras fábulas - PulpoCon 2019

  • 1. EVENTOS, MENSAJERÍA Y OTRAS FÁBULAS CARLOS @BUENOSVINOS - #PULPOCON19
  • 3.
  • 4. Domain-Driven Design in PHP Carlos Buenosvinos, Christian Soronellas and Keyvan Akbary https://leanpub.com/ddd-in-php
  • 5.
  • 6. INTENTO AYUDAR A MEJORAR TÉCNICAMENTE CON CAMBIOS PEQUEÑOS, BARATOS, PROGRESIVOS Y RÁPIDOS
  • 7.
  • 8. BASADO EN MIS CLIENTES BUENOSVINOS MATURITY MODEL ▸ Level 1: Spaguetti ▸ Level 2: Framework Fanboy ▸ Level 3: Hexagonal Architecture ▸ Level 4: Hexagonal + Domain Events ▸ Level 5: Stepping Store (CQRS w/o ES) ▸ Level 6: CQRS + Event Sourcing
  • 9. OBJETIVO OBJETIVO DE LA CHARLA ▸ Ayudaros con trucos y consideraciones para mover nuestras aplicaciones del nivel 3 al nivel 4 de una forma práctica y reduciendo los costes de transición (de menor coste/ complejidad a mayor sin comprometer mucho el siguiente paso). ▸ Level 3: Hexagonal Architecture ▸ Level 4: Hexagonal + Domain Events
  • 11.
  • 12.
  • 13. MATERIAL EN VIDEOS REFACTORIZAR HACIA HEXAGONAL ▸ https://carlosbuenosvinos.com/rigor-talks-php-13-refactor-use-case-i-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-14-refactor-use-case-ii-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-15-refactor-use-case-iii-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-16-refactor-use-case-iv-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-17-refactor-use-case-v-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-18-tell-dont-ask-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-19-refactor-use-case-vi-spanish/
  • 14. DE NIVEL 3 A 4 (HEX + EVENTOS)
  • 15. “A DOMAIN EVENT IS A RECORD OF SOME BUSINESS-SIGNIFICANT OCCURRENCE IN A BOUNDED CONTEXT” Vaughn Vernon
  • 16. MATERIAL EN VIDEOS EVENTOS DE DOMINIO ▸ https://carlosbuenosvinos.com/rigor-talks-php-22-domain-events-i-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-23-domain-events-ii-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-24-domain-events-iii-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-25-persisting-domain-events-spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-26-distributing-domain-events-using-rest- spanish/ ▸ https://carlosbuenosvinos.com/rigor-talks-php-27-distributing-domain-events-using-rabbitmq- spanish/
  • 17. LOS BENEFICIOS DE LOS EVENTOS DE DOMINIO SON: MEJORAN EL DESACOMPLAMIENTO Y MEJORAN EL RENDIMIENTO (USÁNDOSE DE FORMA ASINCRONÍA)
  • 19. Y SI NO ESTUVIERAMOS LISTOS PARA EVENTOS/MENSAJERÍA (TODAVÍA)…
  • 20. PODEMOS OBTENER LOS MISMOS BENEFICIOS SIN USAR EVENTOS DE DOMINIO?
  • 22. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) MEJORAR DESACOPLAMIENTO (PERO NO ASINCRONÍA) ▸ /src ▸ /User ▸ /Billing ▸ /Inventory ▸ Prohibir la instanciación (new MyClass) entre carpetas de cada Bounded Context (Billing vs. Inventory, por ejemplo) y usar llamadas API REST entre cada Bounded Context ▸ Git precommit Hook + Check Style ▸ Autoload Composer (@dev) ▸ Runtime con Factory (Caller Stack simulando friend visibility)
  • 23. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) MEJORAR DESACOPLAMIENTO (PERO NO ASINCRONÍA) MI MONOLITO (DESDE BILLING) MI MONOLITO 200 /users/…
  • 24. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) MEJORAR ASINCRONÍA (LLAMADAS QUE NO REQUIEREN RESPUESTA) MI MONOLITO (DESDE BILLING) MI MONOLITO 201 /users/…
  • 25. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) OPCIONES EN EL LADO SERVIDOR C. Background Job (BD, REDIS, RabbitMQ) A. fastcgi_finish_request MI MONOLITO B. cron
  • 26. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) MEJORAR ASINCRONÍA (LLAMADAS QUE REQUIEREN RESPUESTA / POOLING) MI MONOLITO (DESDE BILLING) MI MONOLITO 201 (+ ?pool_url) /users/… pool_url
  • 27. NO ESTAMOS LISTOS (Y ADEMÁS TENGO UN MONOLITO) MEJORAR ASINCRONÍA (LLAMADAS QUE REQUIEREN RESPUESTA / PUSH WEBHOOK) MI MONOLITO (DESDE BILLING) MI MONOLITO 201 webhook_url /users/… (+ webhook_url)
  • 29. NO ESTOY LISTA PARA EVENTOS (Y ADEMÁS TENGO SERVICIOS) IGUAL QUE CON MONOLITO PERO HAY 2 O MÁS SERVICIOS SERVICIO 1 SERVICIO 2 201 201 (+ webhook_url) webhook_url
  • 31. Y SI ESTUVIÉRAMOS LISTOS PARA EVENTOS/MENSAJERÍA…
  • 33.
  • 36. SI NO TENÉIS SYMFONY O SIMILAR, NO PASA NADA… Domain Event Publisher Example
  • 38. PERSISTIR TODOS LOS EVENTOS EN BBDD Domain Event Listener (MySQL Example)
  • 39. PUBLICAR API REST CON LOS EVENTOS
  • 41. MESSAGE IDS MESSAGE ID, CAUSATION ID & CORRELATION ID
  • 42. MESSAGE IDS MESSAGE ID, CAUSATION ID & CORRELATION ID
  • 43. MESSAGE IDS MESSAGE ID, CAUSATION ID & CORRELATION ID
  • 45. META INFO META DATOS INTERESANTES ▸ webhooks_endpoint_url ▸ De la misma forma que con HATEOAS en APIs REST ▸ documentation_url ▸ Para la mejora de Experiencia de Developer ▸ deprecated ▸ Campos deprecados o consideraciones a tener en cuenta
  • 47. VERSIONADO MUCHAS DIFICULTADES… ▸ Eventos ya enviados ▸ Retrocompatibilidad para Consumers viejos ▸ Replay de eventos viejos con código nuevo ▸ …
  • 48.
  • 49. VERSIONADO ALGUNAS CONSIDERACIONES PARA EVITAR PARTE DEL DOLOR ▸ Sólo agrega campos nuevos al Evento (a los consumers viejos no le importará) ▸ user.birthday en ISO 8601 y agregamos user.birthday_in_timestamp ▸ No eliminamos campos del Evento (podemos marcarlos como deprecated en la información meta) ▸ No modificamos contenido de Eventos ni formatos (agregamos campo nuevo)
  • 51. CHOREOGRAPHED VS. ORCHESTRATED EJEMPLO: RESTAURANTE ASÍNCRONO (REQUERIMIENTO INICIAL) WAITER COOK ASSISTANT MANAGERCASHIER 1. Toma el pedido 2. Cocina el pedido 3. Calcula $4. Cobra el pedido
  • 52. CHOREOGRAPHED VS. ORCHESTRATED COMUNICACIÓN: EVENT IN, EVENT OUT WAITER COOK ASSISTANT MANAGERCASHIER OrderPlaced OrderCooked OrderAccountedOrderCashed
  • 53. CHOREOGRAPHED VS. ORCHESTRATED COMUNICACIÓN: COMMAND IN, COMMAND OUT WAITER COOK ASSISTANT MANAGERCASHIER CookOrder AccountOrder CashOrder
  • 54. FEATURE NUEVO: EL CLIENTE PAGA PRIMERO…
  • 55. CHOREOGRAPHED VS. ORCHESTRATED DIFÍCIL IMPLEMENTAR EL FLUJO CON EVENT IN/EVENT OUT WAITER COOK ASSISTANT MANAGERCASHIER OrderPlaced OrderCooked OrderAccountedOrderCashed
  • 56. CHOREOGRAPHED VS. ORCHESTRATED SOLUCIÓN: PROCESS MANAGER (EVENT IN, COMMAND OUT) WAITER COOK ASSISTANT MANAGERCASHIER ORCHESTRATOR (PROCESS MANAGER) OrderPlaced CookOrder OrderCooked order.userPaysFirst: True / False Múltiples flujos o diferentes PM
  • 58. FORCEMOS EN DESARROLLO LO QUE PUEDE OCURRIR EN PRODUCCIÓN (PÉRDIDA DE MENSAJES Y DUPLICIDAD DE MENSAJES)
  • 59. CHAOS MESSAGING DEVELOPMENT CUSTOM TRANSPORTER FOR DUPLICATING MESSAGES (EXAMPLE IN SYMFONY)
  • 60. CHAOS MESSAGING DEVELOPMENT CUSTOM TRANSPORTER FOR DROPPING MESSAGES (EXAMPLE IN SYMFONY)
  • 61. CHAOS MESSAGING DEVELOPMENT SI DUPLICÁIS UN 20% DE MENSAJES Y PERDÉIS UN 20% DE MENSAJES (CUALQUIER RED SERÁ MEJOR) SERVICIO A SERVICIO B 20% DROPPED MESSAGES 20% DUPLICATED MESSAGES
  • 63. BATALLANDO CON DUPLICIDAD Y PÉRDIDAS QUÉ PASA SI SE DUPLICARAN (20% DE COOKORDER) MENSAJES? WAITER COOK ASSISTANT MANAGERCASHIER ORCHESTRATOR (PROCESS MANAGER) OrderPlaced CookOrder OrderCooked CashOrder
  • 64. CHOREOGRAPHED VS. ORCHESTRATED PROBLEMA: COOK RECIBE COOKORDER DUPLICADOS COOKORCHESTRATOR (PROCESS MANAGER) CookOrder SOLUCIÓN #1: CONTROL DE IDS VISTOS EN COOK SOLUCIÓN #2: COOKORDER ES IDEMPOTENTE (ORDER IS COOKED?) CookOrder CookOrder OrderCooked
  • 65. BATALLANDO CON DUPLICIDAD Y PÉRDIDAS QUÉ PASA SI SE PERDIERAN (20% DE COOKORDER) MENSAJES? WAITER COOK ASSISTANT MANAGERCASHIER ORCHESTRATOR (PROCESS MANAGER) OrderPlaced CookOrder OrderCooked CashOrder
  • 66. CHOREOGRAPHED VS. ORCHESTRATED PROBLEMA: COOK NO RECIBE COOKORDER COOKORCHESTRATOR (PROCESS MANAGER) SOLUCIÓN #1: TIMEOUT EN N SEGUNDOS Y REPUBLICAR CRON / REDIS LOCAL / NO USANDO PHP CookOrderTimeout
  • 67. BATALLANDO CON DUPLICIDAD Y PÉRDIDAS WAITER COOK ASSISTANT MANAGERCASHIER ORCHESTRATOR (PROCESS MANAGER) OrderPlaced CookOrder OrderCooked CashOrder
  • 68. CONCLUSIONES RESUMEN ▸ Antes de usar Eventos y Mensajería podemos: ▸ Separar los BC en Módulos con restricciones de instanciación y usando REST contra la misma app. Usar fastcgi_finish_request, crons o background tasks. Webhooks ▸ Evitar lo máximo los problemas de versionado de Eventos añadiendo campos (sin eliminar ni modificar existentes) ▸ Usar Correlation Id, Causation Id además del Message Id para mejorar la observability ▸ Meter META INFO en los Eventos como Documentación
  • 69. CONCLUSIONES RESUMEN (II) ▸ Coreografía vs. Orchestración ▸ Chaos Messaging ▸ Idempotencia y control de Ids para Duplicación ▸ TimeOut para pérdida de paquetes
  • 70. GRACIAS A TOD@S! (MENUDA CHAPA / FUMADA) @BUENOSVINOS