¿Mejor práctica para manejar la comunicación asincrónica?

10

Recientemente completó un proyecto para manejar el procesamiento de tarjetas de crédito. Una de las dificultades que enfrenté fue manejar el retraso / posible falla de los mensajes de notificación. El ejemplo más complejo fue:

  • un sistema externo que envía la solicitud de pago
  • mi sistema convierte esa solicitud en una solicitud a la pasarela de pago
  • enviando al usuario a la puerta de enlace
  • esperando que el usuario realice el pago
  • el usuario regresa a mi sistema pero se retiene hasta que el sistema recibe una notificación de éxito / falla
  • Enviar al usuario de vuelta al sistema externo dependiendo de la falla

Aún más difícil fue el hecho de que al no enviar la notificación, la puerta de enlace intenta enviar la notificación cada 15 minutos durante varias horas.

Lo resolví utilizando un registro de la base de datos de transacciones pendientes y luego detectando el éxito y el fracaso de la devolución más un oyente de retraso temporizado para la notificación y el manejo de transacciones ...

Razonablemente difícil!

Pero esto debe haberse resuelto miles de millones antes, ¿cuál es la mejor práctica?

Puedo ver que mi futuro va a estar escribiendo el manejo entre todos estos sistemas y administrando los retrasos de tiempo y las posibles fallas de la red, por lo que quiero seguir las mejores prácticas.

Las recomendaciones de libros / artículos serían geniales.

¡Gracias por adelantado!

user86928
fuente

Respuestas:

13

Cuando se construyen sistemas distribuidos, la diferencia entre un sistema 'síncrono' y un sistema 'asíncrono' es la siguiente: un sistema síncrono ha conocido límites superiores en los tiempos de cómputo y entrega de mensajes. Entonces: tiene un sistema asincrónico donde ciertos eventos no tienen estos límites superiores conocidos. ¿Cómo lo manejas?

  1. Si estos procesos asincrónicos tienen límites probabilísticos superiores, entonces puede usar tiempos de espera para hacer que su sistema actúe como un sistema parcialmente sincrónico . Si el tiempo de respuesta del percentil 98 de la pasarela de pago es de 5 segundos, un tiempo de espera de 5 segundos hará que el 98% de sus solicitudes tengan éxito y el otro 2% simplemente fallará. Esto significa que ahora tiene un límite superior conocido sobre cuánto tiempo llevará este proceso para tener éxito o fracasar. Esta detección probabilística de fallas es una herramienta crítica para convertir sistemas asincrónicos en sistemas sincrónicos.

  2. Mantenga un registro duradero de estos eventos para que pueda recuperar el estado de su sistema en caso de falla del sistema. Si su controlador de pasarela de pago mantiene estos eventos en una memoria volátil y se bloquea, entonces está jodido.

  3. Cada transacción compleja es esencialmente una serie de transformaciones de estado basadas en el envío y la recepción de mensajes (eventos) dentro del sistema. Parece que está modelando esto informalmente usando su "registro de transacciones pendientes", pero le sugiero que vaya más allá: para cada transacción que necesite administrar, cree una máquina de estado formal que la describa y mantenga un registro duradero de su estado actual . Encontrará que estas máquinas de estado son fáciles de entender, fáciles de probar y brindan una visibilidad muy necesaria de estos procesos tanto para usted como para sus usuarios.

Cuanto más asíncrono sea su sistema, más formal y explícito debe ser al administrar estas complejas transformaciones de estado. Los tiempos de espera, el registro de eventos duraderos y las máquinas de estado son la mejor práctica aquí. Es por eso que Erlang OTP basa gran parte de su comportamiento de aplicación en el modelo de máquina de estado, por ejemplo.

Como referencia, no he encontrado nada mejor que Introducción a la programación distribuida confiable y segura . Le dará una sólida base algorítmica para comprender los sistemas sincrónicos y asincrónicos desde los primeros principios.

Rein Henrichs
fuente