nekonoteも借りたい

nekonote が IT系の技術を学んだ際のメモなどを残していこうと思います

RESTにおける「コードオンデマンド」の可視性の低下のデメリットとは?

こんにちは、nekonote-civ です(ΦωΦ)

本日は先日のRESTについて勉強する - RESTとは? - nekonoteも借りたいに記載した「コードオンデマンド」と「可視性」について調査した内容をまとめてみようと思います!

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) | 山本 陽平 |本 | 通販 | Amazon

目次

本記事をまとめようと思った経緯

フィヨルドブートキャンプ では日報を書くのですが、いつものように書籍を読み「ここが大事だな!」と思ったところを書き連ねていたところ、「コードオンデマンドにより可視性が低下する」という自分で書いた文章の意味を説明出来ない事にふと気づきました。

引用元:Webを支える技術 P.90 付近

ただし、コードオンデマンドには欠点もあります。それは、ネットワーク通信におけるプロトコルの可視性が低下することです。 HTTP というアプリケーションプロトコルに従って通信している間は、通信の意味やアクセスするリソースが明白です。しかしコードオンデマンドでプログラムをダウンロードし、クライアント側で実行してしまうと、アプリケーションプロトコルの可視性は低下します。

「可視性が低下すると何が駄目なの?」と問われたらどう答えるべきでしょうか?

どうしても自分で答えが見いだせず、フィヨルドブートキャンプ 内のQ&Aに投稿したところ、「原典である論文を読もう」という非常に的確なアドバイスを頂き、調査をしたのがこの記事の内容になります。

論文を読もう(可視性について)

以下の内容は、ロイ・フィールディングという、コンピュータ学者でありRESTの創始者の方の論文から引用しています。

www.ics.uci.edu

該当する用語を見ていくと、2.3.5 Visibility がまさにマッチングする内容と見られるため、こちらに注目してみます。

Styles can also influence the visibility of interactions within a network-based application by restricting interfaces via generality or providing access to monitoring.

ここでのスタイルは、クライアント/サーバ間のインターフェースを制限(GET/POST等)したり、モニタリングを提供することで、ネットワーク上でアクセスするアプリケーション内の相互作用の可視性に影響を与えることが出来る、と説明していると読み取れます。

Visibility in this case refers to the ability of a component to monitor or mediate the interaction between two other components.

この場合での「可視性」とは、コンポーネント間(ここではクライアント/サーバと考える)の相互作用を監視/仲介するコンポーネントの能力を指しているのでは無いでしょうか。
コンポーネントという言葉は「部品」といった意味合いが大きそうですが、「監視するコンポーネント」となると監視サーバとかが考えられそうですね。

Visibility can enable improved performance via shared caching of interactions, scalability through layered services, reliability through reflective monitoring, and security by allowing the interactions to be inspected by mediators (e.g., network firewalls).

可視性は、インタラクションの共有キャッシングによるパフォーマンスの向上、階層化されたサービスによるスケーラビリティ、リフレクション モニタリングによる信頼性、およびメディエータ (ネットワーク ファイアウォールなど) によるインタラクションの検査を可能にすることによるセキュリティの向上を可能にする。
...ちょっと難しい横文字が多くて大変ですが、「そもそも可視性が高いと、パフォーマンスの向上やセキュリティリスクの軽減を期待できる」みたいな感じでしょうか。

The mobile agent style is an example where the lack of visibility may lead to security concerns.

モバイルエージェントのスタイルは、可視性の欠如がセキュリティの懸念につながる可能性がある例である。

ここでのモバイルエージェントとは「ネットワークを介した分散処理技術により、ネットワーク接続されたコンピュータ間をエージェントと称されるプログラムが移動しながら処理を行うもの」といったもの。
同書に当てはめると「JavaScript」「Javaアプレット」など、クライアント側にプログラムをダウンロードして処理してもらうという部分のことを指している事が分かります(前回の記事で出てきた「コードオンデマンド」のことですね)。

「モバイルエージェント」については下記のような論文も出ています。

モバイルエージェント技術と研究動向

論文を読もう(コードオンデマンドについて)

先程の論文の3.5.3 Code on Demand (COD)でコードオンデマンドについて説明されています。

The advantages of code-on-demand include the ability to add features to a deployed client, which provides for improved extensibility and configurability, and better user-perceived performance and efficiency when the code can adapt its actions to the client's environment and interact with the user locally rather than through remote interactions.
Simplicity is reduced due to the need to manage the evaluation environment, but that may be compensated in some cases as a result of simplifying the client's static functionality.
Scalability of the server is improved, since it can off-load work to the client that would otherwise have consumed its resources. Like remote evaluation, the most significant limitation is the lack of visibility due to the server sending code instead of simple data.
Lack of visibility leads to obvious deployment problems if the client cannot trust the servers.

こちらも要約すると

「コードオンデマンドはクライアントに機能を追加することで拡張性が高く、ローカルで実行するためサーバリソースを消費せずスケーラビリティが向上する。
しかし、サーバーがデータのやり取りではなく「コード」を送信するため、可視性が欠如する。 また、これは「クライアントがサーバを信頼するという」前提の元で成り立っている」

といった感じでしょうか。 「データ」ではなく「コード」を送る、というのがここの肝となります。
外部から確認できるデータ(通常はHTMLやTEXTの形式)ではなく、プログラムコードがサーバ/クライアント間を流れていると、それを見ても「何をしているかわからない」状態になってしまうようです。

ここまでを元にした自分の解釈

ここまでの内容や論文内の「Visibiliry」に関連しそうな箇所の内容をまとめてみると、

RESTというアーキテクチャスタイルを利用することにより、固定のメソッドや形式(インタフェース)にて通信が行われるので必要以外なところを気にせずに決まったルールで監視も出来るし、セキュリティ性の向上が期待できたり、階層化することでスケーラビリティを持つことなどが出来る。

といったことが可視性を持つ事による主なメリットになるのではないでしょうか。

そして、可視性というのは「クライアント/サーバ」間での相互作用を監視/仲介してくれるコンポーネント...つまりここでは主に第3者による REST API の監視などを指すのではないかと考えました。

例えば、Amazon CloudWatch を利用することで REST APIの実行をモニタリングし様々な計測が出来るかと思いますが、これがここでの「可視性」にあたるものの一つではないでしょうか。 このようなモニタリングの仕組みを用いれば、通信の記録を的確に把握して必要に応じた形式に変換し、レポートとして出すことが出来る、アラート管理が容易であるなどのメリットが考えられます。

Amazon CloudWatch のメトリクスを使用した REST API の実行のモニタリング docs.aws.amazon.com

まとめ

特定のインタフェースを用いた通信をしている間は、便利な監視ツール等を用いることで常に安全/拡張性等のある状態を保つことが出来るけど、モバイルエージェントなどを使ってクライアント側で複雑な処理をしてしまう場合、リッチな動作は提供できるが、本来 クライアント/サーバ による通信で常に見えていた細かい作業までもが隠蔽されてしまう事により、上述のようなメリットを受けられない状態を作ってしまう」というのが「可視性の低下によるデメリット」である、と考えました。
(流石にこの概念は一言ではまとまらないですね...)

翻訳ミスによる解釈違い、理解の抜け漏れなども中にはあるかとは思いますが、「可視性が低下すると何が駄目なの?」という疑問に対してはある程度の回答が出来る様になったかと思います。

また、そもそもとして「クライアント/サーバ」間でやり取りしているデータはどのように使われるのか?ということまで意識できていませんでした。
「誰が」「どのように」使用するかを意識できていれば、もう少しメリット/デメリットについては自身でも思いついたのかなと感じます。
広い視野を持って問題を見つめる、というのは今後の勉強でも意識していきたいですね。

あとがき

1月8日から学習を開始しそろそろ3ヶ月目になります!時が経つのは早いですね!
気温も上がってきているので、勉強の合間の散歩がとても気持ちいいです🏃‍♂️

次回の記事は悩んでいますが「Ruby」「Rails」「Git」あたりについてまとめたいなと思っています!