Pushモデルでのイベントデータの管理について説明します。
(1) イベントデータの送受信
イベントチャネルは、サプライヤからイベントデータを受信します。受信したイベントデータは、イベントチャネル内に蓄積します。次に、接続しているすべてのコンシューマにイベントデータを送信します。送信を完了すると、イベントチャネル上のイベントデータを削除します。
イベントデータの送信、受信、削除までの処理について以下に示します。イベントチャネルでは、すべてのコンシューマにPushを発行した(4)の後に、イベントチャネル上のイベントデータを削除します。
コンシューマ1およびコンシューマ2がイベントチャネルに接続します。
サプライヤからイベントチャネルにイベントデータを送信します。
イベントチャネルからコンシューマ1にイベントデータを送信します。
イベントチャネルからコンシューマ2にイベントデータを送信します。送信後、イベントチャネルはイベントデータを削除します。
(2) 送信スレッド
送信スレッドは、イベントチャネルからコンシューマにイベントデータを送信するスレッドです。
1つの送信スレッドにより4つのコンシューマに送信する場合の例を以下に示します。サプライヤからコンシューマまでのイベントデータの送受信処理について説明します。
サプライヤからイベントチャネルにイベントデータを送信します。イベントチャネルのPush処理部に一時的にイベントデータを蓄積します。
イベントチャネルのPush処理部から送信スレッドにイベントデータを渡します。イベントデータを送信スレッドに渡すと、イベントチャネルは蓄積したイベントデータを削除します。
送信スレッドは、接続しているコンシューマに対してイベントデータを送信します。
コンシューマが多数存在する場合は、essetcnfコマンドおよびessetcnfchnlコマンドの送信スレッド数(-sthinitオプションと-sthmaxオプション)を増やすと、イベントデータのコンシューマへの到達時間を均一化できます。
上図では、送信スレッドが1つであるため、4つのコンシューマに対して送信しています。送信スレッドを2つにした場合の例を以下に示します。4つのコンシューマを2つのブロックに分割し、それぞれのブロックに1つの送信スレッドが対応しています。送信スレッドは並行に動作するため、コンシューマとの間のイベントデータの到達時間の遅延を小さくできます。
イベントチャネルとコンシューマ間のネットワークのオーバヘッドが均一なものとして、送信スレッドを複数にした場合の処理を以下に説明します。
サプライヤからイベントチャネルにイベントデータを送信します。イベントチャネルのPush処理部に一時的にイベントデータを蓄積します。
イベントチャネルのPush処理部から2つの送信スレッドに順にイベントデータを渡します。接続しているコンシューマをブロック分割し、ブロックに1つの送信スレッドを割り当てます。イベントデータをすべての送信スレッドに渡すと、イベントチャネルは蓄積したイベントデータを削除します。
送信スレッド1は、割り当てられたブロックのコンシューマ1およびコンシューマ2にイベントデータを送信します。
送信スレッド2は、割り当てられたブロックのコンシューマ3およびコンシューマ4にイベントデータを送信します。
注意
コンシューマがイベントデータを受け取ったことを確認しない場合は“-oneway yes”を、確認する場合は“-oneway no”を指定してください。
なお、“-oneway no”を指定すると、イベントサービスは送信するすべてのコンシューマがデータを受け取ったことを確認するため、復帰が遅いコンシューマが存在する場合は、Pushモデルの配信処理全体が遅延する可能性があります。
コンシューマへのイベントデータ送信時に通信エラーとなった場合、イベントチャネルはそのコンシューマに対して、以後のイベントデータを送信しません。通信エラーとなった場合でもイベントデータを送信したい場合は、“-chksend no”を指定してください(“-oneway no”指定時にだけ有効)。
コンシューマ側のアプリケーションでは、アプリケーション終了時に、イベントチャネルに対して必ずdisconnectメソッドを発行してください。イベントチャネルに対してdisconnectメソッドを発行しないでアプリケーションを終了すると、アプリケーション終了後に再度アプリケーションを起動した場合に、同一のイベントデータが複数個配信されてしまいます。