非同期システムとはの話
非同期システムというとあるプロセスが別プロセスを呼び出し、応答をまたずに両方動き出す的なシステムのことです。
WebアプリではAjaxなどの非同期通信を考えるといいでしょうか?
一般的にブラウザはサーバへアクセスしてページを表示する場合には画面更新が必要になります。
非同期通信(Ajax)を使うことで画面の一部もしくは情報だけを再描写するなど実現しています。
これによりリッチな画面設計などが可能になりました。
今回の非同期システムはもう少しシステム内部に入った部分の内容となっております。
内容はWebアプリ(窓口)とバックグランド処理(作業員)との非同期、今回はこれを指しています。
※ Webシステムとは限りませんが…
Webアプリ(窓口)では顧客からのリクエストに対して画面描写を受付にて処理します。
何らかの処理が必要なもの(窓口業務外)の場合は、専任のバックグラウンド処理(作業員)に依頼をだします。
この依頼を出す処理が非同期にしているため非同期システムと呼んでいます。
依頼出した時にWebアプリ(窓口)ではバックグラウンド処理(作業員)の応答を待たずに次の処理に移ります。
これが非同期システムと呼んでます。作業完了まで待つのが同期システムです
バックグラウンド処理(作業員)は呼び出さされるとメッセージの内容により処理を行います。
バックグラウンド処理(作業員)は自信の状態を作業ステータスとしてDBやメモリなどで管理します。
Webアプリ(受付)ではこの作業ステータスを見て顧客への返答を切り替えています。
もしも同期型とした場合、膨大な処理時間がかかるリクエストが顧客から来た場合にはWebアプリ(窓口)ではそのリクエストが完了するまで待っていますので… HTTPリクエストのタイムアウトなどが発生します。
非同期型とした場合にはバックグランド処理(作業員)に依頼を出してすぐに窓口業務を再開できるのでタイムアウトは発生しません。毎時の顧客からのリクエスト時に作業ステータスを確認するだけです。
ただ問題としては、バックグラウンド処理(作業員)が途中で止まり、作業ステータスを変更せずに終えてしまうとずっと待ったままになるのが注意が必要です。この辺りはシステム設計を考えてください。
(進捗管理など)
初めにバックグラウンド処理を使わない同期型(手続き)のシーケンス図以下にまとめます。
2.1.1.2.2: 膨大な処理(赤色)にて膨大な処理時間がかかっております
顧客は「1:ページアクセス」にて状態が”受付可能”のため受付可能ページが表示されます。
そのページ内には受付処理を行える[受付する]ボタンが設置されています。
顧客は[受付する]ボタンを押下すると、受付処理が行われることとなります。(2.1:更新送信)
受付処理では、今回問題である処理時間が膨大となる箇所が含まれています(「2.1.1.2.2:受付処理」(赤色))
膨大な処理が終わらない限り2.1.1.2.2以降の処理は行われてません…
応答もなく、ページの生成も行われていないため白画面が表示されたままになります…
それでも時間がかけて放置していくと、HTTPのタイムアウトになるでしょう。
タイムアウトしてもプロセスは生きていますのでしばらく放置すると処理は正常に終了します
顧客が[受付する]ボタンを押下後に処理に待ちきれずにブラウザの更新ボタンを押下すると「2.1.1.2.1:状態を処理中にする」となっていますので2.1.1.1:状態を確認するにて処理中となるため処理中ページが表示されます。(図には書いてないけど)
こう言ったシステムって地味に多いです。
膨大な処理時間のかかる場合にどうすればいいのかを考えますと非同期でバックグラウンド処理を実行させればいいです。
バックグラウンド処理を加えた非同期型を考えるとシーケンス図は以下です。
ここで「2.1.2.2.1 膨大な処理」(赤色)に膨大な処理時間がかかっております
個別に流れを見ると
顧客からの初回リクエストが来た場合(1:ページ表示する)に、1.1.状態を確認にて状態を確認し、状態が”受付可能”なので、[受付する]ボタンが有効な受付可能ページを表示します。
顧客は[受付する]ボタンを押下することで受付リクエスト(2.1 : リクエスト送信 )が投げられます。
リクエストを受信するとバックグラウンド処理に実行するメッセージ(2.1.1:実行する)を非同期で投げて待たずに受付中ページを生成・返却します。
※ 2.1 と 2.1.1の間に再送チェックを入れてください
顧客は再びアクセスする(3:ページを表示する)と状態を確認する(3.1:状態を確認する)と”処理中”となり処理中ページが表示されます。(Ajaxなどでしたらここでプログレスバーとかを表示してください)
処理中ページはバックグラウンド処理が終了時に状態を変更、2.1.1.3:状態を受付終了に設定するメッセージが処理されるまで続きます
バックグラウンド処理の実行(2.1.1:実行する)の実装方法はいろいろありますが
データベースのステータス監視をcronにて秒単位にしても良いですし、
コマンドを打ってプロセス実行(exec)でもいいでしょうか
MQを使ってもいいですw
終いに
今回は、バックグランドプロセスの非同期システムの話でした
結構調べずにばばばーと書いたので裏打ちの少ない覚書程度です
先にありましたMQ解説記事を書いていてバックグランド処理の説明が不必要になりまして簡単に書いていたら結構な規模になってきましたので分割しました。
次回は… MQ実装サンプルと思いましたが、MQの基礎的な部分が全く書いていませんので残しておきます