Blue Prismの中止と再実行にキューを活用する(+べき等 超入門)
Blue Prismのキュー(Queue)を一時記憶装置として使った場合、具体的に何が嬉しいのか?
答えは沈黙!…以下で解説していきます。
中止と再実行
Blue Prismでは、プロセスの実行を中止することができます。
中止には、Immediate Stop(即時中止)とRequest Stop(中止を要求)の2種類があります。
RPAの性質上、長時間実行されるプロセスは少なくないです。実行の中止は、とても重要な機能だと思います。
(基礎コース:Foundation Trainingにも出てきますね)
プロセスを実行中に、何らかの理由で中止をした場合、再実行(リトライ)を賢く行う方法が必要です。
べき等(idempotent)
中止と再実行…みたいな話をしたことがある人は、べき等(べきとう、冪等。idempotent)という言葉を耳にしたことがあると思います。
(え、聞いたことない?細けぇことはいいんだよ!)
上記でも語られていますが…(いきなりレベル、上がったな)ちょっとだけ横道に逸れると、まず、数学にはべき乗という演算があります。下みたいなやつです。中学で習いましたね。
英語表記はpowerです。ExcelにもPOWER関数があります。
ここで、1という数値を考えます。1は、何回べき乗しても1です。
このように、何度、同じ演算(ここではべき乗)を繰り返しても、同じ結果になるのがべき等という概念です。
べき等という言葉自体が、そもそもラテン語の "idem"(同じ:same)と"potere"(べき乗:power)から来ているそうです。
単にべき乗だけでなく、何回繰り返しても同じ結果が得られれば、あらゆる演算、関数、処理がべき等と呼ばれます。
Blue Prismのプロセスも例外ではありません。
つまり、プロセスを何度、流しても同じ結果を返すのであれば、それはべき等と呼べるわけです。
…んで、そのべき等とかいうのが、何の役に立つわけ?
上記の記事でも語られていますが、私の認識を簡単に書きますと、、
- プロセスがべき等であれば、中止した後、特別な後処理/前処理を行うことなく、単に頭から再実行するだけでOKになります。
- プロセスがべき等でないと、中止した後、中止する前と同じ状態を再現してからでないと再実行できません(結果が同じになりません)。
プロセスがべき等かどうかは、再実行の容易性に大きくかかわってきます。
さて、どうすればプロセスをべき等にすることができるのでしょうか。
これはいろいろなポイントがあり、ここで説明しきることは(そもそも私の能力的に)難しい気がします。上記のリンクにも情報が詰まっています。
ただ、少なくともひとつ確実に言えることは、処理中のデータを保存しておくことがポイントのひとつだ、ということです。そこから再実行すれば、毎回、同じ結果にできますからね。
…一時記憶装置としてのキューが、べき等に結びつく瞬間です。
やってみよう(設計編)
以前、Yahooファイナンスから情報をとってきて、Excelに転記するプロセスを作成しました。
このプロセスを、毎日、朝9:30に定期実行した場合を考えます。毎朝の断面で情報が収集されて、便利ですね。
このような毎朝の処理を、何かの理由で中止した場合、どうやって再実行させればいいでしょうか。頭から流しなおす?…おそらく、頭から流しなおすと、流した時点でWeb(Yahooファイナンス)からデータをとってきてしまいます。いま、ほしいのは毎朝の断面のデータですから、これでは結果が異なります。
ここで、プロセスを修正し、毎朝のデータをWebから取得した際に、キューに保存する形にすればどうでしょうか。これなら、Excelに書き込みしている途中で中止しても、データはキューに残ります。
実行時に、以下のような条件分岐を設れば
初回実行/再実行を問わず、頭から流すだけで良くなります。
やってみよう(実装編)
上記を踏まえて、以下のようなプロセスを作りました。
プロセスの前半では、キューからデータを取り出し、データの件数をチェックさせています。
- データの件数が0件、つまりキューにデータがなければ、初回実行としてWebブラウザを立ち上げ、Yahooファイナンスからデータを取得します。
- キューに1件以上のデータがあれば、過去に中止されたプロセスとみなし、キューの中のデータを使います。
プロセスの後半では、Excelへの書き込みを行います。
中止と再実行をわかりやすくするために、Excelへのデータの書き込みは一件ずつにしています(Blue Prismでは、一気に表形式のデータをExcelに入力することもできます)。
一件ずつの書き込みをするごとに、Request Stop(中止を要求)が行われたかどうか、チェックしています。これは、分岐の中に IsStopRequested() を入れることで実現しています。今回は、Immediate Stop(即時中止)は使わず、Request Stop(中止を要求)を使って中止を行う前提で考えています。これにより、キューにデータを入れる前のような危険な場所で中止することはなく、安全に中止することができます。
やってみよう(実行編)
まず実行し、実行の途中で中止し、再実行しています。
初回実行ではWebブラウザが立ち上がりましたが、再実行ではWebブラウザは立ち上がりません。
中止はRequest Stop(中止を要求)により安全に行われ、中止後にキューにデータがたまっていることがわかります。
やったぜ。
まとめ
キューを使って、実行途中のデータを保存させることで、頭から再実行してもOKなべき等プロセスを作成しました。
今回は安全な中止を実現させるために、Immediate Stop(即時中止)ではなくRequest Stop(中止を要求)を使用しました。
追伸:キューは一時記憶装置、と書いてますが、データベースに永続化されるので揮発性のデータソースではありません。