平成25年春期試験午後問題 問8

問8 情報システム開発

⇱問題PDF
プロビジョニングシステムの設計に関する次の記述を読んで,設問1~4に答えよ。
 L社では,新規に仮想サーバのホスティングサービスを開始することになった。このサービスでは,利用者が任意のタイミングで仮想サーバの作成,起動,停止及び削除を行うことができるプロビジョニングの機能を提供する。仮想サーバのホスティングサービスのシステムの全体構成を図1に示す。
 仮想サーバのホスティングサービスのシステムは,仮想サーバシステムと,仮想サーバホスティングシステムから構成される。
 仮想サーバシステムには市販の製品を用いる。仮想サーバ管理APIは,仮想サーバシステムと他のシステムとの連携動作を実現するために用いるAPIである。仮想サーバホスティングシステムは,これを呼び出すことで,仮想サーバの制御を行う。
 仮想サーバホスティングシステムは,管理ポータルサイトとプロビジョニングシステムから成り,これらはL社が新規に開発する。
 管理ポータルサイトは,仮想サーバの作成,起動,停止及び削除を指示したり,現在の状態を確認したりする,利用者向けのポータルサイトである。
 プロビジョニングシステムは,管理ポータルサイトからのメッセージに応じて仮想サーバ管理APIを呼び出すことで,仮想サーバの作成,起動,停止及び削除を行うシステムである。
pm08_1.gif
〔仮想サーバ管理APIの仕様〕
 仮想サーバ管理APIの仕様上,仮想サーバには,未作成,作成中,起動中,起動,停止中,停止,削除中及び削除済の状態がある。仮想サーバ管理APIの仕様を表1に示す。
pm08_2.gif
 仮想サーバ管理APIは,呼び出されたAPIの処理が完了した時点で応答を返す。例えば CreateServer を実行すると,サーバの作成が完了した時点で,呼出し側にサーバIDを返す。
 仮想サーバ管理APIは,複数のスレッドから同時に呼び出すことで並列に動作させることができるが,同一のサーバIDに対するAPIを複数のスレッドから同時に呼び出すと,APIがエラーになることがある。同一のサーバIDに対するAPI呼出しの排他制御は,APIを呼び出すアプリケーションで行う必要がある。

〔プロビジョニングシステムの設計〕
 仮想サーバホスティングシステムの開発に当たって,プロビジョニングシステムの設計を行った。
 まず,プロビジョニングシステムの管理下に置く仮想サーバについて,プロビジョニングシステム上での状態遷移の仕様を定義した。仮想サーバの状態遷移は,仮想サーバごとに独立に制御する。一つの仮想サーバの状態遷移の仕様を図2に示す。
 仮想サーバの状態は,管理ポータルサイトからのメッセージの受信や,処理完了の検出などのイベントが発生したときに遷移する。
 なお,プロビジョニングシステム上での仮想サーバの状態の定義は,仮想サーバ管理APIの仕様上の定義と必ずしも一致している必要はないが,ここではAPIを利用しやすくするために,同じ定義を用いることにした。
pm08_3.gif

 次に,図2の状態遷移の仕様を実現するための,プロビジョニングシステムの構成を検討し,図3にまとめた。
 プロビジョニングシステムの管理下に置く仮想サーバの状態は,仮想サーバのサーバIDなどの情報とあわせてデータベースに格納しておく。イベント発生時の状態遷移は,メッセージキューとメッセージハンドラを用いて実現する。

 管理ポータルサイトから送信されたメッセージは,メッセージキューに格納される。メッセージキューに格納されたメッセージは,ディスパッチャが順次取得する。ディスパッチャは,取得したメッセージの内容と,仮想サーバの現在の状態に応じて,適切な種類のメッセージハンドラを生成する。生成したメッセージハンドラは,それぞれ独立した別々のスレッドで動作させる。メッセージキューに複数のメッセージが存在した場合は,メッセージごとに別々のスレッドを生成し,それぞれのメッセージハンドラを並列に動作させる。
 メッセージハンドラは,データベースを更新し,仮想サーバ管理APIを呼び出す。メッセージハンドラの定義を表2に,ディスパッチャによるメッセージハンドラの選択ルールを表3に示す。
pm08_4.gif
 例えば,ある仮想サーバの現在の状態が"起動"のときにサーバ停止のメッセージを受け取ると,ディスパッチャは表3のルールに従って,Stopping のメッセージハンドラを生成する。Stopping のメッセージハンドラでは,表2の定義に従って,データベース中の仮想サーバの状態を"停止中"に変更した後,仮想サーバ管理APIの StopServer を呼び出す。メッセージハンドラは,メッセージハンドラの処理完了のイベントを発生させる必要がある場合に限り,呼び出したAPIの処理終了後に処理完了メッセージを生成し,メッセージキューに格納する。

〔仮想サーバ削除時の自動停止機能の仕様変更〕
 仮想サーバの状態が"起動"のときにサーバ削除のメッセージを受信した場合は,メッセージハンドラが StopServer のAPIを呼び出した後,自動的に状態遷移して,続いて DeleteServer のAPIが呼び出されるようにすることで,サーバを削除できるように仕様を変更することにした。このとき,(ⅰ)サーバ停止とサーバ削除の二つのメッセージをメッセージキューに格納するだけだと,意図した結果にならないことがある。そこで,"停止・削除中"の状態を新設することにした。
 変更後の状態遷移では,仮想サーバの状態が"起動"のときにサーバ削除のメッセージを受け取ると,仮想サーバは"停止・削除中"の状態に遷移し,StopServer のAPIが呼び出される。StopServer が完了すると,自動的に"削除中"の状態に遷移し,DeleteServer のAPIが呼び出される。
 仕様を変更するために,表2と表3について,(1)~(3)の修正を加えた。
  • 表2に,StopDeleting の行を追加する。追加する内容を表4に示す。
  • 表3に,"停止・削除中"の列を追加する。追加する内容を表5に示す。
  • 表3中の仮想サーバの状態が"d"で,メッセージの種類がeの箇所のメッセージハンドラ名を,fに変更する。
pm08_5.gif

設問1

表2及び表3中のacに入れる適切な字句を答えよ。

解答例・解答の要点

a:停止
b:Starting
c:Deleting

解説

プロビジョニングシステムとは、システムや計算装置等の設備などの資源を仮想化し、利用者の申請や需要に応じてそれらを動的に割り当てることのできるシステムです。プロビジョン(provision)には、支給、提供、準備などの意味があります。

本問では、プロビジョニングシステムの設計に当たり、仮想サーバのイベント発生時の状態遷移を実現するメッセージハンドラについて検討をします。メッセージハンドラは、システム内で何らかの処理が必要となった場合、その処理を行うように指示を出す役割を持ちます。主に問題文から各メッセージハンドラの役割を正しく理解し、仕様を設計できるかどうかが問われています。

設問1では、図2と表2、表3を紐づけることで各空欄内の答えを導くことができます。

aについて〕
空欄の状態変更を行うメッセージハンドラ名は「Created」なので、この「Created」を生成することができる仮想サーバの状態を調べます。表3より、ディスパッチャがメッセージハンドラ「Created」を生成するのは、仮想サーバの現在の状態が"作成中"で、メッセージ"処理完了"を取得したときであることが読み取れます。
pm08_7.gif
図2を見ると、仮想サーバが"作成中"の状態で、メッセージ"処理完了"を取得すると、"停止"の状態へ遷移することがわかります。よって[a]には「停止」が入ります。
pm08_8.gif
a=停止

bについて〕
空欄は"停止"と"サーバ起動"が交わる箇所です。図2で、仮想サーバの状態が"停止"で、メッセージ"サーバ起動"を取得したときの仮想サーバの状態を確認すると、"起動中"の状態へ遷移していることがわかります。
pm08_9.gif
表2を見ると、状態を"起動中"に変更するメッセージハンドラは「Starting」です。よって、[b]には「Starting」が入ります。

b=Starting

cについて〕
この空欄も[b]と同じ手順で答えを導きます。
空欄は"停止"と"サーバ削除"が交わる箇所です。図2で、仮想サーバの状態が"停止"で、メッセージ"サーバ削除"を取得したときの仮想サーバの状態を確認すると、"削除中"の状態へ遷移していることがわかります。
pm08_10.gif
表2を見ると、状態を"削除中"に変更するメッセージハンドラは「Deleting」です。よって、[c]には「Deleting」が入ります。

c=Deleting

設問2

表2中の①~⑦について,処理完了メッセージを生成し,メッセージキューに格納するメッセージハンドラはどれか,①~⑦の番号で全て答えよ。

解答例・解答の要点

②,④,⑥

解説

メッセージハンドラによって指示されたイベントが完了した旨のメッセージを、システムに送信するかの有無を問うています。

〔プロビジョニングシステムの設計〕には、以下の記述があります。

「メッセージハンドラは、メッセージハンドラの処理完了のイベントを発生させる必要がある場合に限り、呼び出したAPIの処理終了後に処理完了メッセージを生成し、メッセージキューに格納する。」

表3を見ると、処理完了のイベントを契機として生成されるメッセージハンドラは「Created」「Ready」「Stop」「Deleted」の4つです。この4つはそれぞれ"○○中"の処理が完了したとき、次のように仮想サーバの状態を変更する役割があります。
  • Creating → "作成中" → Created → "停止"
  • Starting → "起動中" → Ready → "起動"
  • Stopping → "停止中" → Stop → "停止"
  • Deleting → "削除中" → Deleted → "削除済"
よって、「Creating」「Starting」「Stoping」および「Deleteing」の4つについては、処理の完了後、仮想サーバの状態変更イベントを発生させるために、処理完了のメッセージを送信しなければなりません。表2の番号で答えるので「②,④,⑥」の組合せが適切です。

∴②,④,⑥

このような仕様になっているのは、「同一のサーバIDに対するAPIを複数のスレッドから同時に呼び出すと,APIがエラーになることがある」からです。処理完了メッセージにAPIが返すサーバIDを含めることで、同一スレッド内で完了処理を行えるようにしています。

設問3

本文中の下線(ⅰ)について,意図した結果にならない理由を,図2を参考に仮想サーバの状態と送信されるメッセージについて言及し,40字以内で述べよ。

解答例・解答の要点

仮想サーバの状態が,"停止"になる前にサーバ削除のメッセージが送信されるから (38文字)

解説

最初に現在の仕様における、起動中からサーバ削除までの手順を確認しておきます。
  1. "サーバ停止"メッセージを生成する
  2. メッセージハンドラ「Stopping」により"停止中"に遷移するとともに、StopServerが呼び出される
  3. StopServerの処理が完了(仮想サーバが停止)し、"処理完了"メッセージを生成する
  4. メッセージハンドラ「Stop」が選択され、"停止"に遷移する
  5. "サーバ削除"メッセージを生成する
  6. メッセージハンドラ「Deleting」により"削除中"に遷移するとともに、DeleteServerが呼び出される
  7. DeleteServerの処理が完了(仮想サーバが削除)し、"処理完了"メッセージを生成する
  8. メッセージハンドラ「Deleted」が選択され、"削除済"に遷移する
今回の仕様変更では、"起動"の状態から"サーバ停止"と"サーバ削除"を1回の命令のみで処理できるようにします。これを実現するために「サーバ停止とサーバ削除の二つのメッセージをメッセージキューに格納する」としていますが、サーバ削除はサーバの状態が"停止"のときのみ有効であることに注意しましょう。

ディスパッチャは、メッセージキューに格納されたメッセージを先頭から順次処理していくので、単に停止と削除のメッセージを順番に格納しただけでは、サーバの停止を待たずに"サーバ削除"メッセージが処理されることがあります。表3を見ると、サーバの状態が"停止中"のときに"サーバ削除"のメッセージを取得すると、ディスパッチャは「Err」を生成することが確認できます。このとき、サーバの削除に失敗し、意図した結果を得られません。
pm08_11.gif
設問では、「仮想サーバの状態と送信されるメッセージについて言及し」という条件があるので、
  • 仮想サーバの状態が"停止"になる前に、サーバ削除のメッセージが送信されるから
  • 仮想サーバの状態が"停止中"のときに、サーバ削除のメッセージが送信されるから
などの解答が適切となります。

∴仮想サーバの状態が,"停止"になる前にサーバ削除のメッセージが送信されるから

設問4

〔仮想サーバ削除時の自動停止機能の仕様変更〕について,(1),(2)に答えよ。
  • 状態遷移図に"停止・削除中"の状態を追加し,状態遷移図を完成させよ。
  • 本文中のdfに入れる適切な字句を答えよ。

解答例・解答の要点

  • pm08_6.gif
  • d:起動
    e:サーバ削除
    f:StopDeleting

解説

  • "停止・削除中"状態の前後の状態をイベントで紐づけます。

    ここでは問題文中の以下の記述が解答のヒントになっています。
    • 仮想サーバの状態が"起動"のときにサーバ削除のメッセージを受け取ると、仮想サーバは"停止・削除中"の状態に遷移し…
    • StopServerが完了すると、自動的に"削除中"の状態に遷移し、DeleteServerのAPIが呼び出される
    この記述をそのまま表現すると、
    • "起動"から"停止・削除中"に向けた矢印で、遷移条件が"サーバ削除"
    • "停止・削除中"から"削除中"に向けた矢印で、遷移条件が"処理完了"
    上記の2つが必要です。
    pm08_12.gif
  • 仕様変更に伴って、表3中で変更が必要な箇所と変更内容を解答します。

    仕様変更後の状態遷移については「仮想サーバの状態が"起動"のときにサーバ削除のメッセージを受け取ると、仮想サーバは"停止・削除中"の状態に遷移し、…」と記載されていますが、表3で"起動"と"サーバ削除"が交わる箇所を確認すると「Err」になっています。このままだとエラーになってしまうので、この場合に、"停止・削除中"の状態に遷移するように変更しなければなりません。"停止・削除中"に遷移させるメッセージハンドラは表4に記載されている「StopDeleting」です。

    したがって、仮想サーバの状態が"起動"で、メッセージの種類が"サーバ削除"の箇所を、メッセージハンドラ「StopDeleting」に変更することになります。

    d=起動
     e=サーバ削除
     f=StopDeleting

    なお、この変更内容を表3の形式に当てはめると以下のようになります。
    pm08_13.gif
模範解答

Pagetop