Según lo que he entendido sobre la coherencia eventual, todos estos servicios (consumidores) recibirán el evento al mismo tiempo y los procesarán por separado , lo que, en un buen escenario, hará que los datos sean consistentes.
No, no necesariamente Como comenté, no podemos deshacer un correo electrónico enviado, por lo que aún necesitamos una especie de "secuencia". IPC sobre la gestión de datos basada en eventos no está exento de la orquestación 1 .
Por ejemplo, el correo electrónico no debe enviarse a menos que las transacciones anteriores finalicen con éxito y el servicio de correo electrónico obtenga una prueba de ello. 3
Sin embargo, ¿qué sucede si un servicio no puede procesar el evento? por ejemplo, desconexión repentina, error de la base de datos, etc. ¿Cuál es un buen patrón / práctica para manejar estas fallas de transacción?
Saluda a las falacias de la informática distribuida . Son lo que complica las cosas y, como de costumbre, no hay balas de plata para tratar con ellos.
Antes de comenzar nuestro viaje en busca del Arca Perdida, primero debemos considerar preguntarle a la organización. A menudo, la solución está en cómo la organización enfrenta estos problemas en el mundo real .
¿Qué hacen todos (departamentos) cuando faltan ciertos datos o están incompletos?
Nos daremos cuenta de que los diferentes departamentos tienen diferentes soluciones que, en conjunto, comprenden la solución a implementar.
De todos modos, aquí hay algunas prácticas que podrían ayudarnos con la estrategia a seguir.
En lugar de garantizar que el sistema esté en un estado constante todo el tiempo, podemos aceptar que el sistema lo obtendrá en algún momento en el futuro. Este enfoque es especialmente útil para operaciones comerciales de larga duración.
La forma en que el sistema alcanza la consistencia varía de un sistema a otro. Puede implicar desde procesos automatizados hasta algún tipo de intervención humana. Por ejemplo, el típico intento de nuevo más tarde o el contacto con el Servicio al Cliente .
Abortar todas las operaciones
Vuelva a colocar el sistema en un estado coherente mediante transacciones de compensación . Sin embargo, tenemos que tener en cuenta que estas transacciones también pueden fallar, lo que podría llevarnos a un punto donde la inconsistencia es aún más difícil de resolver. Y, nuevamente, no podemos deshacer un correo electrónico enviado.
Para un número bajo de transacciones, este enfoque es factible, porque el número de transacciones compensatorias también es bajo. Si hubiera varias transacciones comerciales involucradas en el IPC, manejar una transacción compensatoria para cada una de ellas sería un desafío.
Si buscamos transacciones de compensación , encontraremos que el patrón de diseño del interruptor automático es muy útil, y obligatorio, me atrevería a decir :
Transacciones distribuidas
La idea es abarcar múltiples transacciones dentro de una sola transacción, a través de un proceso general de gobierno conocido como Transaction Manager . Un algoritmo común para manejar transacciones distribuidas es la confirmación en dos fases .
La principal preocupación de las transacciones distribuidas es que confían en bloquear los recursos durante su vida útil y, como sabemos, las cosas también pueden salir mal para el Administrador de transacciones .
Si los administradores de transacciones se ven comprometidos, podemos terminar con varios bloqueos en los diferentes contextos delimitados, lo que resulta en comportamientos inesperados debido a la puesta en cola de los mensajes. 2
Operaciones de descomposición. ¿Por qué?
Si está descomponiendo un sistema existente y encuentra una colección de conceptos que realmente quieren estar dentro de un límite de transacción única, quizás los deje para el final.
Sam Newman
En la línea con los argumentos anteriores, Sam -en su libro Building Microservices- declara que, si realmente no podemos permitirnos la coherencia final, deberíamos evitar dividir la operación ahora.
Si no podemos permitirnos dividir ciertas operaciones en dos o más transacciones, podría decirse que, probablemente, estas transacciones pertenecen al mismo contexto acotado, o, al menos, a un contexto transversal que aún no se ha modelado.
Por ejemplo, en nuestro caso, nos damos cuenta de que las transacciones n. ° 1 y n. ° 2 están estrechamente relacionadas entre sí y probablemente ambas podrían pertenecer al mismo contexto acotado Cuentas , usuarios , registro , lo que sea ...
Considere colocar ambas operaciones dentro de los límites de la misma transacción. Haría que toda la operación sea más fácil de manejar. También pesa el nivel de criticidad de cada transacción. Probablemente, si la transacción # 2 falla, no debe comprometer toda la operación. En caso de dudas consultar con la organización .
1: No es el tipo de orquestación que piensas. No estoy hablando de la orquestación de ESB. Estoy hablando de hacer que los servicios reaccionen al evento apropiado.
2: Puede encontrar interesantes opiniones de Sam Newman con respecto a las transacciones distribuidas.
3: Verifique la respuesta de David Parker con respecto a este tema.