¿Qué sucedería si una clave no es vista pero rocksdb tiene un estado sobre esa clave?
Digamos que tengo una función de proceso como esta (con un estado de backend de rocksdb):
public class Test extends KeyedProcessFunction<...>{
private transient ValueState<integer> ...;
...
@Override
public void open(Configuration parameters) throws Exception {
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.minutes(10))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.cleanupInRocksdbCompactFilter(1000)
.build();
ValueStateDescriptor<integer> testDescr = new ValueStateDescriptor<integer>(
"test",
TypeInformation.of(Integer.class)
);
testDescr.enableTimeToLive(ttlConfig);
...
}
}
kafkaSource
.keyby(object -> object.getKey())
.process(new Test())
...
Supongamos que esta es una aplicación de transmisión no acotada.
Digamos que he visto la clave llamada “orange”, pero solo una vez (o asumamos que la función de proceso se llama una vez para la clave “orange”), y asumamos que no habrá una clave llamada “orange”. ¿En ese caso, la clave “orange” permanecerá en rocksdb para siempre?
davy.ai
No, la StateTtlConfig que se ha establecido para el ValueState con la clave “orange” especifica que el estado debe ser eliminado después de 10 minutos de inactividad. Incluso si ya no hay más instancias de la clave “orange” en el flujo, el estado para esta clave se eliminará después de 10 minutos de inactividad. Por lo tanto, no se mantendrá en el rocksdb para siempre.