はじめに
Workatoで件数の多いデータをループで処理しようとすると、実行タスク数が多くなってしまうという問題があります。例えば、タスクベースのプランを契約されている場合や、タスクベースではないがFair use limitに抵触するほど実行タスク数が多い状態である場合は、実行タスク数が減るようにレシピの改善が必要となります。しかし、処理や運用を工夫しても、処理対象のデータ件数が減らないということもあろうと思います。
例えば、以下のようなAというLookup Tableと、BというLookup tableが存在するとします。
これらのテーブルを比較するためのレシピを作成すると、次の通りとなります。
本レシピを実行し、上に示したテーブル同士の比較処理を行った場合、タスク使用量は19となります。タスク使用量は、テーブルのレコード数が増えれば、その件数に合わせて増加します。つまり、データ件数が多ければ多いほどタスク使用量において不利なレシピとなります。
対応方法
もしノーコードに拘らなければ、Rubyコネクターを利用することで、タスク使用量を減らすことができます。
Rubyコネクターでレシピを実装した場合、次の通りとなります。
このレシピを実行して、同様にテーブル同士の比較処理を行った場合、タスク使用量は3となります。また、このレシピの場合はデータ量にかかわらずタスク使用量は一定となります。
このレシピでは、ループ処理は4ステップ目のRubyコネクター内で行われます。Rubyコネクターは、コネクター内に定義されたコードにかかわらず、実行タスク数は1タスクで済みます。これにより、使い方次第で実行タスク数を大幅に削減することが可能です。Workatoのタスク実行数にお悩みの方は是非Rubyコネクターの利用をご検討ください。
コード例は以下を参考ください。
コード例
diff_a = parse_json(input['diff_a'])
diff_b = parse_json(input['diff_b'])
result = []
# AテーブルとBテーブルを比較する
diff_a.each { |value|
is_exists = false
diff_b.each { |value2|
if value['entry']['col1'] == value2['entry']['col1'] && value['entry']['col2'] == value2['entry']['col2']
is_exists = true
end
}
if ! is_exists
# Bテーブルに存在しないレコードを出力する
result.push({
'email': value['entry']['col1'],
'group': value['entry']['col2'],
'exist_table': 'diff_a'
})
end
}
# BテーブルとAテーブルを比較する
diff_b.each { |value|
is_exists = false
diff_a.each { |value2|
if value['entry']['col1'] == value2['entry']['col1'] && value['entry']['col2'] == value2['entry']['col2']
is_exists = true
end
}
if ! is_exists
# Aテーブルに存在しないレコードを出力する
result.push({
'email': value['entry']['col1'],
'group': value['entry']['col2'],
'exist_table': 'diff_b'
})
end
}
{
result: result
}