Limitando a distribuição de mensagens

O Canal Par é, por projeto, uma malha de difusão. Seu modelo básico de inundação envolve a distribuição de cada mensagem enviada por qualquer membro de uma malha para todos os outros membros dessa malha. Isso é ideal em situações em que cada mensagem gerada por um membro é relevante e útil para todos os outros membros (por exemplo, uma sala de chat). No entanto, muitos aplicativos têm uma necessidade ocasional de limitar a distribuição de mensagens. Por exemplo, se um novo membro ingressar em uma malha e quiser recuperar a última mensagem enviada pela malha, essa solicitação não precisa ser disseminada para todos os membros da malha. A solicitação pode ser limitada a vizinhos próximos ou as mensagens geradas localmente podem ser filtradas. As mensagens também podem ser enviadas para um nó individual na malha. Este tópico discute como usar a Contagem de Saltos, um Filtro de Propagação de Mensagens, um filtro local ou uma conexão direta para controlar como as mensagens são encaminhadas ao longo da malha e fornece diretrizes gerais para escolher uma abordagem.

Contagens de Saltos

O conceito de PeerHopCount é semelhante ao TTL (Time-To-Live) usado no protocolo IP. PeerHopCount está vinculado a uma instância de mensagem e especifica quantas vezes uma mensagem deve ser encaminhada antes de ser descartada. Sempre que uma mensagem é recebida por um cliente do Peer Channel, o cliente examina a mensagem para ver se PeerHopCount é especificada. Se estiver especificado, o cliente diminuirá o valor da contagem de saltos em um antes de encaminhar a mensagem para nós vizinhos. Quando um cliente recebe uma mensagem com um valor de contagem de saltos igual a zero, o cliente processa a mensagem, mas não encaminha a mensagem para os vizinhos.

A contagem de saltos pode ser adicionada a uma mensagem acrescentando PeerHopCount como um atributo à propriedade ou campo aplicável na implementação da classe de mensagem. Você pode definir isso como um valor específico antes de enviar a mensagem para a malha. Dessa maneira, você pode usar a contagem de saltos para limitar a distribuição de mensagens em toda a malha quando necessário, evitando potencialmente a duplicação desnecessária de mensagens. Isso é útil nos casos em que a malha contém uma alta quantidade de dados redundantes ou para enviar uma mensagem para vizinhos imediatos ou vizinhos dentro de alguns saltos.

Filtro de Propagação de Mensagens

MessagePropagationFilter pode ser usado para o controle personalizado de inundações de mensagens, especialmente quando o conteúdo da mensagem ou outros cenários específicos determinam a propagação. O filtro toma decisões de propagação para cada mensagem que passa pelo nó. Isso é verdadeiro para mensagens que se originaram em outro lugar na rede e que seu nó recebeu, assim como para mensagens criadas pelo seu aplicativo. O filtro tem acesso à mensagem e à sua origem, portanto, as decisões sobre encaminhamento ou remoção da mensagem podem ser baseadas nas informações completas disponíveis.

PeerMessagePropagationFilteré uma classe abstrata base com uma única função. ShouldMessagePropagate O primeiro argumento na chamada do método transfere uma cópia completa da mensagem. As alterações feitas na mensagem não afetam a mensagem real. O último argumento da chamada de método identifica a origem da mensagem (PeerMessageOrigination.Local ou PeerMessageOrigination.Remote). Implementações concretas desse método devem retornar uma constante da PeerMessagePropagation enumeração indicando que a mensagem deve ser encaminhada para o aplicativo local (Local), encaminhada para clientes remotos (Remote), ambos (LocalAndRemote) ou nenhum (None). Esse filtro pode ser aplicado acessando o objeto correspondente PeerNode e especificando uma instância da classe de filtro de propagação derivada na PeerNode.MessagePropagationFilter propriedade. Verifique se o filtro de propagação está anexado antes de abrir o Canal Par.

Entrar em contato com um Nó Individual na Malha

Um nó individual na malha pode ser contatado configurando o filtro local ou a conexão direta.

Se os nós em uma malha tiverem uma ID individual, uma ID de destino poderá ser especificada na implementação da sua mensagem. O filtro local pode ser configurado escrevendo uma função no contrato de mensagem que exibirá apenas a mensagem no nó atual se a ID corresponder à ID de destino especificada. A malha transporta a mensagem, portanto, a sobrecarga de configurar uma nova conexão não precisa ser incorrida. No entanto, há uma perda de eficiência, pois a mensagem é enviada muitas vezes em toda a malha. Isso funciona bem para enviar mensagens para membros individuais de uma malha, desde que as mensagens não sejam muito grandes nem muito frequentes.

Para conexões de largura de banda de longa duração e alta, as conexões diretas são preferíveis. Você pode enviar informações de conexão pela malha e, em seguida, configurar uma conexão direta de sua escolha de enviar/receber mensagens.

Escolhendo uma abordagem para limitar a distribuição de mensagens

Ao descobrir um cenário no qual você precisa limitar a distribuição de mensagens, faça as seguintes perguntas:

  • Quem precisa receber a mensagem? Só um nó vizinho? Um nó em outro lugar na malha? Metade da malha?

  • Com que frequência essa mensagem será enviada?

  • Que tipo de largura de banda essa mensagem usará?

As respostas a essas perguntas podem ajudar você a determinar se deve usar a Contagem de Saltos, um Filtro de Propagação de Mensagens, um filtro local ou uma conexão direta. Considere as seguintes diretrizes gerais:

  • Quem

    • Nó individual: filtro local ou conexão direta.

    • Vizinhos em uma determinada vizinhança: PeerHopCount.

    • Subconjunto complexo da malha: MessagePropagationFilter.

  • Com que frequência

    • Muito frequente: conexão direta, PeerHopCount, MessagePropagationFilter.

    • Ocasional: filtro local.

  • Uso de largura de banda

    • Alta: conexão direta, menos aconselhável para usar MessagePropagationFilter ou filtro local.

    • Baixa: qualquer conexão direta provavelmente não é necessária.

Consulte também