サービス指向プログラミング(SOP)は、統合ビジネスアプリケーションやミッションクリティカルなソフトウェアプログラムを設計および実装するために、コンピュータ作業の単位として「サービス」を使用するプログラミングパラダイムです。サービスはビジネスプロセスのステップを表すことができ、したがって、このパラダイムの主な用途の 1 つは、「内側から外側へ統合」できるスタンドアロンまたは複合ビジネスアプリケーションの費用対効果の高い提供です。本質的にサービス指向アーキテクチャ(SOA)を促進しますが、SOA と同じではありません。SOA は「サービス」を使用してシステム間の通信に焦点を当てていますが、[ 1 ] SOP は、作業単位としてインメモリサービスを使用してアジャイルなアプリケーションモジュールを構築する新しい手法を提供します。
SOP のインメモリ サービスは、Web サービス操作として透過的に外部化できます。言語やプラットフォームに依存しない Web サービス標準のおかげで、SOP は既存のすべてのプログラミング パラダイム、言語、プラットフォームに対応しています。SOP では、プログラムの設計は、明確に定義されたサービス インターフェイスを介したサービス呼び出しのセマンティクス、論理ルーティング、データ フロー記述を中心に展開されます。すべての SOP プログラム モジュールはサービスとしてカプセル化され、サービスは階層的に他のネストされたサービスで構成され、このサービス スタック階層の深さは事実上無制限です。複合サービスには、SOP に固有のプログラミング構造も含まれる場合があります。サービスは、インメモリ プラグイン技術を利用して、独自の API または Web サービス標準を介してアクセスできる外部化されたシステム コンポーネントです。
SOPは、シーケンス、選択、反復といった基本的なプログラミング構造をサポートする一方で、データリスト操作、データ統合、サービスモジュールの自動マルチスレッド処理、宣言的なコンテキスト管理、サービスの同期といった機能に特化した、多数の新しいプログラミング構造を組み込んでいます。SOPの設計により、プログラマはサービスの実行を意味的に同期させてその正しさを保証したり、サービスモジュールをトランザクション境界として宣言し、自動コミット/ロールバック動作を実現したりすることが可能になります。
セマンティック設計ツールとランタイム自動化プラットフォームは、SOPの基本概念をサポートするように構築できます。例えば、サービスオブジェクトを作業単位として自動的に作成し、そのコンテキストを管理するサービス仮想マシン(SVM)は、設計時自動化ツールによってXMLに格納され作成されたSOPプログラムメタデータに基づいて動作するように設計できます。SOAの観点から見ると、SVMはサービスプロデューサーとサービスコンシューマーの両方の役割を果たします。
SOP(標準操作)の概念は、プログラミング統合とアプリケーションロジックに対する意味論的アプローチの強固な基盤を提供する。このアプローチには、次の3つの重要な利点がある。
SOP(標準作業手順書)の主な概念は以下のとおりです。
SOPでは、インメモリソフトウェアモジュールは、明確に定義されたサービスインターフェースによって厳密にカプセル化され、必要に応じてWebサービス操作として外部化できます。この最小限のカプセル化単位により、他のインメモリサービスモジュール内だけでなく、既存のレガシーソフトウェア資産全体での再利用性が最大限に高まります。SOPは、情報隠蔽にサービスインターフェースを使用することで、SOAで使用されるサービス指向設計原則を拡張し、インメモリサービスモジュール間で関心の分離を実現します。
SOPにおけるサービスインターフェースは、明確に定義された入力および出力データ構造を持つ、明確に定義されたソフトウェアタスクを記述するインメモリオブジェクトです。サービスインターフェースはパッケージにグループ化できます。SOPサービスインターフェースはWSDL操作として外部化でき、単一のサービスまたはサービスパッケージをWSDLを使用して記述できます。さらに、サービスインターフェースは、共有プロパティに基づいて1つまたは複数のサービスグループに割り当てることができます。
SOPでは、サービスインターフェイスメタデータに格納されるランタイムプロパティは、サービス仮想マシン(SVM)との契約として機能します。ランタイムプロパティの使用例の1つは、宣言型サービス同期です。サービスインターフェイスは、完全に同期されたインターフェイスとして宣言できます。これは、そのサービスのインスタンスが一度に1つしか実行できないことを意味します。または、実行時のキー入力の実際の値に基づいて同期することもできます。これは、キー入力データに同じ値を持つそのサービスのインスタンスが2つ同時に実行できないことを意味します。さらに、同期は、同じサービスグループに属するサービスインターフェイス間で宣言できます。たとえば、「CreditAccount」と「DebitAccount」という2つのサービスが同じ同期サービスグループに属し、accountName入力フィールドで同期されている場合、同じアカウント名を持つ「CreditAccount」と「DebitAccount」のインスタンスが2つ同時に実行されることはありません。
サービスインボーカはサービス要求を行います。これは、サービスプロデューサーの場所と、コンシューマーとプロデューサーがコンピュータメモリを介して通信する際に使用する通信プロトコルを、 SVMなどのSOPランタイム環境から抽象化する、プラグイン可能なインメモリインターフェースです。プロデューサーは、プロセス内(つまりメモリ内)、同じサーバーマシン上のプロセスの外側、またはネットワーク接続されたサーバーマシンのセットに仮想化することができます。SOPにおけるサービスインボーカの使用は、場所の透過性と仮想化の鍵となります。サービスインボーカ層のもう1つの重要な機能は、マシン間で通信する際の帯域幅とスループットを最適化できることです。たとえば、「SOAPインボーカ」は、Webサービス標準を使用してマシン間でリモート通信を行うためのデフォルトのサービスインボーカです。プロデューサーとコンシューマーが、セキュリティの向上と帯域幅の効率的な使用のために、独自のAPIを介して通信したい場合などには、このインボーカを動的に切り替えることができます。
サービスリスナーはサービス要求を受信します。これは、SVMなどのSOPランタイム環境への受信サービス要求の通信プロトコルを抽象化する、プラグイン可能なインメモリインターフェースです。この抽象化レイヤーを通して、SOPランタイム環境をあらゆる従来のプログラミング環境やアプリケーションサービスのメモリアドレス内に仮想的に埋め込むことができます。
SOPでは、サービスモジュールは複合サービスまたはアトミックサービスとして実装できます。SOPパラダイムで構築されたサービスモジュールは外部指向性を持ち、 SOAPなどの標準規格や独自のプロトコルを通じて透過的に外部化できることに注意することが重要です。
SOPの最も重要な特徴の一つは、プログラミングにおいて完全なセマンティクスベースのアプローチをサポートできることです。さらに、このセマンティクスベースのアプローチは、サービスインターフェースとサービスモジュールの定義を格納するための、完全にメタデータ駆動型のレイヤー上に構築されたビジュアル環境に組み込むことができます。また、SOPランタイムがメタデータレイヤーを解釈できるSVMによってサポートされていれば、自動コード生成の必要性を排除できます。その結果、開発中の生産性が大幅に向上し、テストが容易になり、デプロイメントの俊敏性が大幅に高まります。
複合サービスの実装とは、SOPの手法と概念に基づいたサービスモジュールの意味論的定義のことです。複合サービスのブラックボックス化されたインターフェース定義の内部を見ると、他のサービスインターフェースが相互に接続され、SOPプログラミング構造にも接続されていることがわかります。複合サービスは再帰的な定義を持ち、内部のサービス(「内部サービス」)は、別のアトミックサービスまたは複合サービスである可能性があります。内部サービスは、同じ包含複合サービスへの再帰的な参照である場合もあります。
SOPは、シーケンス処理、選択、反復処理といった基本的なプログラミング構造に加え、高度な組み込み機能もサポートしています。さらに、複合サービスの内部サービス間におけるデータの自動マッピング、変換、操作、フローを実現するセマンティック構造もサポートしています。
複合サービスの定義に含まれるサービス(「内部サービス」)は、他の内部サービスの組み込みの成功ポートまたは失敗ポートと、そのサービス自体の組み込みの起動ポートとの間の意味的な接続性によって、暗黙的に順序付けられます。内部サービスが正常に実行されると、その成功ポートに接続されているすべての内部サービスが次に実行されます。内部サービスが失敗した場合、その失敗ポートに接続されているすべてのサービスが次に実行されます。
論理選択は、データ駆動型の分岐構造やその他の構成可能な構造によって実現されます。一般的に、構成可能な構造とは、SOPプラットフォームに組み込まれたサービスであり、他の接続されたサービスの入出力形式をとれる入力と出力を備えています。例えば、サービスの出力データをフィルタリングするために使用される構成可能な構造は、販売注文、購買注文、またはその他のデータ構造のリストを受け取り、フィルタ構造のインスタンスのインターフェースに格納されているユーザー宣言のフィルタプロパティに基づいてデータをフィルタリングできます。この例では、フィルタリング対象の構造がフィルタ構造の特定のインスタンスの入力となり、フィルタリングされたデータを表す同じ構造が構成可能な構造の出力となります。
複合サービスはループするように宣言できます。ループは、固定回数の反復処理で制限でき、反復処理間にオプションの組み込み遅延を設定できます。また、ループする複合サービス内で「サービス成功終了」または「サービス失敗終了」構文を使用して動的に終了することもできます。さらに、サービスインターフェイスは、自動準備時に 2 つ以上の入力コンポーネントが指定されると、ループまたは「foreach」モードで自動的に実行できます。この動作は、あるサービスからのデータリスト構造が、単一のデータ構造 (つまり、複数形ではない) を入力として受け取るサービスに接続される設計時にサポートされます。複合サービスインターフェイスのランタイムプロパティが並列での「foreach」をサポートするように宣言されている場合、ランタイム自動化環境はループを自動的にマルチスレッド化して並列実行できます。これは、SOP プログラミング構造が組み込みの高度な機能を提供する例です。
データマッピング、変換、および変換構造により、内部サービス間でのデータ転送が自動的に行われます。内部サービスは、アクティブ化され、すべての入力依存関係が解決されると、実行準備が整います。複合サービス内の準備されたすべての内部サービスは、「ハイパーサイクル」と呼ばれる並列バーストで実行されます。これは、SOP で自動並列処理をサポートする手段の 1 つです。複合サービスの定義には、内部サービスの依存関係を示す暗黙的な有向グラフが含まれています。SOP のランタイム環境は、可能な限り内部サービスを自動的にインスタンス化して並列実行することで、この有向グラフに基づいて実行グラフを作成できます。
Javaでは、例外処理は実行時エラーです。SOPにおける例外処理は、内部サービスの失敗ポートを別の内部サービス、またはプログラミング構造に接続することで簡単に実現できます。「失敗して終了」と「成功して終了」構造は、例外処理に使用される構造の例です。サービスの失敗ポートで何も処理が行われない場合、外側(親)サービスは自動的に失敗し、失敗した内部サービスからの標準出力メッセージは自動的に親の標準出力にバブリングアップされます。
複合サービスはトランザクション境界として宣言できます。SOPのランタイム環境は、トランザクション境界として使用される複合サービスオブジェクトに対して、階層的なコンテキストを自動的に作成および管理します。このコンテキストは、複合サービスの実行が成功すると、自動的にコミットまたはロールバックを実行します。
補償サービスと呼ばれる特別な複合サービスは、SOP内の任意のサービスに関連付けることができます。トランザクション境界として宣言された複合サービスが例外処理ルーティングなしで失敗した場合、SOPランタイム環境は、既に正常に実行されたすべての内部サービスに関連付けられた補償サービスを自動的にディスパッチします。
アトミックサービスは、サービスネイティブインターフェイス(SNI)を介してSOPランタイム環境をメモリ上に拡張するものであり、本質的にはプラグインメカニズムです。たとえば、SOPがSVMによって自動化されている場合、関連するサービスが使用されると、サービスプラグインがSVMに動的にロードされます。サービスプラグインの例としては、メモリ内のサービス入力データをオンザフライでWebサービスSOAPリクエストに変換し、サービスプロデューサーに送信し、対応するSOAPレスポンスをサービス上のメモリ内出力データに変換できるSOAPコミュニケータープラグインが挙げられます。サービスプラグインのもう1つの例は、データアクセス、変更、クエリ操作をサポートする標準データベースSQLプラグインです。アトミックサービスとサービスプラグインの根本的な重要性を確立するのに役立つもう1つの例は、サービスインボーカーをサービスプラグインとして使用して、SOPプラットフォームの異なるインスタンス間でサービスを透過的に仮想化することです。この独自のコンポーネントレベルの仮想化は、従来のアプリケーションレベルまたはプロセスレベルの仮想化と区別するために、「サービスグリッド仮想化」と呼ばれます。
SOPは、SOP技術を用いて構築されたすべてのアプリケーションにおける横断的な課題をサポートする上で、重要な機会を提供します。以下のセクションでは、これらの機会の一部について説明します。
SOPランタイム環境は、すべてのサービスに対して、リアルタイムで組み込みかつ最適化されたプロファイリング、ログ記録、および計測機能を体系的に提供できます。
サービスインスタンスの宣言されたキー入力値に基づいて、特定の複合サービスのコンテキストで実行されている場合、時間制約のない内部サービスの出力はSOPランタイム環境によってキャッシュされます。サービスが特定のキー入力値に対してキャッシュされている場合、SOPランタイム環境はサービスを使用する代わりに、キー入力に対応するキャッシュされた出力をサービスキャッシュから取得します。この組み込みメカニズムをSOPアプリケーション開発者が利用できることで、バックエンドシステムの負荷を大幅に軽減できます。
SOPは、特殊な複合サービスであるトリガーサービスを他のサービスに関連付けるメカニズムを提供します。このサービスが利用されると、SOPプラットフォームは、関連付けられたトリガーサービスのインスタンスを自動的に作成し、トリガーサービスの入力のメモリ内コピーを使用して利用します。この利用は、トリガーサービスの実行に影響を与えません。サービストリガーは、トリガーサービスの起動時、失敗時、または正常完了時に実行されるように宣言できます。
任意のサービスを呼び出す機能に加え、サービス要求イベントと共有メモリは、サービス間通信のためにSOPに組み込まれている2つのメカニズムです。SOPでは、サービスの利用はイベントとして扱われます。SOPは相関ベースのイベントメカニズムを提供し、指定された入力データ値を持つ1つ以上の他のサービス利用イベントが発生するのを「待機」構造で待機する必要があると宣言した実行中の複合サービスをプリエンプションします。複合サービスの実行は、待機構造に関連付けられた特定の相関キー入力でサービスが利用されると継続されます。SOPはまた、サービスがサービスの入出力構造に類似した明確に定義されたデータ構造にアクセスして更新できる、アクセス制御付きの共有メモリ空間も提供します。SOP内の共有メモリメカニズムは、サービスインターフェースを介してプログラムからアクセスできます。
SOPでは、カスタマイズは「サービスオーバーライド」と呼ばれる革新的な機能によって管理されます。この機能により、サービス実装は実行時に、複数の可能な実装のいずれかによって静的または動的にオーバーライドできます。この機能は、オブジェクト指向プログラミングにおけるポリモーフィズムに類似しています。各オーバーライド実装は、1つ以上のオーバーライド構成ポートフォリオに関連付けることができ、デプロイ時に、さまざまなSOPアプリケーションインストール全体で関連するオーバーライドのグループの有効化を管理できます。
選択されたサービスは、プレゼンテーション(GUI )レイヤーやその他のアプリケーションによる外部からのプログラムによる利用のために、安全にデプロイできます。サービスアカウントが定義されると、SOPランタイム環境はコンシューマーアカウントのプロビジョニングメカニズムを通じてアクセスを自動的に管理します。
SOPランタイム環境は、組み込みの認証とサービス認可を体系的に提供できます。認可の目的で、SOP開発プロジェクト、コンシューマーアカウント、パッケージ、およびサービスは、アクセス制御を備えたリソースとして扱われます。このようにして、SOPランタイム環境は組み込みの認可を提供できます。標準または独自の認可と通信セキュリティは、サービスオーバーライド、プラグインインボーカ、およびサービスリスナーモジュールを通じてカスタマイズされます。
SOPのすべての成果物は適切にカプセル化されたサービスであり、共有メモリなどのすべてのSOPメカニズムは分散サービスとして提供できるため、SOPランタイム環境によって大規模な仮想化を自動化できます。また、各レベルにおいて、内部サービスに関連付けられた複数の実行グラフを持つ複合サービスの階層的なサービススタックは、SOPランタイム環境における自動マルチスレッド処理に大きな可能性をもたらします。
サービス指向プログラミングという用語は、2002年にアルベルト・シリッティ、トゥリオ・ヴェルナッツァ、ジャンカルロ・スッチによって「ソフトウェア再利用:方法、技術、ツール」という書籍の中で初めて発表されました。上記で説明したSOPは、シリッティ、ヴェルナッツァ、スッチが提案した用語の使用法のいくつかの側面を反映しています。
現在、SOP(標準作業手順)の概念は主流化の初期段階にある。この普及を促進する市場要因は4つある。