Comprenda todo el proceso de procesamiento de barreras de Flink.
Flink maneja las barreras de dos maneras:
La clave es el método getNextNonBlocked.
Cuando esta acción se completa sin alineación de barrera, currentBuffered == null, currentBuffered es el búfer actual que se procesará. Cuando el búfer son datos, los datos se consumirán normalmente y seguirán todo el proceso de consumo de mensajes de Flink. Cuando se encuentre una barrera, la barrera se procesará.
El valor predeterminado de numBarriersReceived es 0, por lo que cuando entre la primera barrera, ingresará el método beginNewAlignment.
Cuando entra otra barrera idéntica, barrierId == currentCheckpointId es verdadero hasta que NumBarriersReceived+NumClosedChannels == TotalNumberofInputChannels, se activa notifyCheckpoint y se informa el búfer de alineación y el tiempo de alineación. (Huevo de Pascua: el punto de control se actualizará más adelante. Bienvenido a seguir todo el proceso).
Si las barreras en otros canales están retrasadas, es decir, números de barras Recibido+NumClosedChannels! = totalNumberOfInputChannels, los datos del canal correspondientes a la barrera de recepción ingresarán al bufferBlocker.
BufferBlocker se implementa a través de ArrayDeque
Cuando los números numéricos recibidos + NumClosedChannels == TotalNumberofInputChannels, primero ejecute releaseBlocksAndResetBarriers () y luego ejecute notifyCheckpoint.
El objetivo principal de releaseBlocksAndResetBarriers es utilizar primero los datos que se han agregado al caché.
Cuando se completa el método releaseBlocksAndResetBarriers, currentBuffered! = nulo, ingresará
y luego consumirá los datos directamente.
Los datos en el caché se utilizarán (este proceso evitará que se utilicen los datos en inputGate) hasta que se complete el uso.
Cuando termina, es como si el programa se estuviera ejecutando aquí por primera vez, de un lado a otro.