アットマーク・アイティ @IT@IT自分戦略研究所QA@ITイベントカレンダー+ログ
 @IT > Webサービスを実現するhp netaction > 第1回 Webサービスの課題とその解決を探る
 
@IT[FYI]

 


Webサービスを先取りするHPからの提案
連載 Webサービスを実現するhp netaction(1)

2001/12/19

第1回 Webサービスの課題とその解決を探る

 Webサービスは、インターネットを介して複数の企業が提供するサービスを利用することで、より価値の高いサービスの実現したり、業務の効率化やシステム間連携の短期開発を実現するものだ。最近では、Webサービスの適用分野として、従来からのBtoBをWebサービスに置き換えるケースや、企業内のシステム間連携にWebサービスを適用とするケースが論じられる傾向が出てきた。もちろん、これらもWebサービスであるが、想定される相手(システム)との連携は、いわば「Simple Webサービス」であり、既存のSOAP、WSDLなどのテクノロジーを使って実現可能な分野だ。

 しかし、本来Webサービスが目指すのは、複数のサービスが随所から自由に利用されるアドホックな連携だ。本稿ではこれを「Complex Webサービス」と呼ぶ。これを実用化するとなると、いくつかの課題が浮かび上がる。例えば、サービスを提供する側の信用とサービスの品質をどう保証するか、セキュリティをどう確保するかなどの重要な問題がある。そして、これらの問題に合わせて重要となるのは、複数のサービス間のトランザクションをどう確立させるかという問題だ。アプリケーションでカバーすればよいという議論もあるかもしれないが、トランザクションをプラットフォームとして用意すれば、アプケーションからは隠蔽され、どんなアプリケーションでもトランザクション利用できるようになるし、異なるアプリケーションでさえ、トランザクションで管理できるだろう。 そうすれば、Complex Webサービスのスタートを加速することになる。

 本稿では、Webサービスにおけるトランザクションの実現について論じ、これをサポートするHPのミドルウェアhp netactionに含まれるHP Web Services Transactionについて解説しよう。

Webサービスを加速するトランザクションのサポート

 少し抽象的な表現になるが、Webサービスにおいて、A、B、Cという3つのサービスをデータが渡り歩き、それぞれのサービスのデータベースを更新する例を考えてみる。A→B→Cとトラブルなく順調に処理が終了し、それぞれのデータベースが更新されるなら問題ない。しかし、実は、Bだけ処理が異常終了していたというケースでは、A、B、Cの間にデータの矛盾が生じ、正常なサービスの利用ができていないことになる。

 A、B、CというサービスがWebサービスではなく、通常の密な結合の上に存在していれば、この矛盾が生じない方策として2フェーズ・コミットを利用すればよい。つまり、最初のフェーズでトランザクションを構成する個々のサービスについて一度正常に処理が実現できるかを問い合わせ、すべての処理が実現可能であることが確認できた時点で、次のフェーズとして更新処理を行う。この 2つのフェーズのどこで不都合があってもコミットはせず、トランザクション処理自体がまったく実行されなかったことにするため、 複数のサービス上のデータベース更新する場合でも、矛盾なく更新できるわけだ。

 しかし、Webサービスでは、この2フェーズ・コミットを利用できない。これが、Webサービスでのトランザクションにおける最大の課題だ。前述したように、サービスの側でデータの整合性をカバーする方法もあるが、複数のサービスとの柔軟な連携を考えると、2フェーズ・コミットのような仕組みがあるほうがよい。

 では、なぜ2フェーズ・コミットが利用できないのか、そしてその代案として、分散したサービス(アプリケーション)の間で処理の一貫性を保つ分散トランザクションを保証するにはどうしたらよいのかについて、これから解説していこう。

[Column] 従来のトランザクションと2フェーズ・コミット

 アプリケーションを連携させるための技術的課題の1つがトランザクションの処理である。Webサービスにおけるトランザクションを考える前に、まずデータベースにおける古典的なトランザクションの考え方を簡単に振り返っておこう。
トランザクションとは複数の更新処理を1つの論理的な処理単位として捉えたものであり、実行処理の単位となる。トランザクションはいわゆるACID属性をもっている。


トランザクションのACID属性
原子性
(Atomicity)
トランザクションが行うリソースの更新に関連する操作は、細分化できない。処理は、すべて実行されるか(コミット)、すべて取り消されるか(ロールバック)である
一貫性
(Consistency)
トランザクションが行われる前後で、内部的に一貫性のある状態に保たれる。よく例としてあげられるのは、「口座振り替えでは、2つの預金口座の合計金額が 処理前後で同じである」というものである
隔離性
(Isolation)
同時に実行されている複数のトランザクションによるリソースへのアクセスは、互いに影響を与えない

持続性
(Durability)

トランザクションの結果は 障害などによって失われることがなく、永久に持続する

 更新処理が複数のリソースに分散している場合は分散トランザクションと呼ばれ、2フェーズ・コミットプロトコルが用いられる。2フェーズ・コミットは複数のリソースにまたがる更新処理でデータの一貫性を保証するための仕組みだが、データソースとは別にトランザクションマネージャやTPモニタと呼ばれるトランザクションのコーディネータが必要となる。2フェーズ・コミットでは、コーディネータは各リソースにまず更新の準備要求を送る。各リソースは更新可能な状態を整えてから、準備済みの応答を返す。すべてのリソースが準備済みであれば、コーディネータからコミットが送られ、各リソースでコミットが確定する。準備フェーズ、もしくはコミットフェーズで何らかの障害が発生した時は、すべてのリソースでロールバックされる


Webサービスのトランザクションは
「ロング・リブド・トランザクション」

 まず、2フェーズ・コミットのプロトコルをインターネットに流すことは難しい。分散トランザクションとしてはCORBA OTS、DCOMなど既存技術が存在するが、これらのプロトコルはファイアウォールを超えることが難しい。

 また、2フェーズ・コミットは、イントラネットなどの閉じた環境で用いられ、トランザクションマネージャ、リソース、アプリケーションのすべてが同じ人々によって作られ、利用され、管理されることを前提としている。つまり、すべてのコンポーネントが1つの組織でコントロールされる状態にある。その上、安定して稼動するインフラストラクチャ環境が前提であり、万が一、障害が起きたらロールバックを行う。一方、Webサービスのコンポーネントはしばしば自社内ではなくインターネットの向こう側に存在し、そのシステムは自分のコントロールが及ばない。IT管理者が社内システムを管理するよりも不確定要素が多く障害のリスクが高いことが予想される。しかも、こちらが24時間運用しようとしても、Webサービスの提供者が彼らの営業時間外にはサービスを停止する、といったこともあるかもしれない。つまり、トランザクション中のサービスの中断は頻繁に起きうるものとして、それに対応できるメカニズムが必要となる。

 また、Webサービスにおけるトランザクションは、ビジネス・プロセスの一連の処理に対応し、トランザクションのスコープには時としてアプリケーションの実行にとどまらず、承認など人為的なタスクを含むこともある。トランザクションのライフサイクルは、古典的なトランザクションのせいぜい数秒といったオーダーに対して、何日・何週間という長期に及ぶことがある。このことからWebサービスのトランザクションはロング・リブド・トランザクションと呼ばれる。

 ロング・リブド・トランザクションと古典的なACIDトランザクションとの大きな違いは、リソースのロック期間の長さとロックをかける人が誰か、ということである。ACID属性を保つためには、コミットをかけるまでのある一定時間、リソースをロックする必要があるが、果たしてコントロールが及ばない他人(他社)のアプリケーションによって自分のリソースが長期間ロックされることが許されるだろうか。へたをすればサービス妨害攻撃(DOS)など悪意のある攻撃によってサービスが容易に中断されてしまう危険性もある。Webサービスのトランザクションでは、リソースのロックによってACID属性を保証することが難しい場合があるということだ。

Webサービスのトランザクション記述言語「BTP」

 こうしたWebサービスのトランザクション問題に対して、現在、OASISではBusiness Transaction Protocol(以下BTP)と呼ばれる仕様の策定が進められている。BTPはHPやBEAによって標準化が進められており、2001年12月10日現在ではドラフト0.9版が提案されている。BTPは次に挙げる4つの要件を満たすようデザインされている。

  • 複数の処理を1つのトランザクションとして処理できること。ただしACIDの隔離性、持続性は保証しないこともある
  • トランザクションをどこか1カ所で集中的に管理するのではなく、トランザクションの関係者が自律的に管理できること
  • 営業時間外、ネットワーク障害など、一時的なサービスの中断を許容し、処理が継続できること
  • 複数の通信プロトコル上でXMLによる相互運用が可能であること

 BTPのメッセージはXMLで記述され、SOAPメッセージのHeaderやBodyに埋め込まれる形となる。BTPではトランザクションをAtom(原子)Cohesion(結合)という2つのユニットに分けて考え、これらを組み合わせることにより複雑なトランザクション管理の柔軟性を確保している。

Atom
(原子)
・ 2フェーズ・コミットに基づいた小さなスケールでの相互作用
・ACID属性
・Atom内の処理がどれか1つでも失敗すればAtomはキャンセルする
Cohesion
(結合)
・複数のAtomを組み合わせたより大きなスケールでの相互作用
・ビジネス・トランザクション
・non-ACID属性
・Cohesion内のAtomが失敗してもCohesionは継続できる。どのAtomの失敗を許容するかはアプリケーション・ロジックで決定する
・複数のCohesionを束ねて新しいCohesionを定義することもできる

 AtomによるACID属性に基づいた厳密なトランザクション管理と、Cohesionを使ったより大きなビジネス・トランザクションの構成により、BTPではトランザクションの信頼性と柔軟性を両立させている。注意して欲しいのは、BTPはWebサービスがその内部でどのようにACID属性を保証するか、ということには関与しないということだ。処理の失敗時に、古典的なロールバックでデータを元通りに戻しても良いし、ほかの形で失敗に対する埋め合わせの処理を行ってもよい。BTPが要求するのはただAtomでACID属性が保証されることだ。

 ところで、HPでは、BTP1.0が正式勧告となり次第、その実装製品であるHP Web Services Transaction(以下HP-WST)をリリースする予定だ。次に、実際に例を上げながらBTPによるトランザクション管理、そしてHP-WSTについて簡単に解説しよう。

HP Web Services Transactionによる
トランザクション管理

 あなたがいま、ニューヨークのホテルにいると仮定しよう。今回の旅行はあなたにとって初めての海外旅行で、ニューヨークの勝手がよく分からないのだが、夜は遊びに出たい。あなたは最新のミュージカルをみて、イタリアン・レストランで食事をした後にタクシーでホテルに帰りたいと考えている。

 さて、ミュージカル、レストラン、タクシーそれぞれの予約をWebサービスで行うことを考えてみよう。ミュージカル劇場、レストラン、タクシー会社はそれぞれ自前の予約システムを持っており、インターネット上にWebサービスとして提供しているとする。インターネット上には劇場予約、レストラン予約、タクシー予約のWebサービスが存在するとする。これらのWebサービスはBTPをサポートしている必要がある。そして、トランザクション・コーディネータとなる(これも1つのWebサービスであるが)BTPサービスが存在する。BTPサービスはHP-WSTが提供するものだが、この例のようにクライアントアプリケーションと独立して提供されても良いし、クライアントアプリケーションに合わせて実装されていても良い。なお、ここでのクライアントとはユーザに代わって一連の予約業務を代行してくれるサービスだ。ホテルのコンシェルジェに相当するものと考えれば良い。

Atomを使ったトランザクション

 さて、あなたが遊びに行くかどうかの条件を「劇場、レストラン、タクシーすべてが予約できたら遊びに行く、どれか1つでも失敗したら外出は中止」としよう。この場合、劇場、レストラン、タクシー予約のWebサービスをまとめて1つのトランザクションと定義する必要がある。BTPではこの処理単位をAtomと呼ぶ。予約が正常に完了できる場合の処理の流れを以下に示す。

Atomトランザクションの開始
Atomトランザクションの準備フェーズ
Atomトランザクションのコミットフェーズ

(1) クライアントがBTPサービスにAtom生成のリクエストを送る
(2) BTPサービスは新しいトランザクションを開始し、AtomのIDを発行する
(3) クライアントが劇場予約を行う
(4) 劇場予約Webサービスはトランザクション参加の通知として、BTPサービスにEnroll(登録)メッセージを送る
(5) 同様にしてクライアントがタクシー予約を行う
(6) タクシー予約Webサービスはトランザクション参加の通知として、BTPサービスにEnrollメッセージを送る
(7) クライアントがレストランの予約を行う
(8) レストラン予約Webサービスはトランザクション参加の通知として、BTPサービスにEnrollメッセージを送る
(9)

すべての予約が完了すると、クライアントからcommit(コミット)の準備フェーズとしてprepare(準備要求)メッセージがBTPサービスを介して各Webサービスへ送られる

(10) 各WebサービスがBTPサービスにconfirm(予約可能)であることを返す
(11) クライアントは最終的にconfirm指示を送り、すべての予約が確定する

 次に劇場が満席で予約できなかった場合を考えてみよう。この場合、このAtomはロールバックし、レストラン、タクシーへの予約はキャンセルしなければならない。先ほどの処理の流れで(9)までは共通である。

Atomトランザクションがキャンセルする場合

(10) タクシー、レストランはconfirmを返すが、劇場はcancel(予約不可)を返す
(11) このAtomはキャンセルしなければいけないので、BTPサービスはタクシー、レストランにcancelを送り、予約を取り消す
(12) Atomがcancelされたことがクライアントに通知される

 BTPサービスがトランザクションのコーディネータとして機能し、WebサービスやクライアントとBTPメッセージを伝播させる様がお分かりいただけると思う。

Cohesionを使ったトランザクション

  次はCohesionを使った例を考えてみよう。今度はあなたが遊びに行く条件を「劇場の予約成否に関わらず、レストランとタクシーさえ予約出来れば遊びに行く」とする。これをBTPで表すには、タクシーとレストラン予約を合わせて1つのAtom(Atom A)、劇場予約を別のAtom(Atom B)とし、Atom AとAtom Bを合わせたものをCohesionとして定義する。あなたの条件をBTPで表現すると、Atom Aが失敗したらCohesionはロールバックするが、Atom Bが失敗してもAtom Aが成功すればCohesionはコミットする、となる。

 劇場が満席で予約できなかったが、タクシーとレストランは予約できた場合は、以下のような処理となる。

Cohesionトランザクションの開始(Atom Aトランザクションの開始)

Atom Bトランザクションの開始

Cohesionトランザクションの準備フェーズ

Cohesionトランザクションのコミットフェーズ

(1) クライアントがBTPサービスにCohesion生成のリクエストを送る
(2) BTPサービスはCohesion IDを発行する
(3) クライアントはCohesionに含まれるAtom A生成のリクエストを送る
(4) BTPサービスはAtom AのAtom IDを発行する
(5) クライアントからタクシー予約を行う
(6) タクシーはBTPサービスにEnrollメッセージを送る(Atom A)
(7) クライアントがレストラン予約を行う(Atom A)
(8) レストランはBTPサービスにEnrollメッセージを送る(Atom A)
(9) クライアントはCohesionに含まれるAtom B生成のリクエストを送る
(10) BTPサービスはAtom BのAtom IDを発行する
(11) クライアントは劇場の予約を行う(Atom B)
(12) 劇場はBTPサービスにEnrollメッセージを送る(Atom B)
(13) すべての予約が完了すると、クライアントからcommitの準備フェーズとしてprepareメッセージがBTPサービスを介して各Webサービスへ送られる
(14) タクシーとレストランがBTPサービスにconfirmを返す(Atom A)
(15) 劇場は満席のため、BTPサービスにcancelを返す(Atom B)。劇場の予約はこの時点で既に失敗となる。
(16) BTPサービスはAtom Aはconfirm、Atom Bはcancelであることをクライアントへ返す
(17) クライアントは、このCohesionのconfirm指示を送り、Atom Aがcommitされてタクシーとレストランの予約が確定する。

 この例でのAtomとCohesionの構成と処理結果は下図の通りだ。劇場の予約が失敗(=Atom Bの失敗)しても、Cohesionとしては成功し、タクシーとレストランの予約は確定したわけである。どのAtomの成否がCohesionの成否に影響するかはアプリケーション側で自由にコントロールできる。


劇場の予約が失敗しても、Cohesionとしては成功する

 より複雑なトランザクションを表現するために、Atomを入れ子(ネスト)させることも可能だ。なお、ここで紹介した内容はBTPのドラフト仕様に基づいており、正式勧告時では仕様が変わる可能性があるので注意して欲しい。

業務を連携するためのビジネス・プロセスの課題の克服

  ところで、Complex Webサービスの実現に向けたもう1つの課題は、多数のWebサービスをいかに連携させるか、ということだ。Webサービスの可能性の1つは、他社のアプリケーションを利用できることであり、それはすなわち、他社のビジネス・プロセスを自社のビジネス・プロセスに組み込んで利用できることを意味する。これを実現するポイントはWebサービスがコンポーネントであることだ。複数のWebサービスをプラグ・アンド・プレイで柔軟に組み合わすことができれば、新しいサービスを短期間で生み出すことができるし、ビジネス・プロセスを動的に変更することもできる。ビジネス・ロジックのコンポーネント化という点からすれば、既にEJBコンポーネントの流通が始まりつつあるが、より大きな複雑な業務プロセスを考えた場合、より簡単に定義出来、後々の変更が容易な方法が求められるだろう。

 UDDIを使えば、あなたは自分の求めるWebサービスを見つけることができる。しかしながら、見つけたWebサービスは果たしてどうやって組み合わせればよいのか。どういった順番で実行させれば良いのか。あるWebサービスの実行結果によって、次に実行するWebサービスを分岐したいときはどうすれば良いのか。これはいわゆるワークフローの世界だ。Webサービスとなるアプリケーションがアプリケーションサーバ上にある以上、ワークフローエンジンをアプリケーションサーバ上に持ち込むという方法が選択肢の1つとして自然に浮かんでくる。

Webサービスの連携を実現するHP Process Manager interactive

  Webサービスのプラグ・アンド・プレイを実現するためには、Webサービスをプロセスとして考え、プロセスの組み合わせやプロセス間の処理の流れをビジュアルに定義し、その定義に沿って処理を実行していくプロセス管理、ワークフローの仕組みが必要となる。HP Process Manager interactive(以下HP-PMi)はこうしたワークフローの機能を有し、Webサービスの連携とその管理に必要な機能を提供する。HP-PMiでは、ドローツールによって処理の流れを定義できるため、非常に高い柔軟性を保ちながらWebサービス間の連携を定義することができる。少し語弊があるかもしれないが、MVCモデルでのコントローラに相当する処理の制御ロジックをドローツールでビジュアルに定義し、モデルに相当するWebサービスの呼び出しとユーザとの対話であるビューを制御できると言えばイメージが湧きやすいかもしれない。

Webサービスのプラットフォーム「hp netaction」

 真の意味でのサービス連携をインターネットの世界で実現させるためには、そのほかにもセキュリティ、信用・保証などさまざまな問題が存在することは、既に論じられている通りである。

 この連載では、真の意味でダイナミック・サービス連携を実現するためのさまざまな試みを、先進的な技術を実装したHPミドルウェア製品群「hp netaction」を通じて紹介していく。これらの製品群には、今回紹介したHP Web Services Transaction(HP-WST)、HP Process Manager interactive(HP-PMi)のほかに、以下の主要なミドルウェアが含まれる。

  • HP Application Server
    Webサービス実装の基盤となるJ2EEプラットフォーム

  • HP Web Services Platform
    SOAP、UDDI、WSDLなどのWebサービス実現の基盤技術をサポート

 次回以降、個々のミドルウェアについて、詳細なプロダクトレビューを展開する。ご期待いただきたい。第2回は、Webサービスの基盤となるHP Application ServerとHp Web Services Platformについて解説する。

連載 Webサービスを実現するhp netaction
第1回 [総論]
Webサービスの課題とその解決を探る

「Webサービスのためのミドルウェアhp netaction」
(2001/12/19)
  第2回 [プロダクトレビュー]
Simple Webサービス実現のプラットフォーム

「HP Web Services Platform」
(2002/1/22)
  第3回 [プロダクトレビュー]
Webサービスのビジネスロジックを容易に構築

「HP Process Manager interactive」
(2002/2/16)
  第4回 [プロダクトレビュー]
BTPによるトランザクションの実現

「HP Web Services Transaction」
(2002/3/23)
 



HPがアプリケーション・サーバを無償提供、その狙いは?

HP、アプリサーバ市場で勝負へ


.NETとJavaに対応が特徴、HPのECプラットフォーム

[hp world 2001開催]端末、インフラ、e-servicesで巻き返しを図るHP

e-servicesでサービス中心のコンピューティングを実現、HP

HPが初のappサーバを発表、Webサービス市場へ本格進出

Javaの先を見据えるWebアプリサーバベンダー


製品情報INDEX

HP-ASダウンロード

問合せ先


</comment> <tr> <td bgcolor="#EEEEEE"><font size="2"><a href="javascript:KeepIt();"> <img src="/club/keepoint/images/ico_kpt.gif" alt="kee&lt;p&gt;oint保存" border="0" align="absmiddle" width="24" height="18">kee&lt;p&gt;ointで保存</a></font></td> </tr> <comment>

 
@ITトップ@IT Special インデックス会議室利用規約プライバシーポリシーサイトマップ