Pesquisar este blog

segunda-feira, 29 de setembro de 2014

Exercícios de Desenvolvimento de Sistemas Distribuídos


  1. Qual é a importância dos WebServices na internet?
  2. Implemente um método RMI que receba dois parametros Double e retorne a sua multiplicação
  3. Implemente um serviço web, que defina um método soma e receba dois atributos inteiros e retorne a soma destes dois atributos.
  4. Qual é a importância do XML em uma troca de mensagens SOAP
  5. Quais são os objetivos de um sistema de arquivos distribuídos? E quais são as vantagens e desvantagens de cada tipo deles? 
  6. Descreva a importancia dos componentes de um webservice SOAP
  7. Explique o que é e qual tipo de sistema distribuído é o CORBA?
  8. Explique o que é e para que serve o Java RMI?

sábado, 27 de setembro de 2014

Exercícios IF, Else, Switch C#

Exercícios referentes a Estrutura Condicional em C#

  1. Considere um programa que receba uma entrada de dados numérica, relativo a nota média da prova de um aluno e responda da seguinte meneira. Aprovado se a nota for entre 10 e 7, Exame se a nota for entre 4 e 6.99 e Reprovado se a nota for entre 0 e 3.99.
  2. Escreva um programa em C# que receba uma lista e retorne o maior e o menor valor presente nesta lista.
  3. Escreva um programa em C# que receba dois valores e determine se eles são múltiplos.
  4. Crie um programa que contenha um menu. Neste menu o usuário poderá escolher, 1 -  para cadastrar o usuário (ao escolher esta opção o usuário deverá ser direcionado a uma tela de cadastro de usuário, aqui ele terá duas opções, digitar 1 para salvar e 2 para cancelar), 2 para apagar um usuário (ao escolher esta opção o programa deverá mostrar uma mensagem para o usuário digitar o id do usuário a ser removido e 2 opções, digitar 1 para confirmar a remoção ou 2 para cancelar) e 3 para sair do programa.

quinta-feira, 25 de setembro de 2014

Sistemas distribuídos baseados na Web - SOAP

Sistemas distribuídos baseados na Web

No início da internet, as páginas basicamente eram documentos estáticos linkados (HTML, texto e XML), onde basicamente tinhamos um sistema cliente/servidor. O browser, neste caso, atuava como cliente e o servidor das páginas web, atuava como servidor.
Conforme a internet foi evoluindo, apareceram os scripts CGI (Common Gateway Interface) que permitiam a execução de scripts pelo browser, com isso era possível executar parte da regra de negócios nos clientes, os browsers, e prover conteúdo dinâmico para as páginas HTML.
Quanto mais páginas web eram criadas, maiores eram seus níveis de acesso, e com isso veio a necessidade de distribuir os servidores web.
Hoje o principal servidor de conteúdo web é o Apache Httpd Server Project, que é executado em 59.6% de todos os servidores da web, segundo esta pesquisa.
Clusterisar, ou distribuir um servidor não é uma tarefa fácil, mas isto deverá ser realizado de maneira transparente ao cliente. Quando um site possui várias instâncias de um servidor, a cada clique as chamadas realizadas pelo cliente pode migrar de um servidor para outro, mas sem que o cliente perceba, esta migração deverá ser transparente.
A clusterização foi feita para aumentar a performance dos servidores web, porém ao fazê-la devemos tomar certos cuidados, como a necessidade de mantê-los sincronizados, gerenciar os servidores através de monitoramento e a seleção do melhor servidor para executar uma requisição.

Comunicação

A comunicação na internet é realizada através do protocolo HTTP (Hipertext Transfer Protocol), ou protocolo de transferência de hipertexto. Este protocolo funciona com requisições e respostas, o browser como cliente faz uma requisição ao servidor web, o qual irá fornecer dados como resposta em forma de hipertexto.
O protocolo HTTP define 8 métodos, o GET, POST, PUT, HEAD, DELETE, TRACE, OPTIONS e CONNECT, sendo os 5 primeiros os mais utilizados.
O GET é utilizado quando queremos pegar algum recurso do servidor, o HEAD é uma variação do GET, porém ao invés de retornar todos os dados, em uma chamada HEAD só retornam os metadados da requisição e não os dados. Os metadados são dados que podem prover informações úteis sobre os dados daquele método, por exemplo os arquivos armazenados nos discos das máquinas possuem metadados, dentre eles os que identificam qual é o tipo de arquivo (bitmap, jpeg, mpeg, etc). O método POST é utilizado para enviar informações a serem processadas pelo serviço, como inserções de dados, já o método PUT é utilizado para enviar requisições de alteração de dados, finalmente o método DELETE é utilizado para remover um recurso do servidor.

Nomes

Todo método de um webservice roda em um servidor na internet e com isso será acessado através de uma URL, que por sua vez obedece a sua estrutura:
esquema : // nome : porta / caminho

Evolução da Internet

No início a internet eram só páginas estáticas de HTML e com o advento dos javascripts e do AJAX, os WebServices granharam importância. Os javascripts propiciaram aos WebDesigners a possiblidade de executar parte da regra de negócio no cliente, o browser. Com o javascript é possível realizar chamadas ao servidor e com isso a necessidade de métodos aumentou consideravelmente.
Os webservices são utilizados não só para fornecer dados e operações nos dados das páginas, como também, para disponibilizar parte dos dados de uma empresa/aplicativo na internet.
A internet gerou uma mudança no comportamento das empresas em relação aos seus dados, antes as empresas eram muito fechadas e não expunham os seus dados na internet. Com a descoberta dos webservices as empresas passaram a disponibilizar estes dados aos seus usuários, o que gerou uma nova onda de aplicativos web, também conhecidos como mashup.
Muitas empresas passaram a disponiblizar uma API de métodos http, e em alguns casos, cobrar pela utilização destes dados, como pode ser visto aqui, aqui e em muitos outros lugares na internet.

SOAP

O SOAP é um dos protocolos que especifica como deve ser realizada a troca de informações em um WebService, o seu desenvolvimento foi baseado, entre outras coisas, no protocolo de RPC. Nele os dados são trocados através dos arquivos de XML, que nada mais é do que um arquivo texto utilizado para formatar os dados.
Este protocolo começou a ser desenvolvido por dois funcionários da Microsoft e depois de algum tempo a sua especificação migrou para um grupo multidisciplinar do World Wide Web Consortium.
Um serviço SOAP, por definição é extensível, neutro e independente e se tornou a base para a definição do WSDL (WebService Description Language). A implementação de um serviço simples em Java, pode ser encontrada em diversas páginas da web, como aqui.
Este protocolo é extensível pois para implementar algumas regras, como as de segurança, isso é feito extendendo-se as suas definições. Ele é independente, pois o consórcio que estabelece as suas regras não está vinculado a nenhuma empresa, linguagem, sistema operacional ou modelo. E finalmente ele é neutro, pois pode ser utilizado por muitos protocolos, como o HTTP, o HTTPS e o SMTP.
Uma das grandes vantagens do SOAP, em relação as outras formas de se executar chamadas a métodos remotas, é a facilidade de configuração do Firewall, já que todos os métodos serão acessados pelo mesmo endereço e porta, e todas as mensagens trocadas serão transmissões de xml, impossibilitando ataque de envio de arquivos executáveis aos servidores.
Mesmo assim, como a segurança não é definida pela especificação do SOAP, cada desenvolvedor deverá implementá-la da sua maneira e para isso deve-se tomar muito cuidado com as possíveis formas de ataques, como a Man in the Middle, quais dados liberar e para quais usuários.
Uma mensagem de SOAP é definida por quatro componentes:
  • Envelope: que identifica aquela xml como uma mensagem SOAP
  • Header: que contem informações de metadados
  • Body: que contem as informações da chamada ou da resposta
  • Fault: que é utilizada para enviar as informações referentes aos erros que aconteceram durante o processamento daquela requisição

WSDL

O WSDL é responsável por definir as informações referentes aos métodos de um webservice. Estas inforamações incluem, nome, parametros, método HTTP utilizado, resposta e possíveis erros.
É possível acharmos o WSDL de um serviço adicionando o:
?wsdl
ao final o seu endereço. Com isso conseguimos fazer o download do arquivo de definição do webservice e com ele é possível gerarmos código referente as chamadas aqueles serviços, na linguagem que estamos utilizando para desenvolver o nosso sistema.

Sistema distribuído baseado na Web
SOAP

domingo, 14 de setembro de 2014

Sistemas de Arquivos distribuídos

Sistema de arquivos distribuídos

Os sistemas de arquivos distribuídos não compartilham o acesso aos blocos de armazenamento dos hds das máquinas, eles usam um protocolo de rede para isso, que também são conhecidos como network file system (sistema de arquivos de rede).

Objetivos

Os sistemas de arquivos distribuídos foram desenvolvidos com o objetivo de serem transparentes aos sistemas clientes, ou seja eles foram desenvolvidos para serem usados como se fossem pastas locais da máquina, e não remotas.
Um sistema de arquivos distribuídos almeja ter transparência em vários aspectos e por trás dos panos ele é responsável por localizar, transportar e potencialmente porver as funcionalidades de transparência listadas abaixo:
  • Migração: Os arquivos podem se movimentar de um lugar ao outro, sem a alterar configurações nos clientes.
  • Falha: Os softwares clientes devem continuar funcionando, mesmo quando uma falha acontecer no servidor
  • Localização: Os nomes dos arquivos não devem indicar onde eles estão localizados.
  • Acesso: Os clientes não devem saber que estão acessando um sistema distribuído de arquivos, e os arquivos devem ser acessados como se fossem arquivos locais.
  • Escalabilidade: o sistema deve funcionar bem tanto em poucas máquinas (de um a 12 servidores), quanto escalar bem em sistemas grandes (milhares de máquinas)
  • Concorrência: todos os clientes devem ver ter a mesma visão dos arquivos do sistema, ou seja, se algum cliente alterar algum arquivo, todos os processos que estiverem acessando este sistema de arquivos também irá ver estas alterações de uma forma coerente.
  • Replicação: por motivos de escalabilidade e segurança, podemos querer replicar o sistema em várias máquinas, sem que os clientes saibam.
  • Heterogeniedade: o sistema de arquivos deve ser provido em múltiplos hardwares e sistemas operacionais.

Armazenamento em rede e Disco compartilhado

Nos sistemas de arquivos de disco compartilhado utilizam uma Storage Area Network (SAN, uma área de armazenamento na rede) que provê acesso direto ao disco pela rede. Tanto o controle de acesso, quanto a tradução dos dados lidos do sistema de armazenamento são realizados nos clientes.
O tipo mais comum deste tipo de sistema, são os sistemas de arquivos de disco distribuídos, que adicionam uma camada de controle de concorrência, que prove um sistema consistente de serialização, evitando dados corrompidos e perda de dados, mesmo quando muitos clientes tentam acessar o mesmo arquivo, ao mesmo tempo. É comum nestes sistemas, a implementação de um mecanismo de isolamento dos dados, para prevenir o corrompimento dos dados, quando um nó falha.
Vários tipos de arquitetura foram utilizadas na implementação dos sistemas de arquivo de disco distribuído. Alguns deles distribuem as informações dos arquivos para todos os nós, outros utilizam servidores de metadados centralizados. Nestes dois casos é possível acessar todos os arquivos de todos os servidores.

Classificação dos sistemas de arquivos distribuídos

Existem dois tipos de configuração de acesso possíveis em um sistema de arquivos distribuídos. O sistema de acesso local e o sistema de acesso remoto.

Acesso Local

Em um sistema de acesso local, configuramos o sistema distribuído na rede interna da empresa. As vantagens deste tipo de sistema são:

  • Podem ser configurados em várias linguagens diferentes
  • Acesso local, gera melhor performance de acesso
  • São administráveis e propiciam um melhor controle, já que a configuração é feita internamente.
  • Melhor segurança, já que os arquivos ficam armazenados internamente e isso possibilita um melhor controle de quem tem acesso aos arquivos, ou mesmo as salas onde estão os servidores. Além de controlar quais patches serão aplicados aos servidores.
Já nas desvantagens podemos citar:

  • Alto custo, com máquians, softwares e equipe.
  • Necessidade de compra de máquinas
  • Maior custo de configuração de firewall, acessos, etc
  • Mais trabalho com os backups.

Acesso Remoto

Já um sistema com acesso remoto, onde os arquivos ficam armazenados na nuvem, os arquivos são enviados a um provedor da nuvem que será responsável por armazenar e fazer backup destes arquivos.
As vantagens deste sistema são:
  • Baixo custo, custam centavos por GB de armazenamento, por mês.
  • Backup automático
  • Administração fácil feita através de um website, muitas fontes de ajuda para resolver os problemas de configuração.
  • Não há necessidade de alocação de hardware/máquinas para armazenar estes arquivos.
  • Segurança, geralmente estes provedores possuem vários certificados de segurança de armazenamento e configuração que não são tão fáceis de obter, muito menos baratos. Neste tipo de sistema estes certificados já estão disponíveis.
Nas desvantagens podemos citar:
  • Privacidade dos dados, já que não temos controle de quem acessará os dados.
  • Uso de banda, pois os arquivos deverão ser enviados pela internet, e com isso consumirão banda de acesso a internet.
  • Performance mais baixa que dependerá da velocidade e estabilidade do seu acesso a internet.

quarta-feira, 3 de setembro de 2014

Sistemas distribuídos baseado em objetos

Sistemas distribuídos baseado em objetos

Em um sistema distribuído temos muitos processos diferentes, rodando em diversas máquinas diferentes e trocando dados entre si. Uma das maneiras de se estabelecer uma comunicação entre dois processos é possível ser realizada se estabelecermos um protocolo de troca de dados entre eles, como o TCP.
Caso um processo A deseja receber o cálculo do determinante de um número inteiro n, ele pode realizar esta operação da seguinte forma:
det = determinante_matriz(n)
Porem, caso o processo A não saiba realizar o cálculo do determinante de uma matriz e o processo B sabe, esta chamada então, pode ser realizada da seguinte maneira.

stream = abreConexao(porta_processoB);
write(stream, "determinante_matriz"); // envia um comando
write_matrix(stream, n); // envia argumentos
read(stream, &det); // pega o resultado
fecha_conexao(stream);
Agora suponha que A e B sejam sistemas baseados em objetos, não importa qual linguagem seja utilizada, um objeto é a mesma coisa em qualquer linguagem, basicamente uma lista de argumentos e métodos. A transmissão de um objeto entre estes dois sistemas pode ser transparente, caso os dois sistemas concordem na definição de um objeto. A conexão e transmissão pode ser realizada automaticamente.

O que é um sistema distribuído baseado em Objetos?

Um sistema distribuído baseado em objetos é exatamente isto. Assim que um objeto é definido em uma linguagem descritiva genérica, um gerador de interfaces é executado e produz definições específicas de linguagens e rotinas de como transmitir os objetos entre programas. Com isso, cada programa se torna um sistema de cliente/servidor para alguns objetos específicos.
Portanto nenhuma das partes precisa conhecer os detalhes da outra. Cada um dos softwares registram os tipos de objetos disponíveis, para comunicação como um tipo ORB (Object Request Broker). Quando um programa A necessita de um serviço, ele irá se conectar ao ORB, que fará o roteamente o colocará o programa A em contato com o softaware provedor do objeto requisitado. A sequencia de chamadas agora ficará da seguinte forma.

Programa A                           Programa B
inclui geraMatriz.h                inclui geraMatriz.h
                                               contacta_ORB(objetoORB);
                                               prove_servico_ORB(objetoORB, ClasseMatriz);
 contacta_ORB(objetoORB);
requisita_servico_ORB(objetoORB, ClasseMatriz);
ClasseMatriz minhaMatriz = new (...);
det = minhaMatriz.determinante();
Com isso a chamada ao método determinante da classe MinhaMatriz é transparente, o programa B manda uma matriz e a chamada ao método espera por uma resposta. O código tanto de A, quanto de B é bem mais simples.

Como isso funciona?

A classe MinhaMatriz é definida em uma linguagem de descriçao genérica, onde são especificadas os seus conteúdos e os métodos públicos. Esta linguagem geralmente é chamada de IDL (Interface Description Language). Em um primeiro passo da compilação, o arquivo MinhaMatriz.idl é traduzida em todas as linguagens definidas pelo sistema, como Java, C++, Lisp, etc...). Após isso, cada programa irá pegar os arquivos gerados para a sua linguagem e incluí-los em seu classpath.
O código gerado contem não apenas os seus atributos, como também os métodos que são utilizados para quebrar a classe em componentes (processo conhecido como marshalling), que serão enviados através de uma conexão ao outro programa, e ao ser recebido (o processo de unmarshalling) será responsável por reconstruir o objeto na outra ponta.

Problemas:

Tudo isso é bem simples quando estamos trabalhando com uma mesma linguagem, porém passar objetos entre linguagens diferentes, como Java, List, etc, é bem complicado, pois geradores de ORB diferentes serão utilizados.

Padrões

CORBA(Common Object Request Broker) gerado pela OMG define um padrão de implementação para o ORB. A última especificação do CORBA, que consta no site da OMG é a 3.1.1 de 2012.
O CORBA é uma especificação que vem crescendo ao longo dos anos, devido a sua facilidade de utilização, funcionalidade e portabilidade entre linguagens. CORBA é bem utilizada nas grandes empresas, onde muitos sistemas interagem, interagem entre si, e sistemas antigos não podem ser desligados (vide nossos bancos). O CORBA prove uma forte ligação entre linguagens e/ou plataformas diferentes, e a sua única limitação é ter uma implementação CORBA para cada uma das linguagens/plataformas necessárias.
Existem várias implementações da especificação do CORBA, como o Visibroker da Borland. Empresas como a Oracle a IBM também possuem suas implementações desta especificação.
Java tem uma implementação de RPC/ORB chamada RMI (remote method invocation), que possui algumas semelhanças com o CORBA e suas principais diferenças são. No RMI podemos enviar objetos como parâmetros, enquanto que no CORBA devemos enviar apenas tipos primitivos ou estrutura de dados. Além disto, no RMI é possível enviarmos implementações de código entre as máquinas, permitindo que tenhamos um servidor como provedor de código remoto.

Java RMI

Tutoriais de java RMI
DevMedia Portugues
Oracle Inglês