Partilhar via


Limitando a distribuição de mensagens

Peer Channel é, por design, uma malha de transmissã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 precisará ser inundada 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 o uso da 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 pela malha e fornece diretrizes gerais para escolher uma abordagem.

Contagem de Lúpulo

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

A contagem de saltos pode ser adicionada a uma mensagem adicionando 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 forma, você pode usar a contagem de saltos para limitar a distribuição de mensagens em toda a malha quando necessário, potencialmente evitando a duplicação desnecessária de mensagens. Isso é útil nos casos em que a malha contém uma grande 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 controle personalizado de inundação 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 originadas em outro lugar na malha que seu nó recebeu, bem como mensagens criadas pelo seu aplicativo. O filtro tem acesso tanto à mensagem como à sua origem, pelo que as decisões sobre o reencaminhamento ou eliminação da mensagem podem basear-se em toda a informação disponível.

PeerMessagePropagationFilter é uma classe abstrata base com uma única função, ShouldMessagePropagate. O primeiro argumento da chamada de método passa em uma cópia completa da mensagem. Quaisquer 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. Certifique-se de que o filtro de propagação está anexado antes de abrir o canal de mesmo nível.

Entrando em contato com um nó individual na malha

Um nó individual em uma malha pode ser contatado configurando um filtro local ou configurando uma conexão direta.

Se os nós em uma malha tiverem cada um um ID individual, um ID de destino pode ser especificado na implementação da sua mensagem. Um filtro local pode ser configurado escrevendo uma função em seu contrato de mensagem que só exibirá a mensagem para o nó atual se seu ID corresponder ao ID de destino especificado. 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, uma vez que a mensagem é enviada muitas vezes através da malha. Isso funciona bem para enviar mensagens para membros individuais de uma malha, desde que as mensagens não sejam nem muito grandes nem muito frequentes.

Para conexões duradouras e de alta largura de banda, 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 para enviar/receber mensagens.

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

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

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

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

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

As respostas a essas perguntas podem ajudá-lo 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 orientações gerais:

  • Quem

    • individual: filtro local ou conexão direta.

    • Vizinhos dentro de uma certa vizinhança: PeerHopCount.

    • Subconjunto complexo da malha: MessagePropagationFilter.

  • Com que frequência

    • Muito frequentes: Direct connection, PeerHopCount, MessagePropagationFilter.

    • Ocasional: Filtro local.

  • Utilização da largura de banda

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

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

Consulte também