問題
使用鍵值參數在一個多任務工作流是一種常見的用例。是很正常的並行運行多個任務,每個任務可以有不同的參數值相同的關鍵。這些鍵值參數在每個任務使用的代碼和閱讀。
例如,假設您有四個任務:task1,task2,task3,task4在一個工作流程的工作。表名是關鍵參數,參數值是什麼員工,部門,位置,聯係人。
每個任務運行工作時,你希望自己的參數。但是如果應用程序代碼使用Scala的同伴對象,你可能會注意到一個任務的參數被應用於所有其他任務,而不是各自的參數對於每個任務得到應用。這會產生不一致的結果。
使用我們的例子中,如果任務並行運行使用Scala的同伴對象,任何一個任務參數(例如,task4參數聯係人)可能會作為表名傳遞給其他三個任務。
導致
當同伴對象應用程序代碼中使用,有一個可變狀態的伴星並發修改。因為所有任務運行在相同的集群中,這類被加載一次,所有任務運行在相同的Java虛擬機(JVM)。
解決方案
你可以減輕這個問題通過應用這些解決方案之一。最好的選擇取決於您的特定的用例。
- 按順序運行工作(添加依賴關係的任務)。
- 每個任務安排在不同的集群。
- 重寫的代碼加載配置你顯式地創建一個新的對象,而不是使用伴星的共享狀態。