es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Apache Flink – cómo detener y reanudar el procesamiento de flujo en caso de fallo aguas abajo.

Tengo una aplicación Flink que consume mensajes entrantes en un tema Kafka con múltiples particiones, procesa los mensajes y los envía a un sink que los envía a través de HTTP a un servicio externo. A veces, cuando el servicio de downstream está inactivo, el procesamiento de los mensajes debe detenerse hasta que vuelva a estar en funcionamiento.

Estoy considerando dos enfoques:

  1. Lanzar una excepción cuando el sink HTTP falla al enviar el mensaje de salida. Esto hará que la tarea y el trabajo se reinicien según la estrategia de reinicio configurada. Eventualmente, el servicio de downstream volverá y el sistema continuará desde donde se detuvo.

  2. Hacer que el Sink duerma y reintentar en caso de fallo de forma continuada, hasta que el servicio de downstream vuelva a funcionar.

Desde mi comprensión y a partir de mi PoC, con la estrategia 1, perderé garantías exactamente una vez, ya que el sink en sí es un estado externo. Según lo que puedo ver, no es posible hacer que un punto final HTTP simple sea transaccional para implementar TwoPhaseCommitSinkFunction.

Con la estrategia 2, este es un problema menor ya que el pipeline no continuará hasta que el sink haga una escritura exitosa, y puedo confiar en la presión de retroceso en todo el sistema para pausar la recuperación de mensajes de la fuente de Kafka.

Las principales preguntas que tengo son:

  1. ¿Es una suposición correcta que no se puede hacer TwoPhaseCommitSinkFunction para un punto final HTTP simple?

  2. ¿Cuál de las dos estrategias, o ninguna, tiene más sentido?

  3. ¿Me estoy perdiendo soluciones más simples y obvias?

Tags:  ,

Answer

  1. Avatar for davy.ai
    1. ¿Es correcto asumir que no se puede crear una TwoPhaseCommitSinkFunction para un simple endpoint HTTP?

    Sí, generalmente no es posible hacer que un endpoint HTTP simple sea transaccional, lo cual es necesario para implementar una TwoPhaseCommitSinkFunction. La razón es que HTTP es un protocolo sin estado que no proporciona garantías transaccionales, por lo que implementar dicha función requeriría complejidad adicional y sobrecarga.

    1. ¿Cuál de las dos estrategias, o ninguna, tiene más sentido?

    Ambas estrategias tienen sus ventajas y desventajas, y la elección depende de los requisitos y limitaciones específicas de su caso de uso. El uso de la estrategia 1 puede resultar en la pérdida de garantías de procesamiento exactamente una vez, lo cual puede ser inaceptable dependiendo del caso de uso. Sin embargo, puede ser más fácil de implementar y puede proporcionar una mejor tolerancia a fallas en algunos escenarios. La estrategia 2 puede asegurar que no se pierda ningún dato, pero puede requerir una implementación más compleja y puede dar como resultado un procesamiento más lento si el servicio aguas abajo está inactivo durante mucho tiempo. En última instancia, el mejor enfoque depende del caso de uso específico y de los compromisos entre rendimiento, tolerancia a fallos y consistencia de datos.

    1. ¿Estoy omitiendo soluciones más simples y obvias?

    Puede haber otras soluciones para manejar las fallas del servicio aguas abajo, dependiendo de los requisitos específicos de su caso de uso. Un enfoque posible es usar un búfer para almacenar mensajes temporalmente hasta que el servicio aguas abajo esté disponible nuevamente. Este búfer se puede implementar como un almacenamiento persistente local o una caché distribuida como Apache Ignite o Hazelcast. Otro enfoque es usar un balanceador de carga o un servidor proxy para enrutar dinámicamente los mensajes a diferentes instancias del servicio aguas abajo, de modo que el procesamiento pueda continuar incluso si una instancia está inactiva. En última instancia, la solución más apropiada depende de los requisitos y limitaciones específicas de su caso de uso.

Comments are closed.