スクリプトの処理時間短縮について

Yuki21
Tera Expert

お世話になっております。
以下のQAでご教示いただいた方法でテーブルに添付されたCSVファイルをテーブルへ取り込むスクリプト実行に関して、
大量のレコードを含むCSVファイルを処理するケースの処理時間短縮が検討事項として挙がっております。
※約50万件のデータ取込みに45分程かかっています

スクリプトを使わない方法で処理時間短縮が見込める方法はあるのでしょうか?

変換マップの使用については、結局CSV→テーブルのインポートが必要になり、他のマスタテーブル参照が必要になることで難しいと判断しています。

<参考QA>
https://community.servicenow.com/community?id=community_question&sys_id=90b968971bb04550cdd555fa234b...

1 ACCEPTED SOLUTION

ScriptAction は 並列には実行されないと思っています。並列処理できるか試してみてください。ひとつ処理が終わるまで次のScriptActionは実行されないかと思います。
 
簡単な並列化のScriptは ScheduleOnce を使うことです。これは使い捨てのScheduleJobを作成できます。公式Docsは無いですがScript include にあります、検索してみてください。
参考Script
function script(){
    //ScheduleJob
    gs.info('Test OK');
} 
var sched = new ScheduleOnce();
sched.script = '('+script+')();';
sched.schedule();

ScheduleJobをScript includeに保存する話が別でありますが、そうするべき重要な理由があります。
ScheduleJobはUpdateSetに保存されません。これでは開発運用上問題があります。そのためUpdateSetに保存されるScript includeにほぼすべてのScriptを記載して、ScheduleJobは呼び出すだけにするのが開発の運用上、良い方法です。ScheduleJobはXMLファイルで適用するか強制的にUpdateSetに記録する。

Performanceの話も出てますが、今回のケースではほぼ気にならない程度のはずです。50万件をScheduleJobで処理しているときも、動作速度は変わらなかったはずです。その程度のScheduleJobがひとつあるだけなら体感的な影響はほぼなしです。注意しなければならないのは、ScheduleJobの同時に処理できる数は少ないことと、長時間占有すると、順番待ちしているScheduleJobが実行できないだけでなく、順番が来てもとっくに開始時間が過ぎていているため開始しないことがあります。そのためScheduleJobの大量作成と長時間占有には注意して制御するべきです。結果的に夜間に実行することが多いですが夜間に多くのScheduleJobの滞留が発生すると処理できない場合があります。

これら難しい処理を、ServiceNowの知識が乏しい時には、挑戦しない方が良いです。自分の力量を大きく上回る実装は見送る事も大切な事です。出来る範囲でシステムを使って、仕組みがわかってから改良していくことが良いです。良くわからない謎の技術で動いているScriptが完成しても、それは制御できない非常に危険なシステムです。それと自分しかわからない特殊なScriptも危険です。無理しないことが安全です。

View solution in original post

20 REPLIES 20

  • 質問:sched.schedule();をLoopさせ、ScheduleOnce(中身はgetCsv)を並列処理回数分呼び出すということで合っていますでしょうか?
    • はい、その方法で次々とScheduleJobが作成され、可能な最大限の同時実行が行われます。注意事項は前回書いた通り、複数のScheduleJobが長時間占有すると、他のシステムに重要なScheduleJobが実行できない場合があるので注意してください。

他の投稿に記載のFlowのParallelについて、[Do the following in parallel] フローロジックブロックのパスは複数のスレッドでは実行されません。Flowは並列に処理しているのですが、内部では交互に順番に処理しているだけです(ひとりの作業員が二つの仕事を同時に並列処理しているイメージ、二人分の速度にはなりません)。公式Docsにも記載があります。Do the following in parallel フローロジック | ServiceNow Docs

それと、別の投稿に「少しでも間違えるとフリーズ」と書かれていますが、ScheduleJobの場合は簡単にはフリーズしません。Scriptで大量の処理をしても安全な負荷に抑えられていて、処理はユーザーと切り離されているので、体感的な遅さを感じることはほとんどないです(負荷は処理内容にもよる)。別の例でBusinessRuleは同期的に処理し終わるまでユーザーの処理を停止させるので、すぐに体感的に遅くなります。

これらの動作について学ぶべきことは多くあるので、知れば知るほど質問を繰り返すことになるかと思います。
是非開発者フォーラムで、多くの人が見る場所に投稿してください。
可能なら英語の方がより多くの人の協力を得られます。またCommunityの回答は個人の意見なので誤りが含まれていることもあります。多くの知見のある方に回答をもらいましょう。
この 『ServiceNow User Group - JP - Japan 日本』 には、ServiceNow 日本 ユーザー会に関連する質問をすると良いです。
開発者フォーラム - ServiceNow Community 

Yuki21
Tera Expert

ozawa様

フローデザイナー(parallelフロー)を使用する場合について質問させてください。

スクリプトを記載したアクションを作成し、parallelフローでアクションを呼び出す設定をすると認識しておりますが、
並行で行いたい処理が増えた場合、parallelフローで呼び出す回数を増やさないといけないのでしょうか?
インポートセットテーブルのレコードが増えるごとにアクション呼び出しを増やすフローの修正が発生することを気にしております。

<やりたいこと>
インポートセットテーブルのレコードに添付されたCSVファイルを取得し、テーブルへINSERTする
インポートセットテーブルのレコード数分、テーブルへのINSERTを並行で処理する

 

<追記>
parallelフローで以下を実行してみましたが、並列実行されていないようです。
設定方法に間違いがあるのでしょうか?
TEST_並行処理にスクリプトSTEPを設定しています。

find_real_file.png

 

 

以前にオープンソースプロジェクトで50万件のCSVから請求書PDFファイルを生成するデモビデオです。スタンドアロンノートブックで5分程度で処理を完成できました。サーバだと数分で完成できます。

https://www.youtube.com/watch?v=_Vh99fhr8wk

但し、CPU, メモリ, IOを調整する必要があります。少しでも間違えるとフリーズします。Javaの場合はGCとOSのスワップ/ページングの発生を抑える必要があります。

デモはスタンドアロンPCでしたが、ServiceNowのように他プロセスが実行されているとその調整が難しくなります。時間帯、曜日、日付(月末処理の有無)などで変わります。特に月末処理が発生する数日前の朝が負荷が高くなります。それらの調整を間違えると反応が遅くり、ServiceNowページの表示がタイムアウトするようになります。また、平行実行しているジョブを遅くなり数時間か下手な場合は数日も掛かるようになります。

質問に挙げたCSVファイルはサンプルである、実際のファイルには別列があると思います。1レコードがどのくらい大きいのかは質問からは不明です。

ただ平行処理をしたら早くなるのではなく正しく調整した場合のみ早くなります。間違えるとシステム全体が遅くなり下手をすると再起動が必要になります。

質問するようであればまだ準備が十分ではないと思います。非同期の機能を組み合わせることになります。また同じ機能を平行実行するのと異なる機能も平行実行することを検討するとか。

 

 英語のDeveloperフォーラムでの質問にも数人者から回答されているように先ずはユーザケースを明確にする必要があります。

ServiceNow社からは膨大な資料が提供されています。自前で作成する前にServiceNowから提供されている機能を調べた方がよいです。

以前にも回答しましたが、ServiceNowからは平行インポートする場合はConcurrent Importsがあります。

https://docs.servicenow.com/bundle/rome-platform-administration/page/administer/import-sets/concept/...

CSVファイルを添付してデータをインポートすることもできます。他の方法も多くあります。ユースケースによってどのツールと方法を使い分けます。

前にも述べましたが実際に自分で作成して運用して見るのがベストです。私も開発して英フォーラムで多くの他ユーザの意見を聞き出しって改善しています。CSV/Excelファイルのインポートスクリプトもそのようにして作成しました。ユースケースとしては時々一般ユーザが数行をファイルをインポートする場合です。

前にも伝えまいしたが、定期的に50万行のCSVファイルを添付して直接テーブルにインポートするのは推奨できない構成です。一応作成しましたが、やはり推奨はできません。海外ユーザも同意見なので回答をするのを止めたのだと思います。やはり彼らと同様に私もシステム障害が発生する可能性が少しでもあるスクリプト及び処理方法は提供できません。

 

英語でのフォーラムでScheduleOnce()の使い方についての質問がありましたのでスクリプトインクルードを利用してテーブルレコードを更新する例を挙げました。

もうご存じだとは思いますが、英語のフォーラムでは回答者の多くは質問に関して同じような回答をします。お互いに他者の回答や米ServiceNowの設計者/開発者からの回答を参照して相互に学んでいます。多くの質問は既に回答されたものになりますので検索したら回答を見つけることができます。今回の質問も既に回答されています。

このことももうご存じだとは思いますが、複数のフォーラムに参加されている回答者も多くいます。その結果、同じ質問を複数フォーラムに投稿しても同じ回答になります。また、同じ質問を繰り返して投稿するのと、複数フォーラムに同じ質問を投稿するのはマーナー違反とされています。

繰り返しになりますが、最終責任は質問者本人になります。実際に自分の環境で試して自分が一番良いと判断したようにします。