[OutSystems]Timer以外の非同期要素が実際に動作するまでの時間

サーバサイドで動く非同期プログラミング要素である、OutSystems 11のBPTおよびLight BPT、ODCのEventが実際にどの程度のタイムラグで開始するかを確認してみる。

ドキュメントには記載がなかったと思うので、実地に各機能を10回実行し、トリガーの発生時刻と実際に対応するServer Actionが始まった時刻の差を秒単位で確認した。

:::note info
秒単位なのは、OutSystemsの標準機能では、秒単位でしか取れないため。O11はC#を書いてミリ秒を取る選択肢もあるが、そこまではやらない
:::

# 環境情報
## OutSystems 11
Personal Environment(Version 11.27.0 (Build 42818))
Service Studio(Version 11.54.66)

## ODC
ODC Studio(Version 1.4.15)

# 結果まとめ
以下の通り、BPTの起動は数秒くらいのラグがあり、O11のLight BPT及びODCのEventはほぼリアルタイムで開始する。

よって、Light BPTやEventであれば、数秒単位のパフォーマンスチューニングにも使える可能性がある。

|  | 最小（秒） | 最大（秒） |  |
|:-|:-:|:-:|:-:|
| BPT - LaunchProcessで起動  | 1  | 6  | 実行開始まで数秒かかる  |
| BPT - LaunchOnで起動  | 2  | 6  | LaunchProcessと同じくらい  |
| Light BPT  | 0  | 1  | DBトリガーで即起動していそうな時間  |
| Event (ODC)  | 0  | 1  | Light BPTと同じ  |

# BPT (OutSystems 11)
BPTは、ワークフローや非同期処理の作成に使う。
Service StudioのProcessesタブから作成する。
## LaunchProcessで起動した場合の、実行開始までの時間
### 動作確認用実装
実行時間記録用に以下のようなEntitiyを用意する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/be766ee2-3999-d6af-e5d8-10d602301463.png)
- RequestAt (Date Time) : 起動トリガー発生日時（この場合はLaunchProcess実行直前）
- StartAt (Date Time) : 起動された処理の先頭の日時（この場合は、Process内Automatic Activityの先頭）
- ElapsedSeconds (Integer) : 上２つの項目の差（秒単位）

以下のように、呼び出し側とProcessの先頭それぞれの日時を記録し、その差（秒数）を計算する。
- 起動前に取得したCurrDateTime()をEntityに登録
- LaunchProcessでProcess起動
- Process先頭でCurrDateTime()を同じEntityの別Attributeに記録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0f0f55f8-41e4-c37f-d74b-077feccb0a88.png)

### 結果
Elapsed Seconds列が経過時間（秒数）。1-6秒で起動していることになる。リアルタイムではないがほぼ即座に起動している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5f64040f-7a60-fcb0-ccf4-ac5183d32d74.png)

## LaunchOnで起動した場合の、実行開始までの時間
### 動作確認用実装 (LaunchProcessとの差分のみ）
LaunchOnは、Entity ActionのCreate〇〇を指定し、そのタイミングで起動させる、Processのプロパティ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c8703239-66d8-4ece-e834-288b037a7ffc.png)

これで、Create Actionを呼ぶと、Processが自動で起動するため、呼び出し側ではLaunchProcess Actionの呼び出しは必要ない。

### 結果
2-6秒で開始している。LaunchProcessと同じくらい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a283d3be-4c3a-5bf0-7ffa-b6ce2f5e9990.png)

# Light BPT (OutSystems 11)
Light BPTはBPTの特殊なタイプで、Automatic Activity1つだけを含み、かつLaunchOnで起動するBPTを、より軽量に動作するようにしたもの。

詳細は以前まとめた別記事を参照。

https://qiita.com/jyunji_watanabe/items/f98da5ba4b0a6f0fe07d

## 起動した場合の、実行開始までの時間
### 動作確認用実装 (BPTのLaunchOnとの差分のみ）
Service Centerでモジュールのページを開き、Operationタブ内のLight process executionにチェックを入れて、Applyボタンをクリック。その後、Light BPT用のProcessを含む状態でPublishする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/39e652ae-4f9c-b43e-48e2-666feef71f1f.png)

### 結果
0-1秒で起動している。こちらは本当に早い。秒単位のパフォーマンスチューニングにも使えそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/40a66bea-c1f3-a0ba-692d-a550887449a0.png)

# Event (ODC)
ODCでは、Appに直接属するEventを公開し、自Appまたは他AppからSubscribeしてイベントハンドラー（Server Action）を動作させることができる。

詳細は、以前書いた以下の記事を参照。

https://qiita.com/jyunji_watanabe/items/d867db0723e5584039ff

ODC StudioのEventsタブから作成する。

## 起動した場合の、実行開始までの時間
### 動作確認用実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4f6a4dd3-4015-d5c3-9c4c-138d89ce7a2e.png)


### 結果
Light BPTと同じくらいの時間。Message Brokerは十分早いようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cb2719a2-2d7a-6437-ce42-d78c3ecfb566.png)


# （補足）OutSystems 11のTimerの場合
Timerのスケジュールされた時間、もしくはWakeした時間と実際に実行される時間の間にはギャップがあるとドキュメントにある。具体的な秒数は書かれていなかったと思うが、経験やフォーラムの投稿を見ると10-20秒程度だろうか。

[Timer > Checking the Timers health- OutSystems 11 Documentation](https://success.outsystems.com/documentation/11/reference/outsystems_language/processes/timer/#checking-the-timers-health)に以下のように記載されている通り、Timerの実行リクエストがTimers Fetcherによろってキューイングされるまでラグがある。

> The Timers Fetcher is a thread that **awakes from time to time** to fetch Timer jobs to be executed and puts them in the queue to be picked. At the current time, it was sleeping.