云数据流中 SerializableFunction 的安全线程

Thread safely of SerializableFunction in cloud dataflow

我正在实现 SerializableFunction 接口,我想重用我在构造函数中创建的一些昂贵的帮助程序对象。当这个 class 用于数据流作业时,是否为每个使用它的线程创建一个新实例 created/cloned?

谢谢, 热纳迪

简答
SerializableFunction 不需要是线程安全的,因为每个线程都有自己的反序列化实例。它在共享范围内访问的任何引用(例如通过静态 methods/static 引用/...)都需要是线程安全的。

长答案
SerializableFunction 使用Java 的对象序列化机制进行序列化,并保存为 Dataflow 规范的一部分。根据规范及其优化方式,SerializableFunction 很可能会分解为多个工作单元。然后每个工作机器可以请求它们并行处理的 1 个或多个工作单元。每个工作单元将使用 Java 的对象序列化机制来重新创建 SerializableFunction 的实例。每个线程只分配给一个工作单元。请注意,即使每个工作单元都分配给一个线程,如果昂贵的帮助对象不是 SerializableFunction 的一部分,而是通过另一种方法访问,例如通过静态 reference/method,那么昂贵的帮助对象可能仍然是在 worker 上同一 SerializableFunction 的多个实例之间共享。