InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

RESTfulなウェブサービスのバージョン管理戦略

作者 Dilip Krishnan , 翻訳者 徳武 聡 投稿日 2010年3月9日

セクション
運用/インフラ,
エンタープライズ・アーキテクチャ,
設計/アーキテクチャ
トピック
REST ,
SOA ,
Versioning
タグ
URI

原文(投稿日:2010/03/04)へのリンク

この記事でStu Charlton氏はRESTfulなサービスのバージョン管理のさまざまな選択肢を挙げている。しかし、氏は前置きとして次のように書いている。“これらの例は説明するにはトリッキーな概念で、この話題について何か小さな本を書こうとは思いません。”氏はバージョン管理の問題をふたつのタイプに分けている。ひとつはデータのバージョン管理で、リソースそのものバージョン管理を支援し、リソースの状態の変化を追跡することで、あるリソースの状態を明らかにできる。もうひとつは言語のバージョン管理で、言語とはプロトコルそのものことで、言い換えれば表現のことだ。

URIのバージョン管理は[…]リソースそのものは不変で新しい状態のリソースを作成するときの選択肢の設計することです(これはデータベースで時系列のデータを扱う方法に似ています)。

一方、言語の拡張またはバージョン管理はリソースの状態ではなくデータの表現の仕方を変える方法のことです。

Stu Charlton氏はW3C TAGでDavid Orchard氏が作成したバージョン互換性戦略のドラフトに依拠している。この戦略が明らかにするのは、前方互換性や後方互換性、また互換性を維持しない変更の複雑さだ。“言語の拡張については考えなければならない点がある”、とした上で氏は下記のことを強調する。

ルール #1: 前方そして/または後方の互換性を維持する方法で言語を拡張するのが望ましい。非互換であることを表すのにバージョン識別子を使うのは最終手段にする。

氏は下記のような表でこのドラフトの内容をまとめている。

  消費者 生産者
後方互換
  • バージョン通知を探す
  • 置き換えまたはサイドバイサイド
  • 通信以外のチャンネルまたはリンクによるバージョン通知
前方互換
  • 不明な要素でもその表現は受信する
  • 状態を永続化する必要があるなら不明な表現でも保持する
  • バージョン識別子代替モデル
  • メディアタイプの仕様で消費者側に期待する前方互換性を定義する(そして/または読み取り可能なスキーマで前方互換性拡張領域を明示する)。
非互換
  • バージョン識別子をチェックする
  • サイドバイサイドまたは互換性のない置き換え

氏は続けて、上の表で使っているバージョン通知置き換えサイドバイサイドバージョン識別子という言葉を定義し、さまざまな互換性のシナリオの中で生産者と消費者がどうやって“言語”が不明の要素を扱うかについて説明している。ここで氏はバージョン識別子を提供するいろいろな戦略を検討して、これらの戦略を適用する際の優先度について議論している。

メディアタイプコンテンツの中にバージョン識別子を含める

この方法はありふれています。例えばHTML DOCTYPEであり、XMLNSもこの方法に使えます。またPDFドキュメントにバージョン識別子を含む方法もそうです。[…] この方法が実現できるのはウェブで扱われるメディアタイプのほとんどが長い間使われてきて、相応に成功を収めているからです。しかし、これらのフォーマットは前方互換を考慮して、長期の視点に立って設計されていることに注意する必要があります。

MIMEの中にバージョン識別子を含める

[…]この方法の利点はURI空間に影響を与えることなくサイドバイサイドのバージョン管理を実現できることです。[…しかし…]この方法だとハイパーメディアが扱いにくくなり、ウェブアーキテクチャ(HTTP そして/または URI)以外のレイヤに影響が出てしまいがちです。例えば、application/vnd.mytype;version=2のような表現になります。

URIの中にバージョン識別子を含める

リソースの意味自体が変わったらURIを新しくするのは当然のことです。なので、リソースがその表現とともに変化すれば、新しいURIが生まれます。[…] 例えば、http://example.com/data/v1/po/123のようなものです。

また、ブックマークの問題もあります。この問題は、データベースシステムの"外部キー"の問題と似ています。リレーショナルデータベースについて知っているひとなら、主キーは絶対に変更すべきでないということを知っていると思います。これは外部キーを更新するのが大変だからです。

氏が勧めるのは、Subbu Allamaraju氏が書いたRESTful Web Services Cookbookの13章を読んでこのテーマについての理解を深めることだ。そして、自身の記事を次のような要約で締めくくっている。

  1. 言語と互換性のための置き換え方法は、柔軟で前方と後方に互換性を持ようにするのが望ましい。Note the W3C TAGのバージョン識別子についての見解を参照すること。
  2. URIの中にバージョン識別子を入れる場合はよく考えいること。今までのかっこいいURIを変更しないように。
  3. サイドバイサイドでバージョン管理をする場合は、バージョンの新しい/古いが判別できる情報をメディアの一部かリンクに含めること。参照の更新は消費者がキャッシュをリフレッシュしたときでよい。古い言語と結びついているURIには恒久的なリダイレクトを設定する。
  4. リソースの意味が変わったらURIのバージョンを変えること。ただし、リンクで古いバージョンか新しいバージョンかわかるようにすることが消費者側に対する礼儀。

氏の記事はRESTfulなサービスのバージョン管理問題 への解決策を構成する要素をまとめあげようとしている。しかし、これらの戦略についてはどの選択肢が正しいのかについて議論が続いている

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。