2.2. サービスアセンブリの設計

2.2.1. Normalized Message Router(NMR)のアドレッシング

2.2.1.1. エンドポイントの命名

SU エディタでは、全てのコンシューマのエンドポイント、プロバイダのエンドポイントに以下の情報を設定します。

項目説明
エンドポイント名サービスを提供するエンドポイントの名前です。
サービス名サービス名により指定されたサービスを、このエンドポイントが提供していることを示します。
インタフェース名エンドポイントが提供するサービスが、インタフェース名により指定されたインタフェース実装していることを示します。

NMR はエンドポイント名、サービス名、インタフェース名を基に受け取ったメッセージをどのエンドポイントに配送するかを決定します。 これらの情報(エンドポイント名、サービス名、インタフェース名)は、それぞれコンシューマとプロバイダによって意味合いが異なっており、それぞれ以下の役割を持ちます。


図2.2.1.1-1

2.2.1.2. エンドポイントの一意性

エンドポイントに命名は以下の2つの一意性を持たなくてはなりません。
一意性が保たれず、エンドポイントに重複が発生した場合、開発時や運用操作時にエラーとなります。
エンドポイントが満たすべき一意性は以下の通りです。

2.2.1.3. ルーティング規則

NMR の機能により宛先が完全に一致したエンドポイントだけに配送するだけでなく、サービス名・インタフェース名から柔軟に宛先を決定してメッセージを配送することができます。

NMR では以下のルールに基づいてコンシューマから受け取ったメッセージの宛先から、配送先のプロバイダを決定しています。

2.2.2. プロバイダ・エンドポイントのクラスタ化(グルーピング)

2.2.2.1. グルーピング

SAエディタでは、以下のグルーピング情報を設定します。

項目説明
グループIDクラスタ化するプロバイダエンドポイントと、そのコンシューマエンドポイントを関連づけるために、エンドポイントが含まれるサービスアセンブリに対して一意のグループIDを指定します。
ロードバランシング方式クラスタ化されたプロバイダエンドポイントに対して、メッセージをどの宛先に配送するかについて、その方式(ラウンドロビン/固定シーケンス)を指定します。
重み付け/順序ラウンドロビンの場合、各宛先への配送割合を意味する重み付けを指定します。
例えば、A、B、Cの3つのサービスアセンブリに3、2、1と指定すると、それぞれA:1/2、B:1/3、C:1/6の割合で配送されます。同じ値を指定すると、すべて1/3の同じ割合で配送されます。
固定シーケンスの場合、各宛先への配送優先度を意味する順序を指定します。
例えば、A、B、Cの3つのサービスアセンブリに1、2、3と指定すると、常に1に配送され、1が有効でない場合には2に、さらに2も有効でない場合には3に配送されます。
エラー自動閉塞の開始閾値エラー自動閉塞を開始する閾値として、エラー発生回数(回)を指定します。

0

自動閉塞しません。

1

1回エラーが発生した時点で自動閉塞します。(既定値)

n

指定回数分エラーが発生した時点で自動閉塞します。

エラー自動閉塞のリセット閾値エラー自動閉塞をリセットする閾値として、エラー発生率(%)を指定します。

0

リセットします。(既定値)

1〜99

起動後もしくはリセット後の最初のエラーが発生した時点から制御を開始(開始時点の発生率は100%)し、指定値を下回った時点で累積値をリセットします。

100

起動後もしくはリセット後の最初のエラーが発生した時点から制御を開始し、エラーが連続発生しなかった時点で累積値をリセットします。

グループの中では、同じサービス名とインタフェース名が定義されたエンドポイント群を1つのセットとして扱います。
コンシューマとプロバイダ間のルーティングは、 [2.2.1. Normalized Message Router(NMR)のアドレッシング > 2.2.1.3. ルーティング規則 ] に準じています。
従って、コンシューマで定義されたエンドポイント名に一致するクラスタエンドポイント名が存在しない場合、サービス名かインタフェース名が一致するものから選択されることになります。グルーピングしたもの以外に同じサービス名やインタフェース名が存在すると、意図しないエンドポイントに配送される場合があります。

2.2.2.2. クラスタエンドポイントの定義例

次のようなクラスタ構成をとる3つのノードに連携させる場合の定義手順の例を示します。

C---P1 【ノード1】 重み付け:1
  ---P2 【ノード2】 重み付け:1
 ・・・
  ---Pn 【ノードn】 重み付け:1

 ※C…コンシューマエンドポイント
 ※P…プロバイダエンドポイント

  1. サービスアセンブリ1を生成し、コンシューマエンドポイントCとプロバイダエンドポイントP1を次のように定義します。
    グルーピング定義:
    項目
    グループIDGRP1
    ロードバランシング方式ラウンドロビン
    重み付け/順序1
    インタフェース名IF1

    Cのエンドポイント定義:
    項目
    エンドポイント名EP1
    ロールコンシューマ
    サービス名SVC1
    インタフェース名IF1

    P1のエンドポイント定義:
    項目
    エンドポイント名EP1
    ロールプロバイダ
    サービス名SVC1
    インタフェース名IF1
    接続先ノード1に対する接続情報

  2. サービスアセンブリ1のプロジェクトをコピーしてサービスアセンブリ2を生成し、プロバイダエンドポイントP2のエンドポイント名と接続先の定義を変更します。
    グルーピング定義:
    項目
    グループIDGRP1
    ロードバランシング方式ラウンドロビン
    重み付け/順序1
    インタフェース名IF1

    Cのエンドポイント定義:
    項目
    エンドポイント名EP1
    ロールコンシューマ
    サービス名SVC1
    インタフェース名IF1

    P2のエンドポイント定義:
    項目
    エンドポイント名EP2
    ロールプロバイダ
    サービス名SVC1
    インタフェース名IF1
    接続先ノード2に対する接続情報

    (これをノード数分繰り返して、サービスアセンブリを生成していきます。)

2.2.3. エラー通知

プロバイダエンドポイントをエラー通知先として定義しておくと、コンシューマがプロバイダからのエラーを受けた際にメッセージをエラー通知先に転送することができます。

トランザクションをサポートする場合、エラー通知は行われません。
エラーリトライが有効な場合、リトライ回数を超過するまでエラー通知は行われません。

通常のプロバイダエンドポイントとエラー通知先との違いはエンドポイント名だけです。
エラー通知先のエンドポイント名は、エラー通知元となるコンシューマのエンドポイント名にあらかじめ定義されている予約語を末尾に付加したものになります。定義方法については、 [2.5.6. エラー通知先の指定] をご覧ください。

2.2.4. 文字エンコーディング

バインディングコンポーネントおよびサービスエンジンは、NMRとノーマライズメッセージの形式で送受信を行いますが、 ノーマライズメッセージの文字エンコーディングには次の原則があります。

以下の節では、ESBと外部環境との入力方向/出力方向における文字エンコードの扱いについて述べます。

2.2.4.1. 外部環境からの入力方向

バインディングコンポーネントは、使用する通信プロトコルに依存したメッセージ電文からNMRに送信するメッセージを取り出し、メッセージをUTF-8の文字エンコーディングでNMRに送信します。
入力文字エンコーディングの設定のあるバインディングコンポーネント(File BC/FTP BC/HTTP BC/HL7 BC)は、メッセージを指定した文字エンコーディングからUTF-8に変換してNMRに送信します。

2.2.4.2. 外部環境への出力方向

バインディングコンポーネントは、NMRから受け取ったメッセージを取り出し、通信プロトコルに依存したメッセージに変換して出力します。この時の文字エンコーディングは通信プロトコルに依存します。
出力文字エンコーディングの設定のあるバインディングコンポーネント(File BC/FTP BC/HTTP BC/HL7 BC)は、文字エンコーディングを変換して出力します。