java web-services design-patterns architecture soa

java - Transacciones en microservicios.



web-services design-patterns (6)

El mejor diseño es tener servicios aislados: cada servicio solo hace su trabajo dentro de su propia transacción y su flujo de trabajo espera fallas en el servicio único.

Si realmente necesita comprometerse solo si se llama a todos los servicios sin errores, debe crear un servicio de nivel superior que realice esas llamadas dentro de una transacción externa.

He leído algunos artículos sobre la arquitectura de microservicios, pero nadie toma el tema de la transacción. Todo lo que dicen es que es difícil hacerlo. Tal vez alguien pueda describir cómo manejar esto?

Pero no del lado del dominio, sino del lado de la tecnología. Digamos que tenemos un caso de negocios en el que necesitamos invocar dos servicios diferentes y ambos hacen algunos cambios en la base de datos. Pero, ¿cómo revertir si se produce algún error en el segundo?

¿Quién sabe algunas bibliotecas o patrón de diseño para este problema?


Lo primero que me vino a la mente después de leer esta pregunta es crear cada api de adición con una api de eliminar con, digamos, una bandera booleana adicional delFlag.

bandera booleana delFlag;

Para POST, será 0. Para SUPRIMIR, será 1.

Ahora mantiene un Administrador de transacciones, que es un súper servicio para todos sus microservicios. En este servicio, mantenga la cola de llamadas de todos los servicios y las API. Cuando un servicio falla, obtenga la API que llama y llame al método de eliminación de ese servicio y deshaga lo que haya hecho.

PS- Sólo un pensamiento crudo. Corrígeme si crees que está mal.


Puede que no sea el último experto en esto, pero estoy seguro de que te diriges hacia las transacciones distribuidas . Para que se ejecuten, todos los componentes del servicio de aplicaciones necesitan un ID de transacción compartido común, y debe asegurarse de que cada componente esté informado sobre el estado de la transacción. Es asíncrono, por lo que necesitarás habilidades de progreso sustanciales.

Aquí están las transacciones distribuidas mencionadas o discutidas:

https://en.wikipedia.org/wiki/Distributed_transaction

http://contino.co.uk/microservices-not-a-free-lunch/

http://martinfowler.com/articles/microservices.html

Parecería que la gente trata de evitarlo ya que es difícil. Tal vez es por eso que no encuentras mucho sobre.

Espero que esto ayude a un paso adelante :-)


Puede usar un motor de flujo de trabajo (como JBPM, Activiti) para organizar la lógica y manejar las fallas en las transacciones o las transacciones compensatorias para lograr la integridad de los datos. Este es el caso similar que usa en la arquitectura SOA con ESB, BPMN y servicios web


Sobre la base de respuestas anteriores, las transacciones distribuidas son la solución. En mi opinión, no desea crear sus propios mecanismos para rastrear el estado transaccional global, sino que desea usar algún tipo de producto; hay varios por ahí. He escrito un largo artículo de blog sobre cómo resolver este problema con un servidor de aplicaciones Java:

http://blog.maxant.co.uk/pebble/2015/08/04/1438716480000.html


la confirmación en dos fases puede ser una opción. El coordinador envía un mensaje de solicitud de confirmación a las cohortes. Las cohortes envían de nuevo. Después, el coordinador envía un mensaje de confirmación a las cohortes. Si cualquier falla, el coordinador envía mensajes de devolución a las cohortes.