![]() |
![]() |
O objetivo deste projeto é comprimir as mensagens CORBA que são enviadas do cliente para o servidor e vice-versa, e descobrir em quais situações os interceptadores melhoram o desempenho e em quais eles introduzem um sobrecarga indesejável. Para tal, utilizou-se os interceptadores de mensagens proprietários do JacORB, implementados na linguagem Java.
Os interceptadores agem sobre as mensagens trocadas entre o cliente e o servidor, dentro do ORB. Como as próprias mensagens são alteradas, utilizar interceptadores de mensagens em detrimento dos de requisições foi uma decisão natural.
O algoritmo usado pelos interceptadores para compactar as mensagens foi o das classes java.util.zip.Inflater e java.util.zip.Deflater, do JDK 1.2.2. Estas classes utilizam o algoritmo de compactação ZLIB.
O esquema para envio e recepção de mensagens no sistema funciona da seguinte forma:
- Quando uma mensagem endereçada ao servidor é montada pelo cliente, esta é interceptada ao chegar no ORB.
- No ORB, o interceptador do cliente encarrega-se de compactar a mensagem.
- A mensagem é, então, formatada para envio: são adicionados 0's até que o seu tamanho atinja uma potência de 2.
- Quando a mensagem chega no lado do servidor, o interceptador a descompacta e ela é reformatada (adicionando-se os 0's no seu final).
- Em seguida, o ORB retira os 0's de formatação da mensagem, e esta chega ao servidor, onde é feito o unmarshalling.
- A resposta do servidor é então enviada, análogo aos procedimentos acima descritos, até o lado do cliente.
O maior problema enfrentado durante a implementação do projeto não foi diretamente relacionado ao mesmo. Quando da execução dos testes, descobrimos que as mensagens enviadas pelo cliente e pelo servidor não chegavam intactas ao seu destino: elas eram modificadas de tal forma que davam problemas ou o servidor caía.
Através de informações trocadas com o grupo de Alexey A. Villas Boas, Edgard Pevidor de Miranda e Flavio Regis de Arruda, que também implementaram o mesmo projeto, soubemos que o problema não estava no nosso código, mas na implementaçãoo de interceptadores de mensagens do próprio JacORB. Havia um bug que os programadores do ORB não fixaram, o que foi confirmado pelos mesmos quando o grupo de Alexey comunicou-se com eles.
Através de modificações feitas por esse grupo no código-fonte do JacORB, foi possível fazer os interceptadores funcionarem. No entanto, devido a uma limitaçao da versão utilizada, tivemos de retirar do projeto o serviço de nomes (já em funcionamento no código), substituindo-o por um arquivo mesmo.
Outra dificuldade enfrentada foi entender o modo como os interceptadores funcionam. Para enviar qualquer mensagem, o JacORB completa a mensagem com 0's, até que o tamanho da mesma atinja uma potência de 2. Como o trabalho dos interceptadores é realizado antes da recepção da mensagem, tivemos de formatar a mensagem descompactada para atender a esse padrão, pois o mesmo era esperado no destino. A solução encontrada foi criar um método que calculava a potência de 2 mais próxima do tamanho da mensagem já descompactada, e preencher o final da mesma com 0's.
Fizemos testes para mensagens de aproximadamente 10, 100, 500, 1000 e 1500 bytes. Os resultados botem ser baixados daqui:
Analisando-se os gráficos obtidos, constatamos que o overhead de processamento causado pelos interceptadores supera o ganho de tempo originado pela compactação. Nas mensagens de tamanho 10 e 100, as mensagens sem compactação levavam grande vantagem sobre as compactadas. A situação começa a mudar a partir das mensagens de tamanho 500, e os dois métodos praticamente se equivalem em mensagens de 1000 bytes.
Com mensagens de tamanho 1500, a compactação já começa a fazer diferença, e as mensagens compactadas levam um tempo menor para sair do cliente, chegar ao servidor e retornar ao cliente.
- Baixe o arquivo ep3.tar.gz e descompacte-o.
- Altere o script mac440.sh e execute-o.
- Compile o código-fonte.
- Abra duas janelas: na primeira, rode o servidor; na segunda, o cliente.
- Rode o GNUPlot: gnuplot plota.