對等通道本質上是一種廣播網狀結構。 其基本泛洪模型牽涉到將網狀結構的任何成員所傳送的每個訊息散發給該網格的所有其他成員。 在成員產生的每則訊息都與所有其他成員相關且實用的情況下,這是理想的情況(例如聊天室)。 不過,許多應用程式偶爾需要限制訊息散發。 例如,如果新成員加入網格,而且想要擷取透過網格傳送的最後一則訊息,則不需要將此要求廣播給網格的每個成員。 要求可以限制在鄰近的節點,或是篩選掉本地產生的訊息。訊息也可以傳送至網狀網路上的個別節點。 本主題討論如何使用躍點計數、訊息傳播篩選器、本機篩選或直接連線來控制整個網格轉送訊息的方式,並提供選擇方法的一般指導方針。
跳步計數
的概念 PeerHopCount 類似於IP通訊協定中使用的TTL(時間To-Live)。 的值 PeerHopCount 會系結至訊息實例,並指定訊息在卸載之前應該轉送多少次。 每次 Peer Channel 客戶端收到訊息時,客戶端都會檢查該訊息,看看是否已指定 PeerHopCount。 如果已指定,則用戶端會將躍點計數值遞減一,再將訊息轉送至鄰近節點。 當用戶端收到躍點計數值為零的訊息時,客戶端會處理訊息,但不會將訊息轉送給鄰居。
躍點計數可以透過在訊息類別實現中將 PeerHopCount 作為屬性新增至相關的屬性或欄位來新增至訊息。 您可以將此值設定為特定值,再將訊息傳送至網格。 如此一來,您就可以使用躍點計數,在必要時限制整個網格的訊息分佈,並可能避免不必要的訊息重複。 當網格包含大量冗余資料時,或者需要傳送訊息給立即鄰居或幾個跳距內的鄰居,這將非常有用。
- 如需代碼段和相關資訊,請參閱 Peer Channel 部落格中的 PeerHopCount 屬性:控制訊息傳播 文章。
訊息傳播篩選器
MessagePropagationFilter 可用於自定義訊息泛濫控制,特別是當訊息的內容或其他特定案例決定傳播時。 篩選會針對通過節點的每個訊息做出傳播決策。 這適用於源自您節點已接收之網狀結構中其他地方的訊息,以及應用程式所建立的訊息。 過濾器可以存取訊息及其來源,因此有關轉送或丟棄訊息的決策可以根據可用的完整資訊。
PeerMessagePropagationFilter是具有單一函式的基底抽象類。 ShouldMessagePropagate 方法呼叫的第一個自變數會傳入訊息的完整複本。 對訊息所做的任何變更不會影響實際訊息。 方法呼叫的最後一個自變數會識別訊息的來源 (PeerMessageOrigination.Local 或 PeerMessageOrigination.Remote)。 這個方法的具體實作必須從PeerMessagePropagation列舉傳回常數,指出訊息要轉送至本機應用程式(Local)、轉送至遠端用戶端(Remote)、或同時轉送至兩者(LocalAndRemote),或者既不轉送至本機應用程式也不轉送至遠端用戶端(None)。 這個篩選可以藉由存取對應的 PeerNode 物件,並在 屬性中 PeerNode.MessagePropagationFilter 指定衍生傳播篩選類別的實例來套用。 在開啟同儕通道之前,請確保已附加了傳播篩選器。
- 如需代碼段和相關信息,請參閱 對等通道部落格上的對等通道和 MessagePropagationFilter 文章。
聯絡網格中的個別節點
透過設定本機篩選,或設定直接連線,即可連絡網格中的個別節點。
如果網格中的節點各有個別標識碼,可以在訊息的實作中指定目的地標識碼。 您可以在訊息合約中撰寫函式來設定本機篩選,只有在訊息標識碼符合您指定的目的地標識碼時,才會將訊息顯示至目前節點。 網格會傳輸訊息,因此不需要產生設定新連線的額外負荷。 不過,由於訊息在整個網格中傳送多次,因此效率會遺失。 這很適合傳送訊息給網格的個別成員,只要訊息不是太大也不太頻繁。
對於長期、高頻寬的連線,最好是直接連線。 您可以透過網格傳送連線資訊,然後設定您選擇的直接連線來傳送/接收訊息。
選擇限制訊息散發的方法
當您探索需要限制訊息散發的案例時,請問自己下列問題:
誰 需要接收訊息? 只有一個鄰接節點嗎? 網格中其他地方的節點? 網格的一半?
傳送此訊息的頻率?
此訊息會使用哪種 頻寬 ?
這些問題的解答可協助您判斷是要使用躍點計數、訊息傳播篩選器、本機篩選,還是直接連線。 請考慮下列一般指導方針:
誰
個別節點:本機篩選或直接連線。
特定區域內的鄰居: PeerHopCount。
網格的複雜子集:MessagePropagationFilter。
多久一次
非常頻繁:直接連線、PeerHopCount、MessagePropagationFilter。
偶然:本地篩選。
帶寬使用
高:直接連線,較不建議使用 MessagePropagationFilter 或區域篩選。
低:可能不需要任何直接連線。