メッセージ配布の制限
ピア チャネルは仕様上はブロードキャスト メッシュです。その基本的な大量転送モデルでは、メッシュの任意のメンバが送信した各メッセージをそのメッシュの他のメンバ全員に配布します。これは、1 人のメンバが生成した各メッセージが他のメンバ全員に関係していて、役立つものであるような状況 (チャット ルームなど) に最適です。ただし、多くのアプリケーションではメッセージの配布を制限する必要が生じることがあります。たとえば、新しいメンバがメッシュに参加し、メッシュを経由して送信された最新のメッセージを取得しようとする場合、この要求をメッシュのメンバ全員に転送する必要はありません。要求は近くの近隣ノードに制限できます。また、ローカルで生成されたメッセージをフィルタで除外することもできます。メッセージはメッシュの個別のノードに送信することもできます。このトピックでは、ホップ数、メッセージ伝達フィルタ、ローカル フィルタ、または直接接続を使用し、メッシュを経由してメッセージを転送する方法について説明し、1 つの方法を選択するための一般的なガイドラインを示します。
ホップ数
PeerHopCount の概念は、IP プロトコルで使用される TTL (Time-To-Live) に似ています。PeerHopCount の値はメッセージのインスタンスに関連付けられ、メッセージを破棄するまでの転送回数を指定します。ピア チャネル クライアントがメッセージを受信するたびに、クライアントはメッセージに PeerHopCount が指定されているかどうかを確認します。指定されている場合、クライアントはメッセージを近隣ノードに転送する前に、ホップ数の値を 1 つデクリメントします。クライアントがゼロのホップ数値を持つメッセージを受信した場合、そのメッセージは処理されますが、近隣ノードには転送されません。
ホップ数をメッセージに追加するには、メッセージ クラスの実装で、適切なプロパティまたはフィールドに PeerHopCount を属性として追加します。この値は、メッセージをメッシュに送信する前に特定の値に設定できます。このように、ホップ数を使用するとメッシュを経由したメッセージの配布を必要に応じて制限し、不要なメッセージの重複を避けることができます。これは、メッシュに大量の重複データが含まれている場合や、メッセージをすぐ隣の近隣ノードまたはいくつかのホップ内の近隣ノードに送信する場合に役立ちます。
- コード スニペットと関連情報については、Peer Channel Team Blog (https://go.microsoft.com/fwlink/?LinkID=114531) を参照してください。
メッセージ伝達フィルタ
MessagePropagationFilter は、特にメッセージの内容や他の特定のシナリオによってメッセージを伝達するかどうかを決定する場合など、メッセージの大量転送の制御をカスタマイズするために使用できます。このフィルタにより、ノードを通過する各メッセージを伝達するかどうかが決定されます。これは、メッシュ内の他の場所から送信され、使用しているノードで受信したメッセージと、使用しているアプリケーションで作成したメッセージの両方に適用されます。フィルタはメッセージとその発信元の両方にアクセスできるため、利用できるすべての情報に基づいてメッセージを転送するか、破棄するかを決定します。
PeerMessagePropagationFilter は、単一の関数 ShouldMessagePropagate を持つ抽象基本クラスです。メソッド呼び出しの最初の引数には、メッセージの完全なコピーを渡します。このメッセージに対して行われた変更が実際のメッセージに影響することはありません。このメソッド呼び出しの最後の引数は、メッセージの送信元 (PeerMessageOrigination.Local または PeerMessageOrigination.Remote) を識別します。このメソッドの具体的な実装は、メッセージの転送先 (ローカル アプリケーション (Local)、リモート クライアント (Remote)、ローカル アプリケーションとリモート クライアントの両方 (LocalAndRemote)、どちらにも転送しない (None)) を示す PeerMessagePropagation 列挙体から定数を返す必要があります。このフィルタは、対応する PeerNode オブジェクトにアクセスし、PeerNode.MessagePropagationFilter プロパティで伝達フィルタ派生クラスのインスタンスを指定することによって適用できます。ピア チャネルを開く前に、伝達フィルタがアタッチされていることを確認してください。
- コード スニペットと関連情報については、Peer Channel Team Blog (https://go.microsoft.com/fwlink/?LinkID=114532) を参照してください。
メッシュ内の個別ノードへのアクセス
メッシュ内の個別のノードには、ローカル フィルタを設定するか、直接接続を設定することでアクセスできます。
メッシュ内の各ノードに個別の ID が割り当てられている場合は、メッセージの実装に宛先 ID を指定できます。ローカル フィルタを設定するには、指定した宛先 ID にノードの ID が一致する場合にのみメッセージを現在のノードに表示する関数をメッセージ コントラクト内に作成します。メッセージはメッシュが転送するため、新しい接続を設定するオーバーヘッドが発生しません。ただし、メッセージはメッシュを経由して何度も送信されるため、効率が低下します。この方法は、メッセージのサイズが大きくなく、メッセージを頻繁に送信しない限り、メッシュの個別のメンバにメッセージを送信する場合に適しています。
帯域幅の広い長時間の接続には、直接接続が適しています。接続情報はメッシュを経由して送信でき、その後、メッセージを送受信するために選択した直接接続を設定できます。
メッセージ配布の制限方法の選択
メッセージの配布を制限する必要があるシナリオに遭遇した場合は、次の点を検討してください。
- 誰がメッセージを受信する必要があるか。1 つの近隣ノードのみか。メッシュ内の別の場所にあるノードか。メッシュ内の半分のノードか。
- どのような頻度でこのメッセージを送信する必要があるか。
- どのような帯域幅をこのメッセージは使用するか。
これらの質問の回答は、ホップ数、メッセージ伝達フィルタ、ローカル フィルタ、直接接続のいずれを使用するかを決定するのに役立ちます。次の一般的なガイドラインを考慮してください。
- 誰
- 個別のノード **: ローカル フィルタまたは直接接続
- 特定の領域内の近隣ノード **: PeerHopCount
- メッシュの複雑なサブセット **: MessagePropagationFilter
- 頻度
- 頻繁 **: 直接接続、PeerHopCount、MessagePropagationFilter
- 時折 **: ローカル フィルタ
- 帯域幅の使用
- 広い **: 直接接続。MessagePropagationFilter またはローカル フィルタの使用は奨励できない
- 狭い **: 任意。直接接続は通常は不要