230 likes | 339 Views
JacORB Sobre JXTA. Implementação Do JXTA Como Protocolo De Transporte Do JacORB. Objetivo do trabalho. Fazer o JacORB rodar sobre o JXTA, de modo a permitir que aquele “atravesse” possíveis firewalls presentes em aplicações distribuídas. O JacORB: É um ORB Java; Open-source, etc. O JXTA:
E N D
JacORB Sobre JXTA Implementação Do JXTA Como Protocolo De Transporte Do JacORB Ivan Bittencourt de A. e S. Neto
Objetivo do trabalho • Fazer o JacORB rodar sobre o JXTA, de modo a permitir que aquele “atravesse” possíveis firewalls presentes em aplicações distribuídas. Ivan Bittencourt de A. e S. Neto
O JacORB: É um ORB Java; Open-source, etc. O JXTA: Protocolo P2P aberto; Escrito em Java e em C (mas pode ser implementado em outras linguagens); Independência de plataforma O JacORB e o JXTA Ivan Bittencourt de A. e S. Neto
O JXTA • Há uma série de protocolos definidos: • Peer Resolver Protocol: enviar pedidos e receber respostas de outros peers. • Peer Discovery Protocol: usado para publicar e encontrar recursos. • Pipe Binding Protocol: usado para criar um canal de comunicação entre 2 peers. • Etc... Ivan Bittencourt de A. e S. Neto
Mais JXTA • Bastante diferente do modelo tradicional do TCP/IP. • Funciona de maneira meio “mágica” (API simples). • Não utiliza IPs nem portas, mas um ID e um grupo (na verdade um Advertisement) para cada recurso. • Guarda as configurações iniciais num diretório “.jxta”. • Comunicação entre peers ocorre por meio de Pipes. Ivan Bittencourt de A. e S. Neto
Exemplo de Advertisement <?xml version=“1.0”?> <jxta:PipeAdvertisement> <Id>urn:jxta:uuid-DEAE73...106</Id> <Type>JxtaUnicast</Type> <Name>ExamplePipe</Name> </jxta:PipeAdvertisement> Ivan Bittencourt de A. e S. Neto
Publicando um InputPipe discoverySvc = netPeerGroup.getDiscoveryService(); pipeAdvertisement = (PipeAdvertisement) AdvertisementFactory.newAdvertisement( PipeAdvertisement.getAdvertisementType()); discoveryService.publish(pipeAdvertisement); discoveryService.remotePublish(pipeAdvertisement); Ivan Bittencourt de A. e S. Neto
Tipos de Peers • Rendezvous: decide se propaga mensagens que ele recebe. • Relay: faz requisições e recebe respostas em nome de outro peer. • Peer “normal”. Ivan Bittencourt de A. e S. Neto
Publicação/Busca de recursos • Cada peer conhece algum(ns) rendezvous peer(s). • Cada rendezvous peer conhece alguns outros rendezvous peers. • Quando um peer publica seus recursos, ele manda informações ao seu rendezvous. • A busca de recursos ocorre somente entre os redezvous, o que agiliza bastante a busca. • Mas a comunicação entre peers é feita diretamente. Ivan Bittencourt de A. e S. Neto
Um exemplo JXTA public static void main (String[] args) throws Exception { PeerGroup netPeerGroup = PeerGroupFactory.newNetPeerGroup(); DiscoveryService discovery = netPeerGroup.getDiscoveryService(); discovery.addDiscoveryListener(this); discovery.getRemoteAdvertisements(null, DiscoveryService.PEER, null, null, 5); } Sending a Discovery Message Got a Discovery Response [5 elements] from peer : unknown Peer name = suz Peer name = Frog@SF05 Ivan Bittencourt de A. e S. Neto
O peer “servidor” cria um InputPipe e publica o ID deste na rede. O peer cliente obtém de algum modo o ID publicado (numa IOR, por exemplo), localiza o InputPipe e cria um OutputPipe. A conexão (unidirecional) está estabelecida. Comunicação entre peers Peer cliente Peer servidor Ivan Bittencourt de A. e S. Neto
Felizmente há o JXTASocket • Mais alto nível. • Muito parecido com sockets de Java. • Permite comunicação nos dois sentidos. • Precisa do grupo e PipeAdvertisement de onde vai conectar. • Há um grande delay no estabelecimento da conexão (solucao: rendezvous peer em comum). • Há também o P2PSocket (não vem junto com o JXTA). Ivan Bittencourt de A. e S. Neto
P2PSocket • Substitui o Socket e ServerSocket do Java. • Mas roda sobre JXTA. • Seu uso é muito parecido com o de sockets normais. • Usa componentes JXTA para simular uma rede TCP/IP. • Mais intuitivo que o JXTASocket. Dá até pra usar sem saber que roda sobre JXTA. Ivan Bittencourt de A. e S. Neto
Atravessando firewalls/NAT • Se um peer está atrás de firewall ou NAT, é preciso que ele encontre um relay peer (o configurador do JXTA faz isso). • O relay peer recebe/envia mensagens em nome do peer inacessível. • De tempos em tempos, o peer inacessível se conecta ao seu relay peer e envia/pega suas mensagens pendentes. • Logo, o firewall tem que estar aberto em pelo menos uma porta para conexões externas (geralmente 80). Ivan Bittencourt de A. e S. Neto
Travessia de firewall/NAT Ivan Bittencourt de A. e S. Neto
A “ponte” entre o JacORB e o JXTA: a ETF • A ETF (Extensible Transport Framework) é suportada pelo JacORB. • Ela define (num arquivo IDL) uma série de interfaces que devem ser implementadas para adicionar um novo protocolo de transporte. • Basta estender as classes da ETF que estão no “jacorb.jar”. Ivan Bittencourt de A. e S. Neto
Interfaces da ETF • Connection (ClientConnection e ServerConnection) • Profile • Listener • Factories • Handle (o JacORB já implementa) Ivan Bittencourt de A. e S. Neto
ORB Plugin Factories::create_listener() Listener::set_handle() Listener::listen() JacORB e a ETF Criação de um Listener server-side: Ivan Bittencourt de A. e S. Neto
ETF Profile • Contém toda informação relacionada a um endereço para um protocolo de transporte específico (no caso do JXTA, o PipeAdvertisement e o grupo) + versão GIOP + object key. • Métodos Profile <-> CDROutputStream <-> IOR. • Representa o alvo de uma conexão. Ivan Bittencourt de A. e S. Neto
ETF Listener, Connection e Factories • Listener: Provê um “transport endpoint” que pode ser conectado a partir de um cliente (que possui um profile). • Factories: usado pelo ORB para criar Listeners, Connections e Profiles. • Connection: define uma interface entre o ORB e a camada de transporte. Ivan Bittencourt de A. e S. Neto
Juntando tudo isso • JacORB rodando sobre JXTA. • Mas fica lento. • Bem lento mesmo! • Solução: P2PSockets? Não. • Solução2: criar grupos? Não. É o que o P2PSockets faz. • O JXTA é lento mesmo. Afinal, ele é destinado a P2P, onde não respostas imediatas não são essenciais (ou possíveis). • O que foi feito: configurado um rendezvous peer em comum. Ivan Bittencourt de A. e S. Neto
Próximos passos • Testes de desempenho em vários ambientes. • Problema com JxtaSocket: objetos muito grandes. • Adicionar suporte a P2PSockets -- talvez. Ivan Bittencourt de A. e S. Neto
É isso... • Mais informações em: • http://www.linux.ime.usp.br/~ivanneto/mac499/ • Perguntas, sugestões? Ivan Bittencourt de A. e S. Neto