クーポン券発行システムの設計に関する次の記述を読んで,設問1〜3に答えよ。
X社は,全国に約400店のファミリーレストランを展開している。X社の会員向けWebサイトでは,割引料金で商品を注文できるクーポン券を発行しており,会員数は1,000万人を超える。このたび,会員の利便性の向上や店舗での注文受付業務の効率向上のために,会員のスマートフォン宛てにクーポン券を発行することになった。
スマートフォン宛てにクーポン券を発行する新しいシステム(以下,新システムという)は,スマートフォン向けアプリケーションソフトウェア(以下,スマホアプリという)とサーバ側のWebアプリケーションソフトウェア(以下,Webアプリという)から構成され,Webアプリの開発は情報システム部門のY君が担当することになった。
〔新システムの利用イメージ〕
X社の会員は,事前に自分のスマートフォンにX社のスマホアプリをダウンロードし,インストールしておく。会員がクーポン券を利用する際は,スマホアプリに会員IDとパスワードを入力してログインする。ログインが完了すると,おすすめ商品と利用可能なクーポン券の一覧が表示される。会員が利用したいクーポン券を選択すると,QRコードを含むクーポン券画面が表示される。X社店舗の注文スタッフがQRコードを注文受付端末で読み取ると,割引料金での注文ができる。
〔Webアプリの処理方式の調査〕
Y君がWebアプリの実現方式を検討したところ,X社のWebサイトで利用しているブロッキングI/O型のWebサーバソフトウェア(以下,サーバソフトという)では,スマホアプリからの同時アクセス数が増えると対応できないことが分かった。
ブロッキングI/O型のサーバソフトでは,ネットワークアクセスやファイルアクセスなどのI/O処理を行う場合,CPUは低速なI/O処理の完了を待って次の処理を実行する。例えば,表1に示す,QRコードを作成するために必要なWebアプリの処理(以下,QRコード作成処理という)の場合,全体の処理時間の a %がI/O処理の完了待ち時間となる。
表1 QRコード作成処理
処理 番号 |
処理内容 | 開始条件 | 処理時間 (ミリ秒) |
処理区分 |
1 | 会員のログイン状態を確認 | なし | 0.02 | CPU処理 |
2 | スマホアプリからクーポン券番号を取得 | 処理1の完了 | 10 | I/O処理 |
3 | クーポン券番号からQRコードの画像データをメモリに作成 | 処理2の完了 | 0.06 | CPU処理 |
4 | QRコードの画像データを画像ファイルに書き出し | 処理3の完了 | 3 | I/O処理 |
5 | クーポン券番号を発行履歴としてデータベースに書き込み | 処理2の完了 | 15 | I/O処理 |
6 | スマホアプリにQRコードの画像ファイルを返信 | 処理4の完了 | 5 | I/O処理 |
7 | QRコードの画像ファイルを削除 | 処理6の完了 | 2 | I/O処理 |
このため,ブロッキングI/O型のサーバソフトでは,複数のスマホアプリにサービスを提供するために,プロセスやスレッドを複数生成している。しかし,プロセスやスレッドの数が増えると,プロセスやスレッドの切替え処理である b スイッチがボトルネックとなり,CPUやメモリを追加してもスマホアプリからの同時アクセスへの対応は困難となる。
そこでY君は,多数のスマホアプリからのアクセスを効率よく処理できるノンブロッキングI/O型のサーバソフトの利用を検討した。ノンブロッキングI/O型のサーバソフトでは,一つのプロセスやスレッドの中で,CPUはI/O処理の完了を待たずに,実行可能なほかの処理を実行する。その結果,Webサーバは複数のプロセスやスレッドを生成する必要がなく,スマホアプリへも効率的にサービスを提供できる。
〔リアクタパターンの調査〕
ノンブロッキングI/O型のサーバソフトで,Webアプリを動作させるためには,非同期処理の考え方に基づいたソフトウェア設計が必要である。そこで,Y君は,ノンブロッキングI/O型の処理を実現するデザインパターンの一つであるリアクタパターンについて調査した。図1にY君が調査したリアクタパターンの処理の流れを示す。
図1 Y君が調査したリアクタパターンの処理の流れ
I/O処理の処理結果を利用する処理をハンドラとして定義する。次に,I/O処理の完了待ちを依頼したいメイン処理が,①I/O処理完了後に実行するハンドラ名を引数に“(ア)ハンドラの登録”を行うと,リアクタは“(イ)ハンドラを取得”する。次に,メイン処理がリアクタに“(ウ)イベントのハンドル依頼”を行うと,リアクタはデマルチプレクサに“(エ)イベント待ち”を指示する。デマルチプレクサは複数のI/O処理の完了を一括して監視し,“(オ)I/O処理の完了”を検知した場合には,対応する“(カ)イベント”をリアクタに発行する。イベントを受け取ったリアクタは“(キ)ハンドラを実行”する。メイン処理は,イベントのハンドル依頼を行った後は,I/O処理の完了を待たずにほかの処理を実行できる。
リアクタパターンを適用する場合は,遅いI/O処理の次に実行される処理をハンドラとして分割するのがよい。しかし,リアクタパターンに基づき設計されたプログラムは,②保守性が下がるおそれがある。
〔QRコード作成処理の設計〕
Y君は,リアクタパターンを用いて,スマホアプリからのアクセスに対する応答時間が最小になるように,QRコード作成処理を設計した。図2にY君が設計したQRコード作成処理の流れを示す。
図2 Y君が設計したQRコード作成処理の流れ
その後Y君は,新システムのWebアプリの開発を完了させ,X社の会員はスマートフォンを通じてクーポン券を利用することが可能となった。
出典:令和3年度春期 問8
設問1 〔Webアプリの処理方式の調査〕について,(1),(2)に答えよ。
(1)本文中の a に入れる適切な数値を答えよ。答えは,小数第3位を四捨五入して,小数第2位まで求めよ。
解答・解説
解答例
99.77
解説
(2)本文中の b に入れる適切な字句を答えよ。
解答・解説
解答例
コンテキスト
解説
設問2 〔リアクタパターンの調査〕について,(1),(2)に答えよ。
(1) 本文中の下線①について,関数呼出しの引数として渡される関数のことを何というか,解答群の中から選び,記号で答えよ。
解答群
- callback関数
- static関数,
- template関数
- virtual関数
解答・解説
解答例
ア
解説
(2)本文中の下線2について,プログラムの保守性が下がる理由を15字以内で述べよ。
解答・解説
解答例
可読性が下がるから
解説
設問3 〔QRコード作成処理の設計〕について,(1),(2)に答えよ。
(1)図2中の c 〜 f に入れる適切な処理番号を,表1中の処理番号を用いて答えよ。ただし,複数ある場合は全て答えよ。
解答・解説
解答例
c:2 d:3 e:4, 5 f:6
(d:3, 5 e:4 でも可)
解説
(2)図2のようにQRコード作成処理を設計した場合,処理4〜7はどのような順序で完了するか,処理が早く完了する順にコンマ区切りで答えよ。
解答・解説
解答例
4, 6, 7, 5
解説
IPA公開情報
出題趣旨
昨今,多数のクライアントに対して効率的にサービスを提供できるノンブロッキングI/O型のWebサーバソフトウェアが普及しつつある。
本問では,ファミリーレストランチェーンのクーポン券を発行するシステムを題材として,ノンブロッキン グI/O型のWebサーバソフトウェアに関する基本的な理解と,ノンブロッキングI/O型のWebサーバソフトウェアで動作するアプリケーションの設計能力について問う。
採点講評
問8では,クーポン券を発行するシステムを題材に,ノンブロッキングI/O型のWebサーバソフトウェアで動作するアプリケーションソフトウェアの構成について出題した。全体として正答率はやや低かった。
設問1(2)は,正答率が低かった。コンテキストスイッチについて問うたが,スレッドスイッチという解答が 散見された。コンテキストスイッチは,一つのCPUコアを有効に利用するためにプロセスやスレッドを切り替える重要な処理なので,是非理解してほしい。
設問3は,正答率が平均的であった。本文に示したデザインパターンに従ってソフトウェアを設計し,その処理順序について問う問題であった。デザインパターンを理解してソフトウェアを設計する能力は,良いソフトウェアを設計する上で重要なので,是非身に付けてほしい。