[Movido aqui por sugestão de usuários de SO (10k SO +) ]
Eu gostaria de desenvolver um aplicativo ponto a ponto. Embora tenha muita experiência em aplicativos LOB, sou novo na arena P2P.
Tenho uma ideia aproximada de como as coisas devem funcionar, mas preciso de mais alguns detalhes para preencher meu entendimento.
O que eu sei (acredito) eu preciso fazer:
- Uma proporção significativa de clientes precisa habilitar conexões de entrada (regras ala uPnP / NAT)
- Os nós devem compartilhar outros nós conhecidos para fornecer resiliência se algum nó em particular for desativado
- É necessária alguma forma de sincronização / localização de rota para enviar dados entre clientes arbitrários
- Possivelmente algum recurso sniffing para diferenciar entre clientes "burros" e "supernós" mais poderosos para lidar com sincronização / compartilhamento de listas de nós e talvez retransmitir mensagens
- Clientes sem suporte de entrada devem manter aberta uma conexão de saída através da qual podem receber informações de nós aos quais se conectar
Em resumo, espero oferecer (a princípio) um serviço de chat / messenger que não dependa de uma conexão com nenhum servidor central em particular. Embora eu imagine que precise fornecer vários "supernós" centralizados para iniciar as coisas (ou após atualizações significativas), eles devem ser opcionais quando uma rede P2P funcional for estabelecida.
Vejo uma série de problemas e não sei como resolvê-los. Principalmente como ...
- Autentique usuários em outros nós sem uma autoridade central para verificar
- Coordenar quais nós sabem sobre quais outros nós (número mínimo-máximo / por latência / ???)
- Permitir que um determinado usuário determine se outro usuário (ou nó) está online
- Lidar com uma situação em que 2 grupos de nós estão fisicamente desconectados (com espaço aéreo) e como ressincronizar na reconexão dos grupos
- Etc etc
Sei que essa é uma pergunta bastante aberta, portanto, embora os padrões de design de alto nível sejam apreciados, o que realmente estou procurando é um guia decente sobre como os outros lidaram com esses problemas (e os que ainda não considerei ainda) )