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