Interceptadores CORBA para compressão de mensagens em Java com o JacORB

Índice

Introdução
Arquitetura
O sistema
Funcionamento interno
Problemas encontrados
Testes
Configuração de hardware
Configuração de software
Gráficos
Usando o programa
Código-fonte
Instalação e execução

Introdução


     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.


Arquitetura




     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 sistema


Funcionamento interno


  • Algoritmo de compactação:

         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.


  • Envio de mensagens:

         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.


    Problemas encontrados


         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.


    Testes


    Configuração de hardware


  • 2 Micros da Rede Linux, cada um possuindo:
  • 1 Processador AMD Athlon 1.1 GHz.
  • 256 Mb de RAM.
  • 256 Kb de cache.

    Configuração de software


  • JDK 1.2.2
  • JacORB 1.0 beta 15
  • GNUPlot

    Gráficos


         Fizemos testes para mensagens de aproximadamente 10, 100, 500, 1000 e 1500 bytes. Os resultados botem ser baixados daqui:

  • 10 bytes - com compactação
  • 100 bytes - com compactação
  • 500 bytes - com compactação
  • 1000 bytes - com compactação
  • 1500 bytes - com compactação
  • 10 bytes - sem compactação
  • 100 bytes - sem compactação
  • 500 bytes - sem compactação
  • 1000 bytes - sem compactação
  • 1500 bytes - sem compactação

         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.


    Usando o programa


    Código-fonte


  • Código-fonte

    Instalaçao e execução

    Para executar o programa, é necessário seguir a configuração de software indicada acima.

    - 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.