问题
使用键值参数在一个多任务工作流是一种常见的用例。是很正常的并行运行多个任务,每个任务可以有不同的参数值相同的关键。这些键值参数在每个任务使用的代码和阅读。
例如,假设您有四个任务:task1,task2,task3,task4在一个工作流程的工作。表名是关键参数,参数值是什么员工,部门,位置,联系人。
每个任务运行工作时,你希望自己的参数。但是如果应用程序代码使用Scala的同伴对象,你可能会注意到一个任务的参数被应用于所有其他任务,而不是各自的参数对于每个任务得到应用。这会产生不一致的结果。
使用我们的例子中,如果任务并行运行使用Scala的同伴对象,任何一个任务参数(例如,task4参数联系人)可能会作为表名传递给其他三个任务。
导致
当同伴对象应用程序代码中使用,有一个可变状态的伴星并发修改。因为所有任务运行在相同的集群中,这类被加载一次,所有任务运行在相同的Java虚拟机(JVM)。
解决方案
你可以减轻这个问题通过应用这些解决方案之一。最好的选择取决于您的特定的用例。
- 按顺序运行工作(添加依赖关系的任务)。
- 每个任务安排在不同的集群。
- 重写的代码加载配置你显式地创建一个新的对象,而不是使用伴星的共享状态。