Escolar Documentos
Profissional Documentos
Cultura Documentos
AltoStratus Solucoes de Middleware para
AltoStratus Solucoes de Middleware para
Equipe Técnica:
Prof.ª Thais Vasconcelos Batista (Coordenadora) – UFRN
Prof. Nélio Alessandro Azevedo Cacho – UFRN
Prof.ª Flavia Coimbra Delicato – UFRJ
Prof. Paulo de Figueiredo Pires – UFRJ
Prof.ª Noemi de La Rocque Rodriguez – PUC-Rio
Prof.ª Ana Lúcia de Moura – PUC-Rio
Novembro de 2011
Conteúdo
1 Introdução ................................................................................................................................... 7
2 Plataformas de Computação em Nuvem .................................................................................. 9
2.1 Amazon Web Services (AWS) .............................................................................................. 9
2.1.1 Principais serviços ...................................................................................................... 10
2.1.1.1 Amazon Elastic Compute Cloud (EC2) ......................................................... 10
2.1.1.2 Amazon Simple Storage Service (S3) ............................................................ 11
2.1.1.3 Amazon Relational Database Service (RDS) ................................................. 11
2.1.1.4 Amazon SimpleDB ........................................................................................ 11
2.1.1.5 Amazon Simple E-mail Service (SES) .......................................................... 12
2.1.2 Ferramentas de apoio ao desenvolvimento ................................................................ 12
2.1.3 API e exemplos de uso ............................................................................................... 12
2.1.3.1 Amazon Elastic Compute Cloud (EC2) ......................................................... 12
2.1.3.2 Amazon Simple Storage Service (S3) ............................................................ 14
2.1.3.3 Amazon SimpleDB ........................................................................................ 16
2.1.3.4 Amazon Simple E-mail Service (SES) .......................................................... 18
2.2 Eucalyptus ........................................................................................................................... 20
2.2.1 Principais serviços ...................................................................................................... 22
2.3OpenStack............................................................................................................................. 23
2.3.1 Principais serviços ...................................................................................................... 25
2.3.1.1 OpenStack Compute (Nova) .......................................................................... 25
2.3.1.2 OpenStack Object Storage (Swift) ................................................................. 26
2.3.1.3 OpenStack Image Service (Glance) ............................................................... 26
2.3.2 API e exemplos de uso ............................................................................................... 27
2.3.2.1 OpenStack Compute....................................................................................... 27
2.3.2.2 OpenStack Object Storage ............................................................................. 30
2.3.2.3 OpenStack Image Service .............................................................................. 32
2.4 Google App Engine (GAE) ................................................................................................. 33
2.4.1 Serviços escaláveis ..................................................................................................... 35
2.4.1.1 Memcache ...................................................................................................... 35
2.4.1.2 URL Fetch ...................................................................................................... 35
2.4.1.3 Serviço de e-mail............................................................................................ 36
2.4.1.4 Serviço de mensagens instantâneas ................................................................ 36
2.4.2 Ferramentas de apoio ao desenvolvimento ................................................................ 36
2.4.2.1 Exemplo de um simples Java servlet ............................................................. 37
2.4.3 API e exemplos de uso ............................................................................................... 39
2.4.3.1 Memcache ...................................................................................................... 39
2.4.3.2 URL Fetch ...................................................................................................... 40
2.4.3.3 Serviço de e-mail............................................................................................ 41
2.4.3.4 Serviço de mensagens instantâneas ................................................................ 45
2.4.3.5 Acesso a estatísticas do banco de dados via código-fonte ............................. 45
2.4.3.6 Monitoramento de status de capacidade ........................................................ 45
2.4.3.8 Monitoramento de quota de serviços ............................................................. 46
2.4.3.9 Implantação de aplicações.............................................................................. 48
2.5 Windows Azure Platform .................................................................................................... 48
2.5.1 Principais serviços ...................................................................................................... 49
2.5.1.1 Windows Azure Compute .............................................................................. 49
2.5.1.2 Microsoft SQL Azure Database ..................................................................... 50
2.5.1.3 Windows Azure Virtual Machine (VM) ........................................................ 51
2.5.1.4 Windows Azure Storage ................................................................................ 51
2.5.1.5 Windows Azure AppFabric Caching ............................................................. 52
2.5.1.6 Windows Azure AppFabric Service Bus ....................................................... 52
2.5.1.7 Business Intelligence ...................................................................................... 52
2.5.2 Ferramentas de apoio ao desenvolvimento ................................................................ 53
2.5.3 Exemplo de uso .......................................................................................................... 53
2.6 Discussão ............................................................................................................................. 56
3 Considerações finais ................................................................................................................. 59
Referências ................................................................................................................................... 61
Lista de Figuras
Figura 1. Página principal do Amazon Web Services (AWS) – http://aws.amazon.com .............. 9
Figura 2. Criação de diferentes instâncias a partir de uma AMI no Amazon EC2. ..................... 10
Figura 3. Trecho de exemplo de código Java utilizando a Amazon EC2 API. ............................ 14
Figura 4. Trecho de exemplo de código Java utilizando a Amazon S3 API. ............................... 15
Figura 5. Trecho de exemplo de código Java utilizando a Amazon SimpleDB API (Parte 1 de 2).
.................................................................................................................................... 17
Figura 6. Trecho de exemplo de código Java utilizando a Amazon SimpleDB API (Parte 2 de 2).
.................................................................................................................................... 18
Figura 7. Trecho de exemplo de código Java utilizando a Amazon SES API. ............................ 20
Figura 8. Página inicial do Eucalyptus – http://www.eucalyptus.com ......................................... 21
Figura 9. Componentes básicos do Eucalyptus. ........................................................................... 22
Figura 10. Esquema de infraestrutura Eucalyptus e seus componentes básicos de serviços. ...... 23
Figura 11. Página inicial do OpenStack – http://www.openstack.org/ ........................................ 24
Figura 12. Serviços da plataforma OpenStack. ............................................................................ 25
Figura 13. Exemplo de operação com o OpenStack Compute. .................................................... 28
Figura 14. Definição da interface EntityManager para operação com o OpenStack Compute. 29
Figura 15. Operações envolvendo a interface EntityManager com binding para Java. ............ 30
Figura 16. Exemplo de requisição e resposta em operação com o OpenStack Object Storage. .. 31
Figura 17. Obtenção da lista de objetos armazenados em um container no OpenStack Object
Storage com o uso de binding da API para a linguagem Java. ................................... 32
Figura 18. Exemplo de resposta JSON em operação com o OpenStack Image Service. ............. 33
Figura 19. Exemplo de requisição em operação com o OpenStack Image Service. .................... 33
Figura 20. Página inicial do Google App Engine (GAE) –
http://code.google.com/intl/pt-BR/appengine/ ........................................................... 34
Figura 21. Estrutura de um projeto Java no Eclipse com o GAE. ................................................ 37
Figura 22. Exemplo de servlet para obtenção de data/hora. ......................................................... 38
Figura 23. Conteúdo do descritor de implantação web.xml. ....................................................... 38
Figura 24. Conteúdo do arquivo appengine‐web.xml. ............................................................. 39
5
Figura 25. Trecho de código Java para obtenção de identificador para implementação do cache.
.................................................................................................................................... 39
Figura 26. Exemplo de servlet utilizando o serviço URL Fetch. ................................................. 40
Figura 27. Exemplo de servlet para envio de e-mails utilizando o serviço de e-mail do GAE.... 42
Figura 28. Mapeamento de caminho de entrada de e-mail para Java servlet no arquivo web.xml.
.................................................................................................................................... 43
Figura 29. Exemplo de servlet para o recebimento de e-mails..................................................... 44
Figura 30. Trecho de código para envio de uma mensagem instantânea via GAE. ..................... 45
Figura 31. Obtenção de estatísticas de aplicação implantada no GAE a partir do dashboard. .... 45
Figura 32. Obtenção do status de funcionamento de partes de aplicação implantada no GAE. .. 46
Figura 33. Trecho de código com chamadas a métodos para mensurar o processamento requerido
por uma aplicação no GAE em um dado momento. ................................................... 47
Figura 34. Mapeamento da appstats do GAE para Java servlet no arquivo web.xml. ................ 47
Figura 35. Página inicial do Windows Azure Platform –
http://www.microsoft.com/windowsazure/ ................................................................ 48
Figura 36. Estrutura do Windows Azure e serviços que compõem a plataforma. ....................... 49
Figura 37. Criação de Serviço Hospedado ................................................................................... 54
Figura 38. Seleção de arquivos para implantação de serviço no Windows Azure. ...................... 54
Figura 39. Conteúdo do arquivo de configuração ServiceConfiguration.cspkg. ............... 55
Figura 40. Código ASP .NET da página a ser exibida. ................................................................ 55
Figura 41. Página ASP .NET do exemplo em execução. ............................................................. 56
6
Lista de Tabelas
Tabela 1. Principais comandos do Amazon EC2 organizados por funções. ................................ 13
Tabela 2. Principais comandos do Amazon S3 organizados por tipos de operações. .................. 14
Tabela 3. Comandos do Amazon SimpleDB. ............................................................................... 16
Tabela 4. Comandos do Amazon SES. ......................................................................................... 18
Tabela 5. Tempos máximos de processamento especificados pelo SLA do Azure Storage. ....... 51
Tabela 6. Principais informações sobre as plataformas analisadas. ............................................. 58
7
1 Introdução
Computação em Nuvem é “um tipo de sistema paralelo e distribuído que consiste de uma
coleção de computadores conectados e virtualizados que são dinamicamente provisionados e
apresentados como um ou mais recursos computacionais” (Buyya et al., 2008). Porém, o termo
Computação em Nuvem refere-se não somente à estrutura de hardware e de software dos
datacenters, mas também aos serviços providos por estes (Armbrust et al., 2009; Zhang et al.,
2010). Do ponto de vista dos serviços oferecidos, a Computação em Nuvem pode ser conceituada
como um conjunto de serviços disponibilizados via rede, provendo escalabilidade,
personalização, garantias de QoS, infraestruturas sob demanda e de baixo custo, os quais podem
ser acessados de um modo simples e pervasivo (Wang et al., 2010).
Tipicamente, plataformas de Computação em Nuvem disponibilizam interfaces que
possibilitam que os usuários, utilizando qualquer dispositivo conectado à Internet, possam ter
acesso aos serviços, arquivos, informações e programas situados “na nuvem”. Ou seja,
plataformas de Computação em Nuvem são provedores de serviços as quais viabilizam a ideia da
computação utilitária, que significa computação ao alcance de todos, onde usuários pagam pelos
serviços computacionais que utilizam.
Conceitualmente, as plataformas de Computação em Nuvem proveem suas
funcionalidades como serviços. Essas funcionalidades podem ser categorizadas como HaaS –
Hardware as a Service (hardware como um serviço)1, SaaS – Software as a Service (software
como um serviço), e DaaS – Data as a Service (dados como um serviço). Assim, serviços
baseados em uso de hardware, software e armazenamento de dados, respectivamente, são
oferecidos aos usuários finais. Detalhes sobre essa categorização podem ser encontrados no
trabalho de Wang et al. (2010). Para suportar IaaS, SaaS e DaaS, uma infraestrutura de
Computação em Nuvem pode, adicionalmente, disponibilizar uma quarta categoria de serviços,
denominada PaaS – Platform as a Service (plataforma como um serviço). PaaS, também
chamado de cloudware, é um nível adicional de abstração que permite o desenvolvimento e
gestão de aplicações sob medida “na nuvem”. Portanto, o PaaS propicia uma plataforma na qual
aplicações são desenvolvidas usando abstrações construídas sobre a infra-estrutura subjacente.
Assim, os usuários ganham maior poder para criar e instalar suas próprias aplicações utilizando
os serviços IaaS, SaaS e DaaS.
Várias importantes empresas estão fornecendo plataformas de computação em nuvem,
como Amazon, Google e Microsoft, além de haver também várias iniciativas open-source como
Eucalyptus e OpenStack. Os exemplos comerciais mais conhecidos de PaaS são o Amazon Web
Services, Google Code, Salesforce PaaS e o Windows Azure.
1
No nível de serviço HaaS, também se lida com a virtualização de recursos, de modo que, às vezes, os serviços de
HaaS são tidos como serviços de IaaS – Infrastructure as a Service (infraestrutura como serviço), visto que se
podem prover recursos físicos propriamente ditos como virtualizados, a exemplo das máquinas virtuais. No
presente relatório, a menção acerca de serviços de IaaS também se referirá, implicitamente, aos serviços de HaaS.
8
2
SLA (Service Level Agreement) é uma espécie de contrato firmado entre o provedor de um serviço e o cliente do
mesmo, sendo descrito o serviço, suas metas, papeis e garantias de qualidade de serviço (Verma, 1999).
11
A Tabela 1 apresenta uma breve descrição dos principais comandos utilizados no Amazon
EC2. A lista completa de comandos (115 no total), bem como a descrição detalhada de cada um
deles e os tipos de dados envolvidos, pode ser encontrada no Amazon Elastic Compute Cloud
API Reference, disponível no endereço http://awsdocs.s3.amazonaws.com/EC2/latest/ec2-
api.pdf.
3
Eclipse – http://www.eclipse.org/
13
4
No Amazon EC2, os conceitos de regiões (Regions) e zonas de disponibilidade (Availability Zones) são utilizados
para se referirem à localização das instâncias nos datacenters da Amazon. Regiões são dispersas e localizadas em
áreas geográficas distintas (EUA, Europa, etc.) e agregam zonas de disponibilidade, que são locais distintos dentro
de uma região. Uma explanação maior acerca desses conceitos pode ser encontrada no Amazon Elastic Compute
Cloud User Guide, disponível no endereço http://awsdocs.s3.amazonaws.com/EC2/latest/ec2-ug.pdf.
14
A Tabela 2 apresenta uma breve descrição dos principais comandos utilizados no Amazon
S3. A lista completa de comandos, bem como a descrição de cada um deles e os tipos de dados
envolvidos, pode ser encontrada no Amazon Simple Storage Service API Reference, disponível
no endereço http://awsdocs.s3.amazonaws.com/S3/latest/s3-api.pdf.
bucket
Adiciona um objeto de tamanho menor ou igual a
putObjectInline
1MB a um bucket
putObject Adiciona um objeto a um bucket
Operações sobre Cria uma cópia de um objeto, especificadas as
copyObject
objetos chaves dos buckets de origem e de destino
getObject Recupera um objeto
Elimina um objeto
deleteObject
(que não poderá ser restaurado)
A Tabela 3 apresenta uma breve descrição dos principais comandos utilizados no Amazon
SimpleDB:
Comandos Descrição
createDomain Cria um domínio
listDomain Lista um domínio
deleteDomain Elimina um domínio (por vez)
Lê metadados de um domínio, e.g. requisitos atuais de espaço
domainMetadata
de armazenamento
Adiciona ou atualiza um registro com base em um identificador
putAttributes
de registro (record identifier) e pares atributo/valor
Dispara, simultaneamente, múltiplas operações de inserção
batchPutAttributes
(insert) com o objetivo de aumentar o desempenho
deleteAttributes Elimina registros, atributos ou valores
getAttributes Lê um registro
Executa uma query (consulta) sobre a base de dados utilizando
Select uma sintaxe similar a SQL, mas sem ser aplicada a múltiplos
domínios, como é possível fazer com joins (junções)
Figura 5. Trecho de exemplo de código Java utilizando a Amazon SimpleDB API (Parte 1 de 2).
Figura 6. Trecho de exemplo de código Java utilizando a Amazon SimpleDB API (Parte 2 de 2).
A Tabela 4 apresenta uma breve descrição dos principais comandos utilizados no Amazon
SES. A lista completa dos tipos de dados pode ser encontrada no Amazon Simple Email Service
API Reference, disponível no endereço http://s3.amazonaws.com/awsdocs/ses/latest/ses-api.pdf.
Comandos Descrição
Elimina um endereço de e-mail específico da lista de e-mails
deleteVerifiedEmailAddress
verificados
getSendQuota Recupera o limite atual de envio pelo usuário em questão
Recupera as estatísticas (de duas semanas) de envio do
getSendStatistics
usuário em questão
Retorna uma lista contendo todos os endereços de e-mail
listVerifiedEmailAddress
verificados
Compõe uma mensagem de e-mail baseada em dados de
sendEmail entrada e imediatamente enfileira a mensagem para posterior
envio
sendRawEmail Envia uma mensagem de e-mail com cabeçalho e conteúdo
19
A Figura 7 apresenta um exemplo de código Java que manipula a API do Amazon SES.
As linhas 8 a 11 apresentam a instanciação de um cliente do serviço através das credenciais do
usuário. A linha 13 verifica, através do método verifyEmailAddress (linhas 43 a 52), o
endereço de e-mail usado como remetente no e-mail que será enviado; essa verificação é exigida
pela infraestrutura AWS para se certificar que o usuário é realmente dono do endereço de e-mail
utilizado como remetente na mensagem. A linha 15 inicia a configuração da mensagem que será
enviada, informando qual o protocolo de transporte que deverá ser usado no envio da mensagem.
A linha 18 recupera uma sessão de acordo com as propriedades definidas, sessão essa usada
posteriormente para o envio da mensagem. Nas linhas 21 a 26 a mensagem a ser enviada é
configurada com o remetente, destinatário, assunto da mensagem e a mensagem em si. A linha 28
instância um objeto da classe Transport, que utiliza a sessão anteriormente recuperada, e que
envia a mensagem para o destinatário (linha 30). Por fim, a linha 32 fecha a sessão utilizada pelo
objeto da classe Transport. O método verifyE‐mailAddress é apresentado a partir da linha
43. Esse método recebe uma instância cliente do Amazon SES e o endereço de e-mail do
remetente da mensagem. Esse método primeiro recupera a lista de e-mails já verificados para esse
usuário (linha 45). Caso o e-mail passado com parâmetro esteja contido na lista de e-mails
verificados (linha 47), o método finaliza a execução e a mensagem poderá ser enviada. Caso o e-
mail ainda não tenha sido verificado, o processo de verificação do e-mail é iniciado (linha 50).
20
2.2 Eucalyptus
Eucalyptus, acrônimo de Elastic Utility Computing Architecture Linking Your Programs
To Useful Sytems (http://www.eucalyptus.com/), é um software open source para a
implementação de uma infraestrutura de nuvem IaaS (Infrastructure-as-a-Service). Seu principal
propósito é permitir a implantação de nuvens privadas em empresas, ou de nuvens híbridas, que
permitem a combinação de recursos privados locais com recursos disponibilizados em nuvens
públicas. Em especial, devido à sua compatibilidade com as APIs adotadas pela nuvem da
Amazon (AWS), o Eucalyptus permite a construção de nuvens híbridas compostas com recursos
21
disponibilizados por essa nuvem pública. O software Eucalyptus é distribuído livremente e pode
ser redistribuído ou modificado sob os termos da licença GNU General Public License, versão 3.
O Eucalyptus iniciou como um projeto do Laboratório MAYHEM do Computer Science
Department da University of California, Santa Barbara, EUA. Em 2009, a equipe desse projeto
criou uma empresa (Eucalyptus Systems Inc.) para comercializá-lo. Atualmente, existem duas
vertentes do software Eucalyptus: um projeto open source e o produto Eucalyptus EE (Enterprise
Edition), sua versão comercial. A versão comercial adiciona algumas facilidades não disponíveis
na versão open source, como o suporte ao hipervisor5 VMWare, a conversão de imagens de
máquina virtual VMware para o formato Eucalyptus ou Amazon e um adaptador que permite o
armazenamento de blocos de dados em uma rede SAN (Storage Area Network).
5
Também conhecido como VMM – virtual machine monitor, elemento que monitora e gerencia máquinas virtuais.
22
expõe uma interface compatível com os serviços AWS. Internamente, uma infraestrutura
Eucalyptus é composta por quatro componentes básicos de serviço, ilustrados na Figura 10 e
detalhados a seguir.
2.3 OpenStack
OpenStack (http://www.openstack.org/) é um projeto de desenvolvimento colaborativo de
uma plataforma open-source de serviços de nuvem. O objetivo do projeto é oferecer soluções
para a construção de diversos tipos de nuvens, públicas ou privadas, de pequena ou larga escala.
Essas soluções são disponibilizadas através de licença Apache 2.0 e podem ser livremente
utilizadas por provedores de serviços de nuvem, empresas, grupos de pesquisa ou qualquer outra
organização que necessite implantar uma infraestrutura de provisionamento e gerência de
24
seguintes formatos de imagens: raw, AMI, VHD (Hyper-V), VDI (VirtualBox), qcow2
(Qemu/KVM), VMDK (VMWare) e OVF (Open Virtualization Format). Entre os planos para o
futuro do serviço é prevista a possibilidade de conversão entre diferentes formatos de imagens de
máquinas virtuais.
A interação com o serviço OpenStack Compute pode ser feita de duas formas: através da
API nativa OpenStack e através da Amazon EC2 API, especificada pela Amazon para seu serviço
de computação virtual. O suporte à Amazon EC2 API permite a execução de aplicações nas duas
infraestruturas de nuvem, e também facilita a migração de aplicações da nuvem da Amazon para
uma nuvem baseada no OpenStack.
A API nativa OpenStack é oferecida como serviços HTTP REST, descritos no documento
OpenStack Compute Developer Guide, disponível no endereço
http://docs.openstack.org/api/openstack-compute/1.1/os-compute-devguide-1.1.pdf. Todas as
requisições HTTP ao OpenStack Compute devem incluir credenciais de autenticação, e
implementações específicas desse serviço podem prover suporte a diversos esquemas de
autenticação, como OAuth, Basic Auth e Token. Alguns desses esquemas podem requerer o uso
de SSL sobre HTTP (HTTPS).
As requisições e respostas das operações definidas pela API podem utilizar formatos
JSON ou XML. O formato de uma requisição é especificado no cabeçalho Content‐Type,
obrigatório para requisições que contenham um corpo (request body). O formato das respostas
pode ser especificado na requisição correspondente, através do cabeçalho Accept ou
adicionando-se uma extensão .xml ou .json à sua URI.
Quatro grupos de operações são oferecidos pela API: Server Actions, Flavors, Images e
Metadata. O grupo Server Actions contém operações para a criação e remoção de servidores
(instâncias), para obtenção dos detalhes de um servidor (imagem, flavor, metadados, endereço
IP), para a atualização dos atributos de um servidor (nome, metadados e endereço IP), para
comandar a reinicialização (reboot) e redimensionamento (resize) de um servidor, para a criação
de uma nova imagem a partir de uma determinada instância, e para obtenção da lista de
servidores disponíveis ao usuário. O grupo Flavors permite obter a lista de configurações
(flavors) disponíveis e os detalhes de uma configuração específica. O grupo Images permite obter
a lista de imagens disponíveis ao usuário e os detalhes de uma imagem específica, como nome,
datas de criação e modificação, requisitos de disco e memória, e também comandar a remoção de
uma imagem do sistema. Finalmente, o grupo Metadata permite listar e alterar os metadados
associados a um determinado servidor ou imagem.
A Figura 13 apresenta um exemplo de operação solicitada ao serviço OpenStack Compute
através de sua API nativa. Tal operação consiste na requisição para a criação de um novo servidor
28
(instância), com formato XML. Esse exemplo ilustra também a possibilidade de customização de
um servidor no momento de sua criação, através da injeção de arquivos de dados em seu sistema
de arquivos (personality files).
Para facilitar o acesso ao serviço OpenStack Compute foi especificada uma arquitetura
independente de plataforma e linguagem que serve como base para a construção de bindings da
API REST para diversas linguagens de programação de alto nível. Essa arquitetura é definida no
documento API Language Binding Guide (disponível no endereço
http://docs.rackspace.com/servers/api/v1.0/cs-bindguide-20090916.pdf) e consiste de um
conjunto de interfaces abstratas especificadas na linguagem IDL (Interface Description
Language), definida pelo OMG (Object Management Group). São especificados pelo OMG
mapeamentos de IDL para diversas linguagens de programação como Java, Ruby, Python, and
C++. Diversos bindings para a API do serviço OpenStack Compute baseados nesses
mapeamentos são disponíveis. Alguns desses bindings, disponibilizados como open source,
podem ser obtidos através do repositório público GitHub (https://github.com/rackspace/).
Operações wait bloqueiam o cliente até o final de uma operação CRUD pendente sobre a
entidade especificada; operações notify permitem o registro de uma função (ChangeListener) que
receberá uma notificação quando o estado da entidade especificada for alterado. Finalmente, as
operações do grupo Lists criam coleções de entidades de um determinado tipo, simplificando
futuras interações com o serviço para a monitoração de um grupo de entidades específico.
Figura 14. Definição da interface EntityManager para operação com o OpenStack Compute.
Figura 15. Operações envolvendo a interface EntityManager com binding para Java.
Três grupos de serviços são oferecidos pelo OpenStack Object Storage: (i)Storage
Account Services, (ii) Storage Container Services e (iii) Storage Object Services. As operações
do primeiro serviço permitem obter informações sobre os containers associados ao usuário. O
segundo grupo oferece operações para a criação e remoção de containers, para a obtenção dos
metadados de um container e para a obtenção da lista de objetos armazenados em um container
específico. O último grupo oferece operações para a recuperação dos dados (ou parte deles) de
um objeto, para a criação e atualização de um objeto (dados e metadados), para a cópia de objetos
(no mesmo container ou em outro container) e para a remoção de objetos.
A Figura 16 apresenta um exemplo de requisição para a obtenção da lista de objetos
armazenados em um container e a resposta obtida, em formato XML.
31
Figura 16. Exemplo de requisição e resposta em operação com o OpenStack Object Storage.
Além da API REST, uma série de bindings para diversas linguagens de programação
podem ser utilizados para simplificar a integração do acesso ao OpenStack Object Storage a
aplicações desenvolvidas nessas linguagens. Esses bindings proveem uma camada de abstração
sobre a API REST nativa, permitindo aos desenvolvedores das aplicações trabalhar com modelos
de containers e objetos ao invés de trabalhar diretamente com requisições e respostas HTTP.
Esses bindings são disponibilizados com licenças MIT a partir do repositório GitHub
(http://github.com/rackspace). São disponíveis atualmente bindings para PHP, Python, Java,
C#/.NET e Ruby.
A Figura 17 mostra a obtenção da lista de objetos armazenados em um container com o
uso do binding da API para a linguagem Java.
32
Figura 18. Exemplo de resposta JSON em operação com o OpenStack Image Service.
Além do acesso direto à API REST, um cliente do serviço OpenStack Image Service pode
utilizar uma classe Python distribuída em conjunto com o código desse serviço para acessar suas
operações. Assumindo que existe um servidor Glance executando no endereço
glance.example.com, na porta 9292, a mesma requisição descrita acima poderia ser feita com
base na classe cliente como mostrado na Figura 19.
O GAE é formado por três elementos principais: (i) ambiente de execução, (ii) datastore,
e (iii) serviços escalaveis. O primeiro deles, o ambiente de execução, determina o ciclo de
execução de uma aplicação implantada no GAE. Assim, quando o ambiente de execução recebe
uma requisição HTTP (HyperText Transfer Protocol), o primeiro passo é identificar a aplicação
alvo daquela requisição através do nome de domínio. De posse do nome da aplicação requisitada,
o ambiente de execução seleciona um servidor para atender tal requisição com base em dados de
uso de CPU, memória, etc. Depois de selecionar um servidor, a aplicação alvo é iniciada no
servidor escolhido e recebe a requisição HTTP encaminhada inicialmente. Finalmente, a
aplicação trata a requisição, retorna uma resposta para o cliente e é finalizada. Essa sequência de
passos faz com que uma aplicação implantada no GAE tenha seu tempo de existência limitado à
duração de um processamento de requisição. Este curto tempo de vida de uma aplicação faz com
que não seja possível manter estado entre requisições, o que permite distribuir o tráfego de
requisições entre vários servidores.
Como várias aplicações podem estar executando em um mesmo servidor, o ambiente de
execução utiliza o conceito de sandbox para restringir os recursos utilizados por cada aplicação.
O sandbox restringe a utilização dos seguintes recursos:
gravar no sistema de arquivos – as aplicações devem utilizar o armazenamento de
dados do GAE para armazenar dados persistentes;
abrir um socket ou acessar diretamente outro host;
35
Uma aplicação pode usar o serviço URL Fetch para emitir solicitações HTTP e HTTPS
(HyperText Transfer Protocol Secure) e receber respostas. Além disso, o serviço dispõe de
opções para personalizar requisições através da implementação de métodos da classe
FetchOptions como, por exemplo:
allowTruncate – permite o truncamento de respostas muito grandes;
doNotFollowRedirects – é chamado quando não se pretende permitir
redirecionamento de requisições;
validateCertificate, se a requisição for do tipo HTTPS, esta opção permite
que seja validado o certificado SSL da aplicação requisitada.
Uma aplicação do GAE pode enviar e receber mensagens instantâneas para qualquer
serviço de mensagens instantâneas compatível com XMPP (eXtensible Messaging and Presence
Protocol), como o Google Talk. Uma aplicação pode enviar e receber mensagens de bate-papo,
enviar convites de bate-papo e solicitar informações de status. Mensagens XMPP de entrada são
processadas por manipuladores de solicitação, semelhantes a solicitações da Web.
Alguns usos possíveis de mensagens instantâneas incluem participantes de bate-papo
automatizados (“bots de bate-papo”), notificações instantâneas e interfaces de bate-papo para
serviços. Um cliente avançado com uma conexão a um servidor XMPP (como o Google Talk)
pode usar XMPP para interagir com uma aplicação do GAE em tempo real, inclusive para
receber mensagens iniciado pela aplicação. É importante observar que esse tipo de cliente usando
o Google Talk deve usar a senha do usuário para fazer uma conexão XMPP e não pode usar um
cookie das contas do Google.
Atualmente, uma aplicação não pode participar de bate-papos de grupo e só pode receber
mensagens dos tipos “bate-papo” e “normal”, podendo enviar mensagens de qualquer tipo
definido na RFC 39216.
6
RFC 3921 – Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence –
http://www.ietf.org/rfc/rfc3921.txt
37
Engine SDK Java como um arquivo compactado na página de downloads do GAE, no endereço
http://code.google.com/appengine/downloads.html.
Aplicações Web Java para o GAE utilizam servlets Java, interface padrão para interagir
com o servidor de aplicações. Uma aplicação consiste em uma ou mais classes que estende uma
classe base servlet, e esses servlets são mapeados para URLs usando um arquivo de configuração
padrão chamado descritor de implantação. Quando o GAE recebe uma solicitação para uma
aplicação Java, ele determina qual classe de servlet utilizar baseado na URL e no descritor de
implantação; depois de localizar a classe, a mesma é instanciada, sendo invocado o método
apropriado do servlet.
Todos os arquivos para uma aplicação Java, incluindo as classes Java compiladas,
arquivos de configuração e arquivos estáticos, são organizados em uma estrutura de diretório
padrão WAR (Web application ARchive), de modo que tudo que tiver no diretório WAR fica
implantado no GAE. A Figura 21 mostra um exemplo de uma estrutura de um novo projeto Java
no Eclipse.
formulário e cookies, e o segundo servindo como resposta, enviada pelo GAE ao término da
execução desse método.
Para informar ao GAE para invocar este servlet para solicitações, é necessário um
descritor de implantação, o arquivo war/WEB‐INF/web.xml, que deverá ser editado semelhante
ao exemplo mostrado na Figura 23. Esse arquivo web.xml faz o mapeamento de todas as URLs
para ClockServlet.
O GAE ainda precisa de um arquivo de configuração adicional que não é parte do padrão
servlet, war/WEB‐INF/appengine‐web.xml, sendo atribuído a esse arquivo conteúdo
semelhante ao exemplo mostrado na Figura 24. Nesse exemplo, o arquivo de configuração
informa ao GAE que esta é a versão 1 de uma aplicação chamada clock. É possível também
utilizar esse arquivo de configuração para controlar outros comportamentos, tais como arquivos
estáticos e sessões.
39
O WAR para o aplicativo deve incluir vários JARs (Java ARchives) do Google App
Engine SDK, o Java EE implementation JARs e a App Engine API JAR, instalados pelo plug-in
Eclipse no WAR automaticamente. Se o plug-in Eclipse não estiver sendo utilizado, esses JARs
devem ser copiados manualmente dos subdiretórios lib/user/ e lib/shared/ para o diretório
war/WEB‐INF/lib/no projeto.
2.4.3.1 Memcache
Figura 25. Trecho de código Java para obtenção de identificador para implementação do cache.
40
Uma maneira simples de obter o conteúdo de uma página em um URL é criar um objeto
java.net.URL e, em seguida, chamar seu método openStream. Esse método lida com os
detalhes de criação da conexão, emissão de uma solicitação HTTP GET e recuperação dos dados
da resposta, como no trecho de código mostrado na Figura 26, no qual é feita uma requisição
básica. Na linha 8 é instanciado um objeto para guardar a URL, no caso a pagina padrão da
Google; logo após é aberta uma conexão para leitura de informações da pagina, conforme pode
ser observado na linha9, e, em seguida, a informação é exibida (no caso a própria pagina da
Google).
Para enviar uma mensagem de e-mail é chamada a API de serviço de e-mail, através da
interface javax.mail.JavaMail em Java. A mensagem de saída tem um endereço de remetente
(From), um ou mais destinatários (To, Cc, ou Bcc), um assunto (email_subject), o corpo da
mensagem (email_body) e arquivos anexados, se necessário. Para utilizar a interface
JavaMail, primeiro é criada uma sessão, que normalmente contém informações necessárias para
se conectar a um servidor de correio eletrônico; no entanto, no GAE, nenhuma configuração é
necessária. Assim, pode-se preparar a mensagem como um objeto MimeMessage e, em seguida,
enviá-la usando o método estático send da classe Transport, que utiliza a sessão recentemente
criada para enviar a mensagem.
Um exemplo de servlet para o envio de e-mails é mostrado na Figura 27. Como mostrado,
são chamados os métodos da classe MimeMessage, setFrom para especificar o remetente,
addRecipient para especificar o(s) destinatário(s), setSubject para especificar o assunto, e
setText para especificar o corpo da mensagem.
42
Figura 27. Exemplo de servlet para envio de e-mails utilizando o serviço de e-mail do GAE.
Uma vez que a aplicação é implantada no GAE, qualquer pessoa pode enviar um e-mail
para <someid>@<appid>.appspotmail.com, onde <someid> é qualquer identificador de
usuário e <appid> é o identificador da aplicação. No arquivo appengine‐web.xml é necessário
incluir os elementos
<inbound‐services>
<service>mail</service>
</inbound‐services>
para ativar o serviço de e-mail. Em Java, pode-se mapear o caminho de entrada de e-mail para um
servlet com uma entrada no descritor de implantação web.xml, como mostra a Figura 28.
43
Figura 28. Mapeamento de caminho de entrada de e-mail para Java servlet no arquivo web.xml.
Para enviar mensagens instantâneas, uma aplicação pode fornecer como corpo da
mensagem um texto simples que é exibido para o usuário ou pode fornecer um bloco XML
incluído nos dados XML de XMPP. O trecho de código mostrado na Figura 30 testa a
disponibilidade de um usuário e, em seguida, envia uma mensagem de bate-papo.
Figura 30. Trecho de código para envio de uma mensagem instantânea via GAE.
O GAE permite monitorar, em tempo real, o status das partes da aplicação, seja servidor
de e-mail, bando de dados, imagens, etc., o que pode ser feito a partir da API de capabilities
46
7
É importante frisar que as métricas tanto em segundos como em megaciclos consideram um processador com
configuração 1.2 GHz 64-bit x86.
47
Figura 33. Trecho de código com chamadas a métodos para mensurar o processamento requerido
por uma aplicação no GAE em um dado momento.
Já para medir o tempo de processamento de uma requisição a uma chamada à API, basta
substituir nas linhas 3 e 10, na Figura 33, o método getCpuTimeInMegacycles pelo
getApitimeInMegaCycles. Dessa forma, obtém-se o tempo de processamento gasto numa
requisição a uma API externa até aquele instante.
O GAE possui uma ferramenta, chamada appstats, que consegue resgatar essas métricas
através do uso de um servlet, ou seja, todas as requisições na aplicação em questão são filtradas
por ele e disponibilizadas automaticamente na página de estatísticas. Para dispor deste serviço,
primeiramente precisa-se mapear o servlet (já implementado) no arquivo web.xml de sua
aplicação, acrescentando o trecho XML mostrado na Figura 34. Na tag filter é descrito qual o
nome do filtro (atributo filter‐name) bem como a classe que ele se encontra, que por padrão
écom.google.appengine.tools.appstats.AppstatsFilter. Logo depois é indicado qual
o nome do filtro e sua URL padrão e também configurado o servlet que filtrará os eventos da
aplicação (tag servlet‐mapping) e definidas as regras de acesso (tag security‐
constraint).
Figura 34. Mapeamento da appstats do GAE para Java servlet no arquivo web.xml.
48
interagirem com as mesmas, através do Web role, e, em seguida, fazer com que as
tarefas a serem executadas sejam processadas pelo Worker role.
(iii) Virtual Machine (VM) – oferece máquinas virtuais em si, permitindo inclusive aos
usuários definirem configurações e atualizações de sistemas operacionais para as
mesmas; enquanto os Web e Worker roles são executados em máquinas virtuais, o
VM role é a própria máquina virtual que confere ao usuário controle total das
operações.
O SLA do SQL Azure Database garante disponibilidade mensal de 99,9%, de modo que
caso esse SLA não seja cumprido, também é fornecido ao cliente um crédito de 10% sobre o
valor de cobrança caso a porcentagem do tempo de atividade mensal seja inferior a 99,9% e de
25% caso seja inferior a 99%.
51
PutBlob e GetBlob
Deve ser concluído dentro do tempo resultante da
(incluindo blocos e páginas)
multiplicação de 2 segundos pelo número de megabytes
Obter intervalos de blob de página transferidos no processamento da solicitação
válidos
52
PutBlockList
O processamento deve ser concluído em até 60 segundos
GetBlockList
Consulta de tabela O processamento deve ser concluído ou retornar uma
Listar operações continuação em até 10 segundos
colocados na nuvem, como um esqueleto, que será preenchido com dados atuais, fornecendo uma
visão em tempo real da situação da empresa para gerentes e executivos.
2.6 Discussão
Este capítulo apresentou uma análise de cinco plataformas de computação em nuvem
disponíveis no mercado. Seus principais serviços foram listados e as suas características mais
relevantes foram levantadas. Adicionalmente, foram apresentados exemplos simples de utilização
de alguns de seus serviços. Cada plataforma possui aspectos positivos e negativos. Além disso,
cada uma delas provê uma gama de serviços diferentes, podendo oferecer IaaS, PaaS e SaaS.
A plataforma de nuvem da Amazon oferece uma ampla gama de serviços, AWS (Amazon
Web Services), englobando transversalmente serviços que vão desde IaaS a PaaS e SaaS. Seus
serviços, como computação (Amazon EC2), armazenamento (Amazon S3) e banco de dados
(Amazon SimpleDB e Amazon RDS) estão bem documentados, o que facilita sua utilização.
Além disso, há um pacote de ferramentas para o IDE Eclipse, o que possibilita o
desenvolvimento de aplicações de maneira rápida e com fácil acesso à documentação da API
Java. Adicionalmente, um conjunto de ferramentas também é oferecido para o Microsoft Visual
Studio.
A plataforma Eucalyptus é uma implementação open source dos principais serviços AWS
(EC2 e S3), e compartilha a API desses serviços. Este compartilhamento de APIs provê uma
grande integração entre as duas plataformas, possibilitando uma fácil migração de aplicações de
uma plataforma para a outra, e o uso das ferramentas de desenvolvimento disponíveis para AWS.
Além disso, a disponibilização sem custos dos recursos da nuvem Eucalyptus Community Cloud
(ECC) é uma facilidade interessante para testes de aplicações desenvolvidas para ambas as
plataformas. Os serviços da plataforma Eucalyptus são atualmente utilizados como núcleo de
nuvens privadas e híbridas de diversas organizações e empresas como Puma, Fujitsu e o
Departamento de Agricultura dos Estados Unidos. Contudo, apenas serviços básicos de
computação virtual e armazenamento são oferecidos.
57
caso do Google App Engine. Na escolha de uma plataforma de nuvem para execução de
aplicações ou provimento de serviços aos seus clientes, deve-se ponderar todas as características
citadas e também preço, disponibilidade, tolerância a falhas e conveniência dos serviços. A
Tabela 6 mostra um resumo das principais características das plataformas analisadas.
Google Windows
Serviços/ Amazon Web
Eucalyptus OpenStack App Azure
Plataformas Services
Engine Platform
Categorização IaaS, PaaS e IaaS, PaaS
IaaS IaaS PaaS
de serviços SaaS e SaaS
Azure
Processamento EC2 Cloud Controller Nova Não possui
Compute
Azure
Armazenamento Amazon S3 Walrus Swift Não possui
Storage
Amazon
Via serviço de Via serviço de Azure SQL
Banco de dados SimpleDB, Datastore
terceiros terceiros Database
Amazon RDS
Diversas
linguagens
Java, PHP,
(Java, Python,
Python, Ruby e Java, através do
C++, entre Java,
Suporte a .NET compartilhamento Java e
outras). API ASP .NET
linguagens (entretanto a da API Java do Python
compartilha a e PHP
API Java é a AWS
AWS API, além
mais completa)
de oferecer API
própria
Eclipse e
Eclipse e Ferramentas para Não possui
Integração com Microsoft
Microsoft AWS podem ser plug-in Eclipse
IDEs Visual
Visual Studio utilizadas específico
Studio
Possui uma
versão paga e
Uso comercial Pago uma versão Gratuito Pago Pago
gratuita (ECC)
porém limitada
59
3 Considerações finais
Este relatório apresentou cinco das plataformas de Computação em Nuvem atualmente
disponíveis na literatura, tendo-se discorrido acerca de suas principais características e serviços.
Para esses serviços, são apresentados exemplos de código-fonte, ilustrando assim o uso das APIs
dessas plataformas de Computação em Nuvem. Por fim, o relatório apresentou uma discussão
sobre aspectos positivos e negativos de cada uma dessas plataformas com o objetivo de se ter
subsídios para promover uma seleção dentre as mesmas para serem utilizadas no contexto do
Projeto AltoStratus.
Dentro do Projeto AltoStratus, a Equipe Técnica composta por pesquisadores da UFRN,
UFRJ e PUC-Rio é responsável pela Ação 2 – Especificação e Implementação de um Modelo de
Composição de Serviços Confiáveis para Ambiente de Computação em Nuvem. Para a execução
dessa ação, é necessário selecionar algumas plataformas de Computação em nuvem, de modo a
permitir a composição de serviços providos pelas mesmas. Desse modo, três das plataformas
descritas nesse relatório foram selecionadas:
(i) Amazon AWS – essa plataforma foi selecionada por oferecer uma ampla gama de
serviços, por oferecer um bom suporte ao desenvolvimento de aplicações em
nuvem através de sua API e infraestrutura de programação, através de plug-ins do
Eclipse, e ainda pelo fato de ser uma das plataformas pioneiras e mais difundidas.
(ii) Google App Engine – essa plataforma foi selecionada, pois além de oferecer um
bom suporte de desenvolvimento, provê serviços distintos (e talvez
complementares) aos serviços oferecidos pela plataforma AWS, cujo foco é em
serviços IaaS, enquanto o do Google App Engine é em serviços PaaS;
(iii) OpenStack – essa plataforma foi selecionada principalmente por ser open-source,
possibilitando maior flexibilidade de implementação e maior controle de
monitoramento dos serviços, uma vez que a plataforma será instalada em um
ambiente controlado do nosso laboratório. Além disso, uma plataforma open-
source possibilita o uso exaustivo da plataforma a um custo financeiro zero, o que
não acontece com as plataformas proprietárias. Embora existam outras opções de
plataformas OpenSource, como o Eucalyptus, o OpenStack vem obtendo
visibilidade e interesse crescentes, e foi escolhido recentemente para compor os
serviços de nuvem disponibilizados pelo Ubuntu, uma das principais distribuições
Linux.
Referências
Armbrust, Michael et al. (2009). Above the clouds: A Berkley view of Cloud Computing.
Technical Report – Reliable Adaptive Distributed Systems Laboratory, University of California
at Berkley, USA, 2009.
Buyya, Rajkumar; Yeo, Chee Sin; Venugopal, Srikumar (2008) Market-oriented Cloud
Computing: Vision, hype and reality for delivering IT services as computing utilities. In: HPCC
2008 – 10th IEEE International Conference on High Performance Computing and
Communications, 2008, Dalian, China. Proceedings of… Washington, D.C, USA: IEEE
Computer Society, pp.5–13.
Verma, Dinesh (1999) Supporting Service Level Agreements on IP networks [s.l., s.n.] Macmillan
Technical Publishing.
Wang, Lizhe; Von Laszewski, Gregor; Kunze, Marcel; Tao, Jie (2010) Cloud Computing: A
perspective study. New Generation Computing 28(2), pp.137–146.
Zhang, Qi; Cheng, Li; Boutaba, Raouf (2010) Cloud Computing: State-of-the-art and research
challenges. Journal of Internet Services and Applications 1(1), pp.7–18.