Java 弗林克,使用规则';对象重用模式';

Java 弗林克,使用规则';对象重用模式';,java,apache-flink,Java,Apache Flink,Doc说这种模式会导致bug,但它没有告诉我使用这种模式的规则,在什么情况下会导致bug?比如说我有份工作 来源:卡夫卡(字节[]数据) 平面映射:将字节[]解析为Google Protobuf对象“foo”,创建一个Tuple2(foo.id,foo),并返回这个Tuple2 keyby和process:对于每个id,将第一个foo放入ValueState,如果有多个具有相同id的对象,则更新ValueState。10秒后发出第一个foo(更新) 在这种情况下,可以打开“对象重用模式”吗?对于

Doc说这种模式会导致bug,但它没有告诉我使用这种模式的规则,在什么情况下会导致bug?比如说我有份工作

  • 来源:卡夫卡(字节[]数据)
  • 平面映射:将字节[]解析为Google Protobuf对象“foo”,创建一个Tuple2(foo.id,foo),并返回这个Tuple2
  • keyby和process:对于每个id,将第一个foo放入ValueState,如果有多个具有相同id的对象,则更新ValueState。10秒后发出第一个foo(更新)

  • 在这种情况下,可以打开“对象重用模式”吗?

    对于您描述的管道,可以安全地启用对象重用

    对象重用仅适用于在同一任务中的运算符实例之间转发数据的情况——在您的情况下,就是在源和flatmap之间。keyBy强制进行ser/de和网络洗牌,因此不能在flatmap和process函数之间使用对象重用。但对象重用可能也适用于流程函数和接收器之间(我假设存在)

    启用对象重用后,是否安全地

    • 记住跨函数调用或
    • 修改输入对象
    如果你避开这两点,你就可以安全地

    • 修改输出对象并再次发射它
    顺便说一句,最好在反序列化模式或KafkaDeserializationSchema中实现反序列化,而不是在flatmap中,在这种情况下,对象重用与管道的该部分无关