Socketアダプターの通信方式について説明します。
参考
Socketアダプターを使用する場合は、以下に示すパフォーマンス上の利点によりSOAP/HTTPアダプターに比べて高スループットを実現できます。
イベント送信アプリケーションは、CEPサーバ(入力アダプター)に接続した状態で複数のイベントデータを送信できます。TCP/IPのコネクションの確立および切断に伴うオーバーヘッドを解消できるため、スループットが向上します。
イベント送信アプリケーションは、CEPサーバ(入力アダプター)からの受信メッセージを待つことなく、イベントデータを連続して送信できます。CEPサーバからのレスポンス待ちに伴うタイムラグを解消できるため、スループットが向上します。
(入力アダプターでロギング機能を使用しない場合のみ)
Socketアダプターのエンドポイントは、CEPサーバのIPアドレスとSocketアダプターポート(任意のTCPポート)の組合せとなります。
Socketアダプターを利用する場合は、エンジン構成ファイルのSocketアダプターポートにイベントデータの待ち受けポートを指定する必要があります。
参照
Socketアダプターポートの指定方法については、「ユーザーズガイド」の「9.1.1 エンジン構成ファイル」を参照してください。
Socketアダプターに送信するメッセージについて説明します。
図3.1 送信メッセージのフォーマット
データフィールド | サイズ | 指定値 |
---|---|---|
イベントヘッダー | 4バイト | イベントデータフィールドのデータサイズを指定します。(単位:バイト) また、0を指定することで送信完了通知(イベント送信が完了したことを示す)をSocketアダプターに通知します。 指定可能範囲は0~33,000,000です。 |
イベントデータ | 可変サイズ | イベントデータ(後述)を格納します。 イベントヘッダーフィールドが0(送信完了通知)以外の場合に、本フィールドを指定します。 |
図3.2 イベントデータフィールドのフォーマット
データフィールド | サイズ | 指定値 | |
---|---|---|---|
イベントデータ形式 | 3バイト | “CSV”または“XML”(文字列)を指定します。 小文字での指定(“csv”または“xml”)も可能です。 | |
イベントタイプID | サイズ | 4バイト | イベントタイプIDの文字列長を指定します。(単位:バイト) |
データ | 可変サイズ | イベントタイプIDのテキストデータを指定します。 | |
文字セット | サイズ | 4バイト | 文字セットの文字列長を指定します。(単位:バイト) イベントデータの文字エンコーディングがUTF-8の場合、0を指定します。 |
データ | 可変サイズ | 文字セットのテキストデータを指定します。 UTF-8の場合、本フィールドは省略します。 | |
イベントデータ本体 | サイズ | 4バイト | イベントデータ本体のサイズを指定します。(単位:バイト) |
データ | 可変サイズ | イベントデータのテキストデータを指定します。 |
例
次の場合に送信メッセージのバイト配列は以下のようになります。
イベントデータ形式:CSV形式
イベントタイプID:EVENTTYPE_01
文字セット:シフトJIS
また、送信完了通知のバイト配列は以下のとおりです。
Socketアダプターから通知されるメッセージについて説明します。
図3.3 応答メッセージのフォーマット
データフィールド | サイズ | 指定値 |
---|---|---|
レスポンスコード | 4バイト | 入力アダプターの処理結果を示す4桁の文字列が格納されます。 |
<区切り> | 1バイト | 前後のフィールドの区切り文字として、コロン(:)(0x3A)が格納されます。 |
送信成功件数 | 可変サイズ (0~19バイト) | 入力アダプターにおけるイベントデータの処理成功件数が格納されます。(上限:LONG_MAX) 本フィールドは、10進数の文字列として通知されます。例えば、0件の場合は「0」(0x30)を表す1バイト、最大では2の63乗-1を表す19バイトのデータが格納されます。 |
<区切り> | 1バイト | 前後のフィールドの区切り文字として、コロン(:)(0x3A)が格納されます。 |
エラーメッセージ | 可変サイズ | エラーメッセージの文字列が格納されます。 |
<終端> | 1バイト | エラーメッセージの終端文字として、改行(LF)(0x0A)が格納されます。 |
ポイント
異常時にはシステムログおよびエンジンログにメッセージを出力します。異常時のエラー処理については、「3.4 エラー処理」を参照してください。
処理結果に応じたレスポンスコードおよび各種メッセージは以下のとおりです。
処理結果 | レスポンスコードおよびメッセージ(*1) |
---|---|
正常終了 | 0000 |
Sending message completed normally. | |
なし | |
フォーマット異常 イベントデータのフォーマットのサイズが33,000,000バイトを超過 | M001 |
Bad Message data size [イベントデータのフォーマットのサイズ]. | |
cep10308e: Message Data Size is over. EngineId=CEPエンジン名, Size=イベントデータのフォーマットのサイズ | |
設定内容の不一致 不明なイベントタイプID | M002 |
Unknown event type id [イベントタイプ]. | |
cep10108e: Event type is not found. EngineId=CEPエンジン名, eventType=イベントタイプID | |
フォーマット異常 イベントデータ形式にCSVまたはXML以外が指定されている | M003 |
Unknown event format [イベントの形式]. | |
cep10114e: Unknown Event format. EngineId=CEPエンジン名, format=イベントの形式 | |
フォーマット異常 送信メッセージのフォーマット誤り | M004 |
Data format is Abnormal. | |
cep10303e: Event data cannot read. Event is aborted. EngineId=CEPエンジン名,ClientIP=イベント送信元IPアドレス | |
フォーマット異常 不明な文字セット | M005 |
Charset is Abnormal [文字セット名称]. | |
cep10304e: Charset Name is abnormal. EngineId=CEPエンジン名,CharsetName=文字セット名称 | |
処理結果異常 イベントデータのデコードでエラー発生 | M006 |
Decoding event data failed. | |
cep10309e: Decoding event data failed. EngineId=CEPエンジン名 | |
設定内容の不一致 イベントデータ形式が配備されているイベントタイプ定義と異なる | M007 |
It differs from the registered format [イベントの形式]. | |
cep10116e: It differs from the registered format. EngineId=CEPエンジン名, format=イベントの形式 | |
フォーマット異常 イベントデータサイズが32,000,000バイトを超過 | M008 |
Bad Event data size [イベントデータサイズ]. | |
cep10310e: Event Data Size is over. EngineId=CEPエンジン名, Size=イベントデータサイズ | |
CEPサーバ未起動 | S001 |
Server is not Running. | |
cep10300w: FrontServer is not running. Event is aborted. EngineId=CEPエンジン名 | |
ビジー状態 CEPサーバが一時的または恒久的に過負荷状態 | S002 |
Server is busy now. | |
cep10301w: FrontServer is busy. Event is aborted. EngineId=CEPエンジン名 または、 cep10302e: FrontServer is continuously busy. Event is aborted. EngineId=CEPエンジン名 | |
処理結果異常 ログ出力処理が失敗 | S003 |
Logging failed. | |
cep10401e: The Log was not able to be output. EngineId=CEPエンジン名, EVENT=受信イベント, ERRORINFO=内部情報 注:受信イベント中の改行はに変換されて出力されます。システムログに出力可能な長さを超えるイベントの場合、システムログにはイベントの途中まで出力されます。 |
(*1) 各段に記載している内容は以下のとおりです。
上段:レスポンスコード
中段:エラーメッセージ(可変情報は斜体で示しています)
下段:システムログおよびエンジンログの出力メッセージ(可変情報は斜体で示しています)
例
10件のイベントデータを送信した後に送信完了通知を送信した場合、メッセージ送信正常終了時の受信メッセージのバイト配列は以下のようになります。
Socketアダプターを使用する場合のSocket通信(TCP/IP)を使用した接続から切断までの処理手順について説明します。
イベント送信アプリケーションは、以下に示す手順(処理フロー)に従って通信を行います。
処理手順:
CEPサーバのSocketアダプターに接続します。(コネクション確立)
イベントデータを送信します。(メッセージ送信)
(必要に応じて)次のイベントデータを送信します。(→2.の繰り返し)
送信完了通知を送信します。
CEPサーバからの応答メッセージを受信します。(メッセージ受信)
(必要に応じて)次のイベントデータを送信します。(→2.に戻る)
イベントデータの送信がすべて完了した場合、接続を閉じます。(コネクション切断)
参照
コネクション確立時における接続先の入力アダプターのエンドポイントについては、「3.3.3.1 エンドポイント」を参照してください。
メッセージ送信および送信完了通知については、「3.3.3.2 送信メッセージ」を参照してください。
メッセージ受信については、「3.3.3.3 応答メッセージ」を参照してください。
Socketアダプターを使用する上での留意点について説明します。
メッセージを連続して送信する場合
Socketアダプターで異常を検出した場合、送信完了通知を受信する前に応答メッセージを通知し、コネクションを閉じます。
この場合、イベント送信アプリケーションではメッセージ送信を継続できなくなる(データ送信がエラーとなる)ため、イベント送信アプリケーションはメッセージ送信を中断し、Socketアダプターからの応答メッセージを受信してください。
サイズ情報より小さいサイズのメッセージを送信した場合
サイズ情報に設定したデータサイズより小さいサイズのイベントデータを送信した場合、CEPサーバはサイズ分のデータ受信を待ち合わせるため、サイズ分のデータを送信するまで応答メッセージが通知されません。
イベント送信アプリケーションでは、サイズ情報とイベントデータのサイズを必ず一致させるようにしてください。
同時接続数について
Socketアダプターの最大同時接続数に上限はありません。OSのファイルディスクリプタ数の上限に達するまで接続可能です。
ただし、リソースの有効活用のため、イベント送信アプリケーションで送信を継続しない場合は、必ず接続を閉じてください。
ポイント
Socketアダプターで異常を検出しない限り、CEPサーバ側から接続を閉じることはありません。
入力アダプターでロギング機能を使用する場合
Socketアダプターは送信完了通知を契機にログ出力を行います。
そのため、イベント送信アプリケーションは、以下のように1メッセージ毎に送信完了通知を送信し、応答メッセージを受信してください。
1メッセージ毎に送信、応答メッセージの受信を行わない場合、応答メッセージの送信成功件数が正しく返却されない可能性があります。
パフォーマンスに関する考慮
TCP/IP通信で小さなパケットを連続して送信する場合、受信側からのACKを受け取るまで送信メッセージをためておいて送信しようとするNagleアルゴリズムと、ACKをまとめて返信しようとするTCP遅延ACKとの両方の働きによって、通信のパフォーマンスが劣化することがあります。
イベント送信アプリケーションにおいては、小さなパケットが連続して送信されることを防ぐために、プログラミング言語のバッファー付きストリーム(Javaではjava.io.BufferedOutputStreamなど)を使用するようにしてください。
また、1メッセージ毎に送信完了通知を送信し、応答メッセージを受信する場合には、バッファー付きストリームを使用しても同じ原因で通信のパフォーマンスが劣化することがあります。そのような場合には、イベント送信アプリケーションにおいてNagleアルゴリズムを無効にするTCP_NODELAYオプションを設定することを検討してください。Javaではjava.net.SocketクラスのsetTcpNoDelayメソッドで設定可能です。