¿Cómo puede usar efectivamente los servicios web en un entorno empresarial si no puede usar transacciones?

14

El lugar donde estoy trabajando es establecer algunas reglas básicas, y el debate que estamos teniendo ahora es bibliotecas locales y servicios web para la reutilización de códigos. Los servicios web parecen ser la opción popular en la mayoría de las empresas, y eso es lo que la mayoría de los desarrolladores de aquí se están inclinando hacia.

Simplemente no puedo ver cómo puede usar efectivamente los servicios web para cualquier trabajo serio. ¿Cómo puedo ejecutar varias llamadas de servicio de manera segura si no puedo usar una transacción?

Supongamos que tengo un trabajo cron que capta clientes de nuestra base de datos que cumplen con una determinada condición de la que necesitan ser notificados. Se les envía un fax, un correo electrónico y se crea un ticket para rastrear el problema internamente. Eso es 3 llamadas de servicio diferentes que sucederían para cada cliente en un bucle for.

Si se produce un error en cualquier lugar, es posible que, por ejemplo, se envíe un fax y un correo electrónico al cliente, pero no se cree un ticket. O peor aún, este trabajo cron podría contener un error que hace que falle en el mismo punto cada vez, y envía un correo electrónico repetidamente al mismo cliente. Si las bibliotecas fueran todas locales, todo podría estar envuelto en una transacción, y nada de eso sucedería. Pero en este ejemplo estamos usando servicios web.

Tenga en cuenta que los métodos de correo electrónico y fax realmente insertan los datos en las tablas de cola respaldadas por la base de datos, que a su vez son manejadas por un proceso de trabajo cron separado. Por lo tanto, las llamadas a los métodos de servicio "enviar correo electrónico" y "enviar fax" podrían abortarse sin efectos secundarios, si fuera necesario.

Una opción es colocar todo este fragmento de código en el propio servicio web, de modo que el servicio web mismo llame a los métodos de correo electrónico, fax y creación de tickets en una transacción. Pero luego estamos creando un método de servicio web solo para el uso de una transacción; no hay una razón válida para que necesitemos llamar a este método desde cualquier lugar, excepto este único script cron.

¿Cómo manejarías este método generalmente?

    
pregunta ryeguy 14.02.2012 - 14:53

5 respuestas

5

Lo que estás describiendo es en realidad una transacción distribuida que implementa commit de dos fases . Algunas plataformas de mensajería empresarial incluyen administradores de transacciones para soportar ese tipo de cosas, pero los productos concretos dependen de la plataforma / idioma. No tengo experiencia concreta con tales herramientas, pero espero que estos consejos me ayuden.

    
respondido por el Péter Török 14.02.2012 - 16:22
3

Es interesante que, al participar en este Q & A en particular, hay un hilo similar acerca de los servicios que soportan múltiples plataformas en la lista de correo DDD / CQRS en el que participo. Puedo repetir algunas de mis consejos aquí.

Una opción para admitir transacciones en un entorno heterogéneo es usar un mecanismo de transporte que admita transacciones y es compatible con todas las plataformas desde las que se utilizará. El Advanced Message Queue Protocol (AMQP) admite transacciones y existe una API nativa para casi todos los idiomas que se usa comúnmente en la actualidad. RabbitMQ es un servidor que implementa AMQP y ha sido examinado en la industria como una solución robusta.

Aprovechar un sistema basado en RabbitMQ te pone en una ruta para tener un ESB completo en caso de que necesites crecer en él. Publicas mensajes en un canal y te suscribes a una cola. Donde eso se vuelve realmente poderoso es que entre el canal y la cola, puedes realizar muchas cosas interesantes. Un canal puede alimentar múltiples colas (pub / sub) una cola puede ser alimentada por múltiples canales, puede enrutar mensajes a diferentes colas en función del contenido, etc. etc.

Acabo de leer sobre alternativas a las transacciones (que vienen con gastos generales y convierten una operación asíncrona en una operación de bloqueo). RabbitMQ es compatible con lo que se denomina confirmador de publicación . Básicamente, le permite registrar una devolución de llamada para un método publicado para manejar una transacción fallida. En su caso, podría deshacer las solicitudes de correo electrónico / fax y eliminar el ticket.

Por supuesto, el agujero del conejo (perdón por el juego de palabras) va aún más profundo desde allí. Puede usar Rabbit para realizar orquestaciones complejas con servicios web internos y externos.

Para sus servicios web públicos, se vuelve completamente simple. Su servicio (ya sea SOAP, REST o JSON) simplemente publica un mensaje en la cola de servicio correspondiente y deja que su sistema interno lo maneje desde allí.

También hay una funcionalidad para crear un mensaje de solicitud / respuesta para esos escenarios en los que se espera que la información se recupere rápidamente.

    
respondido por el Michael Brown 14.02.2012 - 19:08
2

Las palabras clave que busca son 'coreografía de servicios web'.

Consulte el artículo de Wikipedia al respecto.

    
respondido por el Dibbeke 14.02.2012 - 18:50
1

La forma en que manejé esto en una aplicación de servicios que escribí fue crear un contenedor para manejar las transacciones necesarias. En mi caso, la solicitud del usuario, realizada por el sitio web, la aplicación de escritorio o el servicio de Windows, tuvo que consultar un servicio web y, en función del resultado y las opciones del usuario, tuvo que actualizar una base de datos local y, opcionalmente, una remota a través de un servicio web. Luego tuvo que generar un informe para que se devuelva inmediatamente, se envíe por correo electrónico o se envíe por fax. Tenía control sobre la base de datos local, el correo electrónico y la generación de informes, pero ninguno en los servicios web o el servidor de fax.

La creación de un contenedor permitió un mejor control de transacciones y manejo de errores. También permitió una mejor seguridad al controlar el acceso a los servicios de red internos desde fuentes externas. En general, veo la necesidad de que las transacciones y la administración del servicio sean una razón válida para crear una envoltura adecuada para una única solución siempre que el código se reutilice correctamente (sin codificación cortar y pegar).

    
respondido por el jfrankcarr 14.02.2012 - 16:13
1
  

Simplemente no puedo ver cómo puede usar efectivamente los servicios web para cualquier trabajo serio. ¿Cómo puedo ejecutar varias llamadas de servicio de manera segura si no puedo usar una transacción?

No puedes.

La pregunta que debe hacerse es: ¿cómo implemento las transacciones con el marco de servicio web X? En este momento, solo estás asumiendo que es imposible.

    
respondido por el Mike Baranczak 14.02.2012 - 19:19

Lea otras preguntas en las etiquetas