ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(イベントサービス編)

1.3.4 Pushモデルのデータ管理

  Pushモデルでのイベントデータの管理について説明します。


(1) イベントデータの送受信

  イベントチャネルは、サプライヤからイベントデータを受信します。受信したイベントデータは、イベントチャネル内に蓄積します。次に、接続しているすべてのコンシューマにイベントデータを送信します。送信を完了すると、イベントチャネル上のイベントデータを削除します。
  イベントデータの送信、受信、削除までの処理について以下に示します。イベントチャネルでは、すべてのコンシューマにPushを発行した(4)の後に、イベントチャネル上のイベントデータを削除します。



  1. コンシューマ1およびコンシューマ2がイベントチャネルに接続します。

  2. サプライヤからイベントチャネルにイベントデータを送信します。

  3. イベントチャネルからコンシューマ1にイベントデータを送信します。

  4. イベントチャネルからコンシューマ2にイベントデータを送信します。送信後、イベントチャネルはイベントデータを削除します。


(2) 送信スレッド

  送信スレッドは、イベントチャネルからコンシューマにイベントデータを送信するスレッドです。
  1つの送信スレッドにより4つのコンシューマに送信する場合の例を以下に示します。サプライヤからコンシューマまでのイベントデータの送受信処理について説明します。



  1. サプライヤからイベントチャネルにイベントデータを送信します。イベントチャネルのPush処理部に一時的にイベントデータを蓄積します。

  2. イベントチャネルのPush処理部から送信スレッドにイベントデータを渡します。イベントデータを送信スレッドに渡すと、イベントチャネルは蓄積したイベントデータを削除します。

  3. 送信スレッドは、接続しているコンシューマに対してイベントデータを送信します。


  コンシューマが多数存在する場合は、essetcnfコマンドおよびessetcnfchnlコマンドの送信スレッド数(-sthinitオプションと-sthmaxオプション)を増やすと、イベントデータのコンシューマへの到達時間を均一化できます。

  上図では、送信スレッドが1つであるため、4つのコンシューマに対して送信しています。送信スレッドを2つにした場合の例を以下に示します。4つのコンシューマを2つのブロックに分割し、それぞれのブロックに1つの送信スレッドが対応しています。送信スレッドは並行に動作するため、コンシューマとの間のイベントデータの到達時間の遅延を小さくできます。


  イベントチャネルとコンシューマ間のネットワークのオーバヘッドが均一なものとして、送信スレッドを複数にした場合の処理を以下に説明します。


  1. サプライヤからイベントチャネルにイベントデータを送信します。イベントチャネルのPush処理部に一時的にイベントデータを蓄積します。

  2. イベントチャネルのPush処理部から2つの送信スレッドに順にイベントデータを渡します。接続しているコンシューマをブロック分割し、ブロックに1つの送信スレッドを割り当てます。イベントデータをすべての送信スレッドに渡すと、イベントチャネルは蓄積したイベントデータを削除します。

  3. 送信スレッド1は、割り当てられたブロックのコンシューマ1およびコンシューマ2にイベントデータを送信します。

  4. 送信スレッド2は、割り当てられたブロックのコンシューマ3およびコンシューマ4にイベントデータを送信します。



注意

  • コンシューマがイベントデータを受け取ったことを確認しない場合は“-oneway yes”を、確認する場合は“-oneway no”を指定してください。
    なお、“-oneway no”を指定すると、イベントサービスは送信するすべてのコンシューマがデータを受け取ったことを確認するため、復帰が遅いコンシューマが存在する場合は、Pushモデルの配信処理全体が遅延する可能性があります。

  • コンシューマへのイベントデータ送信時に通信エラーとなった場合、イベントチャネルはそのコンシューマに対して、以後のイベントデータを送信しません。通信エラーとなった場合でもイベントデータを送信したい場合は、“-chksend no”を指定してください(“-oneway no”指定時にだけ有効)。

  • コンシューマ側のアプリケーションでは、アプリケーション終了時に、イベントチャネルに対して必ずdisconnectメソッドを発行してください。イベントチャネルに対してdisconnectメソッドを発行しないでアプリケーションを終了すると、アプリケーション終了後に再度アプリケーションを起動した場合に、同一のイベントデータが複数個配信されてしまいます。