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