computação em nuvem com o google app engine

Propaganda
RODRIGO SOARES
COMPUTAÇÃO EM NUVEM COM O GOOGLE APP ENGINE
CANOAS, 2009
1
RODRIGO SOARES
COMPUTAÇÃO EM NUVEM COM O GOOGLE APP ENGINE
Trabalho de conclusão apresentado em
sessão de apresentação pública do curso
de Ciência da Computação do Centro
Universitário La Salle - Unilasalle, como
exigência parcial para a obtenção do grau
de Bacharel em Ciência da Computação.
Orientação: Prof. Me. Marcos Ennes Barreto
CANOAS, 2009
2
A
minha
namorada,
Clarissa,
maior
incentivadora, pelo que sou e realizo,
simplesmente.
3
AGRADECIMENTOS
Agradeço a todos que colaboraram de forma direta ou indireta para que este
trabalho pudesse ser concluído.
Obrigado a todos pela atenção, paciência e pelo tempo a mim dedicado.
4
RESUMO
A computação em nuvem pode ser considerada o estágio mais recente e evoluído
do conceito de virtualização. Seu modelo é orientado a serviços, podendo ser
dividido em: software como serviço, plataforma como serviço, infra-estrutura como
serviço e armazenamento como serviço. Computação em nuvem é uma evolução da
computação em grade e recebe esse nome principalmente por dois motivos:
primeiro, por estar no ambiente da internet, que traz a idéia de nuvem; segundo, por
ser transparente para o usuário final, sem deixar que ele perceba onde está cada
serviço, trazendo a imagem de nebulosidade. O estudo desses conceitos, bem como
os principais aspectos, oportunidades e obstáculos da computação em nuvem são
apresentados neste trabalho. Esta monografia estuda também os ambientes de
execução do Google App Engine – Python e Java – que estão localizados na
camada de plataforma como serviço, e provêem recursos para o desenvolvimento
na camada de software como serviço. Foi projetada e desenvolvida uma camada de
serviços, que está disponibilizada através de um portal, e conta com os seguintes
recursos: geração de código, submissão, monitoramento, tutoriais e controle de
projetos criados, em ambos os ambientes Python e Java. O portal foi avaliado
qualitativamente através de um questionário respondido por alunos da disciplina de
Sistemas Distribuídos do curso de Ciência da Computação do UNILASALLE.
Palavras-chave: Computação em nuvem. Sistemas distribuídos. Web services.
Google App Engine.
5
ABSTRACT
Cloud computing can be considered the most recent and evolved stage of
virtualization. Its model is service-oriented and can be divided into: software as a
service, platform as a service, infrastructure as a service and storage as a service.
Cloud computing is an evolution of grid computing and is named mainly for two
reasons: first, by being an Internet environment, which brings the idea of cloud and
second, due to its transparency to the user, hiding the services location and bringing
the image of cloud cover. The concepts, as well as the main aspects, opportunities
and challenges of cloud computing are presented in this work. The Google App
Engine execution environments for Python are also described, as they provide
resources for development in the software as a service layer. Within the scope of this
work, an access portal to the Google App Engine was developed and evaluated. The
portal provides services for code generation, application submission and monitoring,
as well as a general guide to use the GAE environment, both for Java and Python
languages. Evaluation was made by means of a questionnaire answered by students
of Distributed Systems course in the Computer Science undergraduate course of
UNILASALLE.
Key words: Cloud computing. Distributed systems. Web services. Google App
Engine.
6
LISTA DE FIGURAS
Figura 1 – Evolução da Computação em Nuvem. .....................................................12
Figura 2 – Usuários e provedores das camadas de Computação em Nuvem...........13
Figura 3 – Suporte de serviços executados na nuvem e localmente. .......................22
Figura 4 – Estrutura da Nuvem do Google. ...............................................................24
Figura 5 – Sintaxe da GQL........................................................................................26
Figura 6 – Ambiente de Execução Java....................................................................27
Figura 7 – Classe de dados Employee.java. .............................................................30
Figura 8 – Camada de Serviços para o Google App Engine. ....................................34
Figura 9 – Módulo de Login.......................................................................................35
Figura 10 – Código Python para o Google App Engine.............................................36
Figura 11 – Código Java para o Google App Engine. ...............................................36
Figura 12 – Criando um novo projeto web - Java......................................................37
Figura 13 – Erro de compilação. ...............................................................................38
Figura 14 – Status do processo de submissão..........................................................39
Figura 15 – Controle de projetos. ..............................................................................40
Figura 16 – Fluxograma do módulo gerador de código.............................................43
Figura 17 – Fluxograma do módulo de submissão....................................................44
LISTA DE QUADROS
Quadro 1 – Comparação de algumas plataformas para nuvem. ...............................14
Quadro 2 – Custos de recursos das nuvens Google e Microsoft. .............................21
Quadro 3 – Identificação do perfil dos entrevistados.................................................45
Quadro 4 – Identificação do nível de conhecimento específico dos entrevistados....45
Quadro 5 – Avaliação do portal. ................................................................................46
7
LISTA DE SIGLAS
AMI – Amazon Machine Image
API – Application Programming Interface
AWS – Amazon Web Services
CGI – Common Gateway Interface
DRY – Don't Repeat Yourself
dSaaS – data Storage as a Service
E/S – Entrada e Saída
EC2 – Elastic Compute Cloud
GAE – Google App Engine
GQL – Google Query Language
GWT – Google Web Toolkit
HTML – HyperText Markup Language
HTTP – Hypertext Transfer Protocol
IaaS – Infrastructure as a Service
JDO – Java Data Objects
JDOQL – Java Data Objects Query Language
JPA – Java Persistence API
JRE – Java Runtime Environment
JSON – JavaScript Object Notation
JSP – Java Server Pages
JVM – Java Virtual Machine
MVC – Model-View-Controller
ORM – Object-Relational Mapping
PaaS – Plataform as a Service
POJO – Plain Old Java Objects
QoS – Quality of Service
S3 – Simple Storage Service
SaaS – Software as a Service
SDK – Software Development Kit
SLA – Service Level Agreements
SSL – Secure Sockets Layer
8
URL – Uniform Resource Locator
VDC – Virtual Data Center
VLAN – Virtual Local Area Network
VM – Virtual Machine
VPN - Virtual Private Network
WSGI – Web Server Gateway Interface
XML – eXtensible Markup Language
9
SUMÁRIO
1
INTRODUÇÃO.............................................................................................10
1.1
Contexto .....................................................................................................10
1.2
Objetivos.....................................................................................................11
1.3
Estrutura do trabalho ................................................................................11
2
FUNDAMENTAÇÃO TEÓRICA...................................................................12
2.1
Computação em nuvem ............................................................................12
2.1.1
Principais aspectos da computação em nuvem ...........................................16
2.1.2
Oportunidades e obstáculos ........................................................................17
2.2
Ambientes...................................................................................................21
2.3
Google App Engine....................................................................................24
2.3.1
Google SDK .................................................................................................25
2.3.2
Funcionamento do Google App Engine .......................................................25
2.3.3
Ambiente do Google App Engine.................................................................26
2.3.4
Modelo de armazenamento .........................................................................28
2.3.4.1 Interfaces de dados em Java .......................................................................29
2.3.4.2 Entidades e propriedades ............................................................................31
2.3.4.3 Consultas e índices......................................................................................32
2.3.4.4 Transações e grupos de entidades..............................................................32
2.3.4.5 Cotas e limites .............................................................................................33
3
PORTAL DE SERVIÇOS.............................................................................34
3.1
Proposta / camada de serviços ................................................................34
3.2
Implementação e avaliação.......................................................................41
4
CONCLUSÃO..............................................................................................47
REFERÊNCIAS ...........................................................................................48
APÊNDICE A – Guia de utilização do Google App Engine .....................50
APÊNDICE B – Questionário Avaliação ...................................................64
10
1 INTRODUÇÃO
Computação em nuvem (cloud computing) é um novo conceito que chega ao
mercado. Segundo Buyya et al. (2008), é uma metáfora para a “nuvem” que forma a
internet. Basicamente, trata-se de um ambiente de computação formado por uma
grande rede de servidores, sejam eles virtuais ou físicos. As aplicações que residem
na nuvem são chamadas de cloud applications. Pode-se dizer que este é o estágio
mais evoluído do conceito de virtualização.
1.1 Contexto
Esta é uma área relativamente nova, que está no início de seu
desenvolvimento, mas que apresenta um grande potencial de crescimento, devido
ao contexto dos sistemas em que estamos inseridos atualmente.
No conceito de computação em nuvem, os recursos são disponibilizados
através de serviços pela internet, permitindo ao usuário o acesso a uma variada
gama de ferramentas, sem que esse tenha conhecimento da infra-estrutura que está
por trás do ambiente. Toda a tecnologia fica transparente para o usuário.
De acordo com Buyya et al. (2008), a nuvem é um sistema distribuído e
paralelo, constituído por uma coleção de computadores virtuais interconectados que
provêem um ou mais recursos computacionais, baseados em acordos de níveis de
serviços pré-estabelecidos através uma negociação entre o consumidor e o
prestador de serviços.
Para Delic e Walker (2009), a nuvem é um complexo de hardware, software,
dados e pessoas que provêem serviços on-line.
Pode-se traçar um paralelo entre o cenário atual da computação em nuvem e
o da computação em grade há anos atrás. Logo que o modelo de computação em
grade surgiu, diversas empresas partiram para as suas próprias implementações.
Com o tempo tornou-se visível que era importante definir padrões e permitir que
diversas plataformas pudessem interagir. Assim, ao passar de algum tempo, foram
desenvolvidos modelos e padrões, os quais foram aplicados em grande escala.
11
Acredita-se que o mesmo poderá acontecer no cenário da computação em
nuvem.
Atualmente,
existem
algumas
propostas
de
ambientes
para
o
desenvolvimento e/ou suporte de aplicações em nuvem, cada qual com suas
especificidades e com pouca ou nenhuma interação com outros ambientes.
1.2 Objetivos
Este trabalho tem por objetivo estudar os conceitos e modelos de
programação/execução que se aplicam à computação em nuvem, em especial o
ambiente Google App Engine, que provê suporte para o desenvolvimento,
publicação e acesso a aplicações Web que executam nos servidores da nuvem
Google.
Com base nesse estudo, foi percebida a necessidade de aprimoramento de
alguns serviços do ambiente disponibilizado pelo Google. Para suprir algumas
dessas necessidades, este trabalho define uma camada de virtualização de
serviços,
através
do
desenvolvimento
de
um
Portal
Web.
Os
serviços
disponibilizados pelo portal são: Geração de Código, Submissão e Monitoramento.
1.3 Estrutura do trabalho
O presente trabalho está dividido da seguinte forma: o Capítulo 2 apresenta
os principais conceitos sobre os assuntos envolvidos nesta monografia.
A proposta do trabalho é apresentada no Capítulo 3, abortando o modelo de
implementação, e as avaliações realizadas sobre o mesmo.
A conclusão do trabalho, bem como suas contribuições, limitações e trabalhos
futuros constam no Capítulo 4.
12
2 FUNDAMENTAÇÃO TEÓRICA
Este capítulo apresenta conceitos que possibilitarão um melhor entendimento
do trabalho desenvolvido.
2.1 Computação em nuvem
O modelo de computação em nuvem está orientado a diversos tipos de
serviço, os quais podem ser divididos em: Software como Serviço (SaaS – Software
as a Service), Plataforma como Serviço (PaaS – Plataform as a Service),
Infraestrutura como Serviço (IaaS – Infrastructure as a Service) e Armazenamento
como Serviço (dSaaS – data Storage as a Service).
Figura 1 – Evolução da Computação em Nuvem.
Fonte: Autoria Própria, 2009.
Na base da figura 1 estão os conceitos que deram origem à computação em
nuvem. São eles: clusters, super computadores, computação em grade e
computação como utilitário. O topo da figura 1 ilustra as camadas de serviços
providas pela nuvem.
13
A primeira camada da figura 1 ilustra o surgimento de computadores com alto
poder de processamento, juntamente com os clusters, que são um conjunto de
computadores que trabalham com o conceito de computação distribuída.
A segunda camada da figura 1, chamada de Computação em Grade, foi à
responsável por construir um modelo de divisão de tarefas entre inúmeras
máquinas, gerando uma alta taxa de processamento.
A última camada em verde da figura 1, Computação como Utilitário, é uma
das principais responsáveis pelo surgimento do conceito de computação em nuvem.
Nessa camada já se pensava em tratar computação e processamento como um
serviço, ou seja, vendido como um utilitário.
O estágio mais evoluído da virtualização dos sistemas distribuídos é a
computação em nuvem, observada na primeira camada em azul da figura 1. Sua
base em computação como utilitário levou a criação de subcamadas de serviço,
exibida na última camada da figura 1.
Figura 2 – Usuários e provedores das camadas de Computação em Nuvem.
Fonte: Traduzido de Armbrust et al., 2009.
Segundo Armbrust et al. (2009), quando uma nuvem é disponibilizada na
forma de “pague o que você usar” (pay-as-you-go), essa nuvem é chamada de
Nuvem Pública (Public Cloud); ou seja, o serviço de computação/processamento
está sendo vendido como utilitário (Utility Computing). A figura 2 ilustra esse
conceito. Um fornecedor de nuvem vende seus serviços de processamento para um
fornecedor de software como serviço, que finalmente os repassa ao usuário final.
Como exemplo desses serviços podem ser citados o AmazonWeb, o Google
App Engine e o Microsoft Azure. Para datacenters internos de uma empresa, ou que
14
não são disponibilizados ao público, Armbrust et al. (2009) utiliza o termo Nuvem
Privada (Private Cloud). Assim, em linhas gerais, Computação em Nuvem é a junção
de SaaS e Utility Computing.
Um bom exemplo de funcionamento de uma nuvem é o serviço gratuito
Google Docs. Ele mantém os dados armazenados em seus datacenters e os
usuários dos serviços apenas acessam via web, de qualquer lugar a qualquer hora,
por meio de um navegador. O quadro 1 apresenta um comparativo de características
entre diversos sistemas voltados para computação em nuvem.
Sistema
Amazon
Google
Microsoft
Sun
GRIDS Lab
Característica
Elastic Compute
Cloud (EC2)
App
Engine
Live Mesh
Network.com
(Sun Grid)
Aneka
Foco
Infra-estrutura
Infra-estrutura
Plataforma
Tipo de serviços
Armazenamento, Aplicação
Computação
Web
Plataforma Infra-estrutura
Armazenamento Computação
Computação
Baseado em
SLA
Reserva de
recursos
Negociação
dinâmica de
parâmetros de
QoS
Nenhuma
Nenhuma
Nenhuma
Nenhuma
Interface de
acesso para o
usuário
Linha de
comando
Controle
via portal
Web
Qualquer
dispositivo com
Live Mesh
Execução de
Controle via
scripts e portal
portal Web
Web
API Web
Sim
Sim
Desconhecido
Sim
Sim
Valor agregado
de provedores de Sim
serviço
Não
Não
Sim
Não
Python
Não aplicável
Solaris OS,
Java, C, C++,
FORTRAN
API de suporte
em C# e .Net
Framework de
programação
Baseado em
imagens de
máquinas
Quadro 1 – Comparação de algumas plataformas para nuvem.
Fonte: Buyya et al., 2008.
O Amazon Elastic Compute Cloud (EC2) fornece um ambiente de
computação virtual que permite ao usuário executar aplicações baseadas em Linux.
O usuário pode criar uma Amazon Machine Image (AMI), contendo os aplicativos,
bibliotecas, dados e configurações desejadas, ou selecionar de uma biblioteca AMI
já existente. Para armazenar essas informações, a Amazon oferece um serviço
chamado de Amazon Simple Storage Service (S3).
15
O Google App Engine permite ao usuário desenvolver e executar aplicações
Web através de duas linguagens de programação: Python1 e Java2. No capítulo 3
será explicado de forma detalhada o funcionamento dessa ferramenta, por ser um
dos focos desse trabalho. Atualmente o Google App Engine é livre para uso de até
500MB de armazenamento, e até 5 milhões de visualizações de páginas por mês.
O Microsoft Live Mesh3 tem como objetivo prover um local centralizado para
que o usuário armazene dados e aplicativos que podem ser acessados através de
computadores e telefones móveis em qualquer lugar do mundo. Todos os usuários
do Live Mesh são protegidos por senha e autenticados através do seu Windows Live
Login, enquanto todas as transferências de arquivos são protegidas por Secure
Socket Layer (SSL). Para acessar as aplicações e dados enviados para o servidor, é
disponibilizado um portal Web.
O Sun Grid permite ao usuário executar aplicações baseadas em Solaris,
Java, C, C++ e Fortran. Primeiro o usuário precisa criar e depurar suas aplicações e
scripts em tempo de execução em um ambiente de desenvolvimento local
configurado para ser semelhante ao Sun Grid. Então, ele precisa criar um pacote
(que contém todos os scripts relacionados, bibliotecas, binários executáveis e dados
de entrada) e enviá-lo para o Sun Grid. Finalmente, ele pode executar e acompanhar
a aplicação usando o portal Web da Sun Grid.
O GRIDS Lab Aneka4 (Aneka NextGen Enterprise Grid) é uma solução
baseada em serviços .NET para construção de grades empresariais. É modelado
para suportar múltiplos modelos de aplicação, persistência e soluções de segurança.
Isso permite maior flexibilidade na hora de alguma troca, porque não impacta no
sistema como um todo. A grade é montada com a utilização dos computadores dos
usuários sem interferir nas suas atividades e a configuração se dá através um ponto
único, onde é possível a inicialização dos serviços.
1 (http://www.python.org/)
2 (http://www.java.com/pt_BR/)
3 (https://www.mesh.com/)
4 (http://www.gridbus.org/intro.html)
16
2.1.1 Principais aspectos da computação em nuvem
A nuvem pode oferecer os mais variados tipos de recursos de Tecnologia da
Informação, dos diversos níveis de computação, aplicativos, além de proporcionar o
armazenamento de arquivos nos mais diferentes formatos. Fazem parte da nuvem
empresas desenvolvedoras de softwares, fabricantes de hardware, datacenters,
prestadoras de serviços sob demanda, entre outros.
Do ponto de vista de hardware, a computação em nuvem apresenta três
novos aspectos (Armbrust et al., 2009):
a) Elimina a necessidade de um planejamento para médio e longo prazo de
expansão dos recursos de hardware. Com a computação em nuvens os
recursos são “infinitos”, porque podem ser comprados sob demanda;
b) As empresas podem começar utilizando poucos recursos de hardware, e
irem aumentando gradativamente quando há um aumento das demandas;
c) Redução de custos. Os recursos podem ser pagos por hora de utilização,
por armazenamento, por processamento ou até por dia. Todas essas
características deixam o processo muito flexível, permitindo que os
recursos deixem de ser utilizados quando não houver mais a necessidade.
Como não foram feitos investimentos em compra de hardware, apenas
deixa-se de utilizar o serviço.
Um dos grandes fatores que potencializaram a computação em nuvem,
segundo Armbrust et al. (2009), foram as operações em grande escala dos
datacenters. Com essa nova maneira de se pensar em hardware e software, os
custos de eletricidade, redes, operação, entre outros, são bastante reduzidos.
Quando se traçou um comparativo entre os serviços dos datacenters e a
computação em nuvem, verificou-se que o modelo da nuvem poderia oferecer
serviços abaixo do custo de um datacenter de tamanho médio e ainda assim ter um
bom lucro.
Embora os custos de hardware continuem diminuindo, a construção de um
datacenter é muito caro. Poder abrir mão desse investimento, transferindo os
recursos para a nuvem pode ser um bom negócio. Como a nuvem é elástica, pagase somente pelo que se usa. Quando se investe em um datacenter precisa-se
pensar nos níveis de pico, e adequar a estrutura para que suporte esses picos. Mas,
17
em momentos de baixo processamento, a ociosidade das máquinas acaba sendo
onerosa.
Transferindo o processamento para a nuvem, o risco é transferido para o
fornecedor.
Controlar
a
subutilização
(underprovisioning)
e
saturação
(overprovisioning) passa a ser de responsabilidade de quem está vendendo o
serviço.
2.1.2 Oportunidades e obstáculos
Em seu relatório técnico, Armbrust et al. (2009) definem de forma bastante
adequada diversas oportunidades e obstáculos para computação em nuvem. Logo
abaixo elas serão comentadas.
Disponibilidade dos Serviços
Como o acesso à nuvem se dá através da Internet, um fator que está gerando
muita preocupação para empresas aderirem à nuvem é a disponibilidade dos
serviços. Ironicamente, os produtos SaaS existentes atualmente tem fixado um alto
padrão neste quesito. Talvez o maior exemplo, citado por Armbrust et al. (2009) seja
o Google Search. Se um usuário acessa a pesquisa do Google e esta não está
disponível, imagina-se que o problema não está na pesquisa do Google, mas sim
em sua conexão com a internet. Ou seja, o Google se tornou referência de
disponibilidade. Para a computação em nuvem essa mesma disponibilidade é
esperada, o que não é tarefa simples.
Dados Presos
Como as soluções de nuvens são, em sua grande maioria, proprietárias, os
usuários ficam presos à nuvem em que estão. Retirar os dados e programas de uma
nuvem para transportá-los para outra não é simples.
Uma solução apontada por Armbrust et al. (2009) é a criação de uma API
padronizada para que desenvolvedores de SaaS pudessem criar serviços e dados
únicos para diversas nuvens. Em um primeiro momento, esse tipo de solução pode
18
gerar o medo de que o lucro da nuvem se esvaia, mas Armbrust et al. (2009) dão
dois argumentos para afastar essa preocupação.
Em primeiro lugar, os clientes nem sempre buscam a solução mais barata. A
qualidade dos serviços é um ponto muito importante nessa avaliação. Alguns
fornecedores de serviços para Internet hoje oferecem um custo dez vezes maior que
outros porque são mais confiáveis e oferecem serviços extras para melhorar a
usabilidade.
Em segundo lugar, o modelo de uma API padronizada poderia permitir a
utilização dos mesmos softwares tanto em uma nuvem pública, quanto em uma
nuvem privada. Dessa forma, o compartilhamento dos dados ficaria mais simples,
permitindo a utilização da nuvem pública para funções adicionais que não podem ser
tratadas na nuvem privada, devido à pesada carga de processamento temporário.
Confidencialidade e Auditabilidade dos Dados
A confidencialidade dos dados na nuvem é outro fator preocupante. Mas,
Armbrust et al. (2009) afirmam em seu relatório técnico que acreditam não haver
obstáculos fundamentais para fazer um ambiente de computação em nuvem tão
seguro quanto a maioria dos ambientes de rede internos das empresas. Afirmam
também que muitos dos obstáculos podem ser superados com a adoção de
tecnologias de armazenamento codificado, VLANs (Virtual Local Area Networks) e
filtros de rede, como firewalls e filtros de pacotes. Por exemplo, criptografando os
dados antes de colocá-los nas nuvens pode ser mais seguro do que dados não
criptografados em uma rede de dados local.
Para a auditabilidade dos dados, sugerem a criação de uma camada adicional
na nuvem, fora do alcance do sistema operacional que está fazendo a virtualização.
Isso proporciona uma maior segurança do que deixar a responsabilidade da
fiscalização em uma única camada lógica.
Gargalo da Transferência de Dados
Os dados de uma nuvem podem não raro ultrapassar os terabytes. E, quando
esses dados precisam ser recuperados para fora da fronteira da nuvem, podem se
tornar um problema. Os usuários da nuvem, bem como os fornecedores, precisam
se preocupar com as implicações da localização e do tráfego em todos os níveis do
sistema, de forma a minimizar os custos. Uma possibilidade para contornar esse
19
problema é a de encontrar mecanismos que tornem atraente para o usuário manter
os dados na nuvem. Mecanismos esses que podem ser serviços adicionais para o
usuário, de forma que ele possa manipular seus dados diretamente na nuvem, sem
necessidade de fazer download dos mesmos.
Imprevisibilidade do Desempenho
De acordo com experiências realizadas por Armbrust et al. (2009), várias
máquinas
virtuais
podem
compartilhar
processadores
e
memórias
surpreendentemente bem em um ambiente de computação em nuvem, mas o
processo de entrada e saída (E/S) compartilhado é mais problemático. Uma
possibilidade de contornar esse problema é trabalhando na melhoria das
arquiteturas dos sistemas operacionais de forma a melhorar a eficiência da E/S na
virtualização. Tecnologias como PCIexpress são difíceis de virtualizar, mas são
cruciais para a nuvem. Outra alternativa apontada por Armbrust et al. (2009) é de
que a memória flash vai diminuir a interferência de E/S. Memórias flash podem
suportar muito mais gigabytes de E/S por segundo do que discos rígidos.
Armazenamento Escalonável
Uma das características da computação em nuvem é permitir “infinito”
armazenamento de dados sob demanda. Esse armazenando escalonável e sob
demanda é complicado de ser tratado. Uma opção para resolver esse problema é
criar um sistema de armazenamento capaz de suprir essas necessidades, e
combiná-lo com as vantagens de aumentar e reduzir os espaços de armazenamento
conforme a demanda.
Erros em sistemas distribuídos de grande escala
Um dos desafios da computação em nuvem é eliminar os erros em grande
escala desses sistemas distribuídos. Um problema comum é que esses erros não
podem ser reproduzidos em pequenas configurações, de modo que a depuração
deve ocorrer na escala de datacenters. (Armbrust et al., 2009).
Rápida escalabilidade ou elasticidade
Essa nova forma de trabalhar com computação traz consigo muito forte a
idéia de “pague o que for usar” ou, no termo original em inglês, pay-as-you-go. Um
20
exemplo é o que o Google faz com o seu App Engine. Conforme a carga aumenta e
diminui, são calculados os ciclos e o usuário é cobrado pelo que utilizou. Já o AWS
(Amazon Web Services) faz a sua taxação por hora, mesmo que a máquina esteja
ociosa.
O desafio então é escalar automaticamente para cima ou para baixo,
respondendo à carga que está sendo recebida, de forma a reduzir os custos, mas
sempre cuidando para não violar os SLAs (Service Level Agreement. Significa
Acordo de Nível de Serviço).
Responsabilidade Legal
Um cliente que faça uma má utilização dos serviços da nuvem pode
comprometê-la como um todo. Armbrust et al. (2009) nos dão o seguinte exemplo.
Uma má utilização do domínio da EC2 (Elastic Compute Cloud, da Amazon) acaba
por colocá-lo em uma lista negra de spams. Isso poderá impactar no trabalho de
outros clientes. Uma possibilidade seria a de criar uma reputação semelhante ao “email confiável”. A questão legal envolvida é de quem é a responsabilidade. Seria da
empresa que enviou o spam, ou da Amazon? Os prestadores de serviço de
computação em nuvem tentam deixar toda responsabilidade legal junto ao cliente.
Licenciamento do Software
Atualmente, as licenças de software são destinadas para os computadores no
qual serão executados. É comum os usuários pagarem pelo software, e uma taxa de
manutenção. Inicialmente muitos fornecedores de computação em nuvem partiram
para software aberto (open source), porque o modelo de licenciamento de software
comercial não os favorece.
As empresas estão tendo que alterar esse modelo de licenciamento. Um
exemplo já pode ser verificado com a Microsoft e a Amazon. A Microsoft está
oferecendo o Windows Server e o Windows SQL Server para o EC2 na forma de
pay-as-you-go. Ou seja, está cobrando por hora de utilização dos softwares.
21
O quadro 2 ilustra os preços praticados pelo Google e pela Microsoft
atualmente. Pode ser observado que cada recurso da nuvem é cobrado
separadamente. Os valores exibidos no quadro foram obtidos em outubro de 2009.
Recurso
Largura de banda de saída
Unidade
Google App
Engine
Windows Azure
Platform
Custo Unitário
Custo Unitário
Gigabyte
$0,12
$0,15
Largura de banda de entrada Gigabyte
$0,10
$0,10
Tempo de CPU
Horas CPU
$0,10
$0,12
Dados armazenados
Gigabytes por mês
$0,15
$0,15
Destinatários de e-mail
Destinatários
$0,0001
$0,00
Quadro 2 – Custos de recursos das nuvens Google e Microsoft.
Fonte: Autoria Própria, 2009.
2.2 Ambientes
Este trabalho está concentrado na camada de Plataforma como Serviço (ou
PaaS) da computação em nuvem. Existem diversos modelos existentes para essa
categoria. Dentre eles se destacam o Windows Azure Platform, o Sun Cloud API e o
Google App Engine.
Windows Azure Platform
O Windows Azure Platform é uma solução desenvolvida pela Microsoft,
voltada para criação, implantação e gerenciamento de aplicações e serviços web
distribuídos. Em outras palavras, é uma plataforma para executar aplicativos
Windows e armazenar os dados na nuvem da Microsoft.
O Azure suporta um grande conjunto de serviços para o desenvolvimento de
aplicações para a nuvem. Uma grande vantagem é que a sua plataforma de serviços
pode ser utilizada por aplicativos que estão sendo executados na nuvem, como
também aplicativos executados localmente.
A Plataforma de Serviços Azure é um grupo de tecnologias da nuvem, que
fornece um conjunto específico de serviços para desenvolvedores de aplicativos.
Como a figura 3 mostra, a Plataforma de Serviços Azure pode ser usada tanto por
22
aplicativos em execução na nuvem quanto por aqueles executados em sistemas
locais.
Figura 3 – Suporte de serviços executados na nuvem e localmente.
Fonte: CHAPPELL, 2008.
A plataforma de serviços do Azure inclui diversos componentes. São eles:
a) Windows Azure:
- Ambiente baseado no Windows. Executa aplicativos e armazena dados
nos servidores da Microsoft;
b) Microsoft .NET Services:
- Serviços de infra-estrutura distribuída, baseado em aplicativos para
nuvem;
c) Microsoft SQL Services:
- Serviços de dados para nuvem. Baseado no SQL Server;
d) Live Services:
- Integração com os aplicativos Live da Microsoft. Funciona através do
Live Framework.
Sun Cloud API
A API para computação em nuvem da Sun é responsável por criar e gerenciar
recursos na nuvem, incluindo processamento, armazenamento e componentes de
rede. O uso da API é realizado através do protocolo HTTP. A grande maioria das
tarefas pode ser realizada com GET e POST.
23
Esta API possui as seguintes características:
a) Modelos de recursos que descrevem as estruturas de dados em notações
de objetos JavaScript (JSON - JavaScript Object Notation);
b) As requisições são feitas através de pedido e resposta. O pedido é
enviado para a nuvem, processado, e devolvido para o usuário.
A nuvem da Sun possui os seguintes componentes (SUN, 2009):
a) Cloud: Pode ser considerado o ambiente de mais alto nível da nuvem. É
onde os usuários irão interagir com a API;
b) Virtual Data Center (VDC): É um módulo isolado, populado por Clusters,
Virtual Private Networks (VPNs), endereços públicos e volumes de
armazenamento;
c) Cluster: É um agrupamento de máquinas virtuais. Bastante útil para
controle de acesso, isolamento geográfico, e automatização de scripts;
d) Virtual Machine (VM): Um servidor;
e) Virtual Private Network (VNet): Uma sub-rede, não conectado à Internet,
que pode ser utilizado para conectar máquinas virtuais dentro de um VDC
(Virtual Data Center);
f) Endereço Público: Conexão com Internet;
g) Volume de armazenamento: Recurso de armazenamento que pode ser
acessado através do WebDAV e protocolos de armazenamento.
Google App Engine
Para o desenvolvimento deste trabalho foi escolhido o Google App Engine.
Por possuir uma poderosa plataforma de desenvolvimento, com disponibilidade para
execução dos aplicativos diretamente na nuvem, de forma gratuita, as simulações
propostas nesta monografia puderam ser realizadas em cenário real. Na próxima
seção será detalhado o funcionamento do ambiente do Google App Engine.
24
2.3 Google App Engine
O Google App Engine é um ambiente que permite a criação de aplicativos
para Web. Possibilita a publicação dessas aplicações em uma nuvem própria do
Google. O ambiente de desenvolvimento do software (SDK) do Google App Engine
permite desenvolver e enviar aplicativos para nuvem. A estrutura da nuvem do
Google está ilustrada na figura 4.
Para auxiliar o desenvolvimento é disponibilizado o Google Web Toolkit
(GWT). O GWT é um conjunto de ferramentas específico para desenvolvimento web,
que facilita algumas tarefas que o desenvolvedor normalmente precisa executar.
A figura 4 ilustra também a divisão dos ambientes de execução em Python e
Java, cada qual com uma forma específica de armazenamento de dados.
Por fim, a figura 4 mostra que o ambiente possui também alguns serviços de
apoio.
Figura 4 – Estrutura da Nuvem do Google.
Fonte: Autoria Própria, 2009.
25
2.3.1 Google SDK
O SDK inclui um aplicativo de servidor da web que simula o ambiente do
Google App Engine, incluindo uma versão local do armazenamento de dados,
contas do Google e a capacidade de obter URLs e enviar e-mails diretamente do
seu computador, usando as APIs do Google App Engine. O SDK é executado em
qualquer computador com Python 2.5, e há versões disponíveis para Windows, Mac
OS X e Linux (Google, 2009). O SDK também possui suporte a Java, através de um
plug-in de desenvolvimento para o Eclipse.
O App Engine Java SDK, em conjunto com o Google Plugin para o Eclipse,
possui uma ferramenta para execução de testes locais da aplicação, sem a
necessidade de possuir um servidor Web, nem de submeter o projeto para a nuvem.
Possui também uma ferramenta para fazer a submissão do projeto para a nuvem
Google, através de uma funcionalidade chamada Deploy.
2.3.2 Funcionamento do Google App Engine
Os aplicativos do Google App Engine comunicam-se com o servidor da web
usando o padrão CGI. Quando o servidor recebe uma solicitação para seu aplicativo,
ele executa o aplicativo com os dados solicitados nas variáveis do ambiente e no
fluxo de entrada padrão (para dados POST). Para responder, o aplicativo grava a
resposta no fluxo de saída padrão, incluindo cabeçalhos e conteúdo HTTP.
O Google App Engine suporta qualquer estrutura programada em Python puro
que se comunique com CGI (e qualquer outra estrutura compatível com WSGI
usando um adaptador CGI), incluindo Django, CherryPy, Pylons e web.py.
Pode ser integrado na ferramenta o Django. Django é um framework para
desenvolvimento rápido para web, escrito em Python, que utiliza o padrão MVC
(model-view-controller). O Django utiliza o princípio DRY (Don't Repeat Yourself), no
qual faz com que o desenvolvedor aproveite ao máximo o código já feito, evitando a
repetição. Com o ORM do Django você define a modelagem de dados através de
classes em Python.
26
Armazenar dados em um aplicativo da web escalável pode ser complicado.
Um usuário pode estar interagindo com muitos servidores da web em um dado
momento, e a próxima solicitação do usuário pode ser para um servidor da web
diferente do servidor que tratou a solicitação anterior. Todos os servidores da web
precisam interagir com dados que também estão distribuídos em dezenas de
máquinas, possivelmente em diferentes locais ao redor do mundo (Google, 2009).
Com o Google App Engine essa preocupação deixa de existir. A infra-estrutura do
engine cuida de toda a distribuição, replicação e balanceamento de carga de dados
por trás de uma API.
O armazenamento de dados do Google App Engine possui um mecanismo de
consulta sofisticado para modelos de dados. Como o armazenamento de dados do
Google App Engine não é um banco de dados relacional tradicional, as consultas
não são especificadas usando SQL. Em vez disso, utiliza-se uma linguagem que o
Google chama de GQL. A GQL usa uma sintaxe familiar para fornecer acesso aos
recursos do mecanismo de consultas do armazenamento de dados do Google App
Engine. A figura 5 ilustra um exemplo de sintaxe da GQL.
Figura 5 – Sintaxe da GQL.
Fonte: Google, 2009.
O envio do aplicativo para a nuvem Google é feito através da execução de
uma simples linha de comando. É necessário possuir uma conta padrão Google.
2.3.3 Ambiente do Google App Engine
O Google App Engine suporta aplicações desenvolvidas em diversas
linguagens de programação. O Engine possui dois ambientes de execução. O
27
primeiro apresenta um ambiente de execução em Python dedicado, incluindo um
interpretador Python e a biblioteca padrão do Python. O segundo ambiente de
execução utiliza tecnologias padrão Java. O ambiente inclui a Java Virtual Machine
(JVM), servlets Java e a linguagem de programação Java. Pode ser utilizada
também qualquer outra linguagem que usa um interpretador ou compilador com
base na JVM, como o Ruby5, por exemplo. A figura 6 ilustra de forma detalhada o
ambiente de execução do Google App Engine para Java.
Figura 6 – Ambiente de Execução Java.
Fonte: Autoria Própria, 2009.
Esses ambientes foram escolhidos por possibilitarem que o aplicativo seja
executado rapidamente, com segurança e sem interferência de outros aplicativos no
sistema que, em um ambiente de nuvem, é indispensável.
O Google App Engine inclui os seguintes recursos (GOOGLE, 2009):
a) Serviço de web dinâmico, com suporte completo a tecnologias de web
comuns.
b) Armazenamento persistente com consultas, classificação e transações.
c) Ajuste e balanceamento de carga automáticos.
d) APIs para autenticação de usuários e envio de e-mails usando contas do
Google.
5 (http://rubyonrails.org/)
28
e) Um ambiente de desenvolvimento local com todos os recursos, simulando
o Google App Engine em seu computador.
f) Tarefas programadas para disparar eventos em horários específicos e em
intervalos regulares.
O ambiente Java está atualmente utilizando a versão 6 do Java. O SDK para
Java do Google App Engine suporta o desenvolvimento de aplicativos em Java 5 ou
6. O ambiente inclui a plataforma Java SE Runtime Environment6 (JRE 6) e as suas
bibliotecas.
É possível acessar a maioria dos serviços do Google App Engine utilizando as
APIs em Java padrão. Para o armazenamento dos dados, o SDK para Java inclui
uma implementação da interface Java Data Objects (JDO) e Java Persistence API
(JPA). Para o envio de mensagens de correio eletrônico (e-mail), pode ser utilizada a
API JavaMail.
2.3.4 Modelo de armazenamento
O armazenamento dos dados é feito através de um mecanismo de consultas
e transações atômicas.
O Google App Engine fornece um armazenamento robusto e dimensionável.
O foco no desenvolvimento é sempre com relação ao desempenho das
leituras/consultas. São armazenadas entidades de dados com propriedades,
organizadas de acordo com tipos definidos por aplicação. Todas consultas são
sempre pré-indexadas, visando resultados mais rápidos, tendo em conta que o
conjunto de dados pode ser muito grande. O modelo de armazenamento suporta
atualizações transacionais, usando agrupamentos de entidade definidos pelo
aplicativo como a unidade de transação na rede de dados distribuída.
Apesar do modelo de armazenamento de dados do Google App Engine não
ser relacional, ele é bastante consistente. Mesmo tendo diversos pontos em comum
com os bancos de dados relacionais, suas características individuais foram
6 (http://java.sun.com/)
29
projetadas para obter um ganho significativo na capacidade de dimensionar
automaticamente seu espaço.
O que promove esse ganho do Google App Engine em relação aos bancos de
dados tradicionais é a utilização de uma arquitetura distribuída para gerenciar o
dimensionamento para conjuntos de dados muito grandes. É possível definir
relacionamentos entre os objetos de dados, através de um processo de otimização
feito pela própria aplicação.
As consultas são executadas sobre objetos de dados, conhecidos como
entidades. A entidade pode ter uma ou mais propriedades. Uma propriedade pode,
inclusive, ser uma referência a outra entidade. Cada entidade possui um
identificador único, que pode ser chamado de chave. Essa chave é composta por um
tipo e um identificador numérico exclusivo, que é fornecido pelo armazenamento de
dados. Outra alternativa para o identificador é montá-lo a partir de uma string
fornecida pelo aplicativo.
A preocupação com a economia de memória e tempo de execução é
constante. Dessa forma, algumas consultas podem limitar o número de resultados
que
são
retornados
pelo
armazenamento
de
dados.
As
entidades
do
armazenamento de dados são obtidas pelo aplicativo através da sua chave, ou
ainda através de uma consulta às propriedades dessa entidade. Essa consulta pode
retornar zero ou mais entidades. Os resultados são classificados por valores de
propriedade.
Importante destacar também que o armazenamento de dados suporta
diversas operações em uma única transação. Em caso de falha em uma das
operações, é possível reverter toda a transação. Em um ambiente web distribuído,
onde é comum usuários manipularem o mesmo dado ao mesmo tempo, este tipo de
tratamento é imprescindível.
2.3.4.1 Interfaces de dados em Java
O JDO utiliza objetos Java denominados Plain Old Java Objects (POJO) para
descrever como as instâncias da classe são armazenadas como entidades no banco
de dados, e como as entidades são recriadas como instâncias quando recuperadas
30
do banco de dados. A figura 7 ilustra uma classe de dados simples. No exemplo da
figura 7 foi declarada uma entidade de nome “Employee”, com as propriedades “id”,
“firstName”, “lastName” e “hireDate”. O “id” está definido como chave primária da
tabela.
Figura 7 – Classe de dados Employee.java.
Fonte: Google, 2009.
As entidades do banco de dados não têm esquema. É responsabilidade da
aplicação garantir que as entidades atendam ao esquema quando necessário. O
SDK para Java inclui duas interfaces para manipulação do banco de dados e
persistência. São elas: JDO e JPA. Essas interfaces padrão incluem mecanismos
para realizar consultas sobre os dados, e possibilitam também a definição de
classes de objetos de dados. Outros adaptadores de interface podem ser
implementados através de uma API de nível inferior.
31
A interação com o banco de dados é realizada através de um objeto
PersistenceManager, obtido a partir de um objeto PersistenceManagerFactory.
Como é muito custoso configurar um PersistenceManagerFactory, deve ser previsto
que se obtenha a instância apenas uma vez durante a existência do aplicativo (que
pode requerer muitas solicitações). Recomenda-se fazer esse processo inserindo-o
em uma única classe.
A JDO contém uma interface de consulta chamada JDOQL. A JDOQL
normalmente é utilizada para recuperação de entidades como instâncias da classe.
2.3.4.2 Entidades e propriedades
Os objetos de dados do Google App Engine são tratados como entidades.
Uma entidade pode ter uma ou mais propriedades. As propriedades podem possuir
diversos tipos de dados, incluindo caracteres, números inteiros, valores de ponto
flutuantes, datas, além de vários outros.
As entidades são identificadas por uma chave única. A chave é composta por
um identificador numérico exclusivo, que pode ser fornecido tanto pelo aplicativo,
quanto pelo armazenamento de dados.
Para obtenção de uma entidade do banco de dados, o aplicativo deve utilizar
a chave da entidade, ou então realizar uma consulta correspondente às
propriedades da entidade. Para economizar memória ou reduzir o tempo de
execução, a consulta pode limitar o número de resultados retornados pelo banco de
dados.
O sistema de armazenamento de dados do Google App Engine não exige que
todas entidades de um determinado tipo tenham as mesmas propriedades,
diferentemente de um banco de dados relacional. A especificação do modelo de
dados pode ficar a critério da aplicação, com a utilização de bibliotecas incluídas no
ambiente de desenvolvimento, ou ainda pelo próprio código.
32
2.3.4.3 Consultas e índices
As consultas ao banco de dados do Google App Engine são realizadas sobre
uma classe de dados de uma entidade. O resultado é retornado através da entidade
se possuir ao menos um valor para cada propriedade definida nos filtros da consulta,
e se todos os critérios do filtro forem atendidos pelos valores da propriedade.
Todas as consultas ao banco de dados são feitas com a utilização de um
índice. Esse índice é na verdade uma tabela que armazena os resultados da
consulta da ordem requisitada. Os índices no Google App Engine são definidos em
um arquivo de configuração. Caso seja realizada uma consulta que não possui um
índice
configurado,
o
servidor
web
adiciona
sugestões
a
esse
arquivo
automaticamente, facilitando o trabalho do desenvolvedor. Esse arquivo pode ser
facilmente editado.
2.3.4.4 Transações e grupos de entidades
Todas as tentativas de criação, atualização ou exclusão de entidades no
sistema de armazenamento de dados do GAE gera uma transação. A transação é
muito importante, pois garante que a efetivação da ação solicitada só ocorra quando
todo o processo for concluído. Em caso de erro, ou de qualquer falha inesperada, a
transação é desfeita e, conseqüentemente, a entidade continua íntegra e
consistente.
O GAE possui uma API de transação para gerenciar esse controle, e permite
que diversas ações possam ser executadas sobre uma entidade, em uma única
transação.
É possível também manipular mais de uma entidade em uma única transação.
Mas, para isso, é preciso informar com antecedência todas as entidades que serão
atualizadas juntas, para que a API possa fazer esse reconhecimento em tempo de
execução. Além disso, é preciso que essas entidades estejam em um mesmo grupo
de entidades.
33
A definição de grupos de entidades é realizada através de uma hierarquia de
relacionamentos. O processo é feito da seguinte maneira: uma entidade é declarada
como filha de outra já existente. Essa outra entidade se torna então uma entidade
pai. Entidades sem pai são conhecidas por entidades raiz.
O gerenciamento das transações utiliza o sistema de concorrência otimista.
Funciona da seguinte maneira: enquanto o aplicativo está manipulando um entidade
ou um grupo de entidades, todas as outras tentativas de atualização de qualquer
entidade do grupo falham.
2.3.4.5 Cotas e limites
O Google App Engine exerce um controle sobre o banco de dados
disponibilizado em sua nuvem, e oferece uma cota de utilização.
Todas as chamadas para a API de armazenamento contam para a cota de
chamadas do armazenamento de dados. Essa cota é dividida em dados enviados e
dados recebidos.
Essa quantidade total de dados para armazenamento é ajustável, e pode ser
configurado pelo painel de configuração da plataforma.
34
3 PORTAL DE SERVIÇOS
O objetivo deste trabalho é desenvolver uma camada de serviços para o
Google App Engine. Os serviços implementados suprem algumas carências
identificadas no ambiente disponibilizado pelo Google.
3.1 Proposta / camada de serviços
A estrutura da camada de serviços pode ser visualizada na figura 8. O acesso
a essa camada é feito através de um Portal de Acesso7, disponibilizado no ambiente
de execução do Google App Engine. O Portal dispõe de seis blocos de serviços.
Figura 8 – Camada de Serviços para o Google App Engine.
Fonte: Autoria Própria, 2009.
Login
Este serviço é responsável pela autenticação do usuário. Para acesso aos
serviços do portal, a autenticação é obrigatória. Para realizar a identificação, deve
ser informado usuário (e-mail) e senha.
7 (http://portalacessotcc.appspot.com/)
35
O módulo de Login, ilustrado na figura 9, trabalha com a API das Contas do
Google em Java. Com a utilização desse módulo é possível detectar se o usuário
logado é um administrador, facilitando o desenvolvimento em áreas da aplicação
restritas aos administradores.
Figura 9 – Módulo de Login.
Fonte: Autoria Própria, 2009.
Com a utilização do Login através das contas padrão Google, o Portal poderá
ser acessado por milhões de usuários ativos cadastrados no Google, sem a
necessidade de exigir novo cadastramento.
Caso o acesso ao Portal seja realizado por um usuário que não possui uma
conta padrão Google, a API disponibiliza um serviço para cadastramento.
Gerador de Código
O Google App Engine oferece suporte a duas linguagens de programação:
Java e Python.
Sempre que é iniciado o desenvolvimento de uma nova aplicação utilizando
Python é necessário montar manualmente toda a estrutura básica de arquivos. Além
disso, é necessário inserir nos arquivos códigos da estrutura padrão do Google App
Engine, os quais sempre se repetem. A figura 10 destaca os pontos onde existe
repetição de código para uma aplicação simples (Hello World!).
36
Figura 10 – Código Python para o Google App Engine.
Fonte: Autoria Própria, 2009.
Para o desenvolvimento via Java, o Google disponibiliza um plugin para
integrar o ambiente de execução da nuvem com a ferramenta Eclipse. Com a
utilização desse plugin, na criação de um novo projeto, a estrutura básica de
arquivos é criada. Mas, para os usuários que não utilizam essa ferramenta, o
problema encontrado no Python precisa ser enfrentado também no Java. A figura 11
ilustra o código de um servlet Java, destacando os pontos que são gerados pelo
serviço.
Figura 11 – Código Java para o Google App Engine.
Fonte: Autoria Própria, 2009.
37
O serviço de Geração Automática de Código é responsável por auxiliar o
desenvolvedor na tarefa de montar a estrutura inicial de arquivos, já embutindo o
código padrão necessário para o correto funcionamento da aplicação.
Os pontos onde o usuário deve inserir o código específico da sua aplicação
estão destacados no arquivo fonte, de forma comentada.
Figura 12 – Criando um novo projeto web - Java.
Fonte: Autoria Própria, 2009.
É possível também criar um novo projeto com mais opções além da estrutura
básica, conforme ilustrado na figura 12. Este módulo permite, por exemplo, no
momento da criação do projeto selecionar que se deseja trabalhar com acesso a
banco de dados. O aplicativo será então gerado com todas as configurações
necessárias para realizar este acesso, facilitando o trabalho do desenvolvedor.
Outra possibilidade é a de escolha de exemplos embutidos na estrutura
padrão. Por exemplo, caso o usuário deseje ver uma aplicação básica de Livro de
38
Visitas funcionando, é possível fazer essa seleção. O código será gerado já com
essa estrutura embutida.
Submissão
De posse da aplicação pronta, o Portal disponibiliza um serviço de envio do
aplicativo para a nuvem Google. Este módulo é o responsável por receber o pacote
de um projeto, compilá-lo e implantá-lo na nuvem. Caso ocorra algum erro de
compilação a submissão é interrompida, e o erro é exibido na tela, conforme
ilustrado na figura 13.
Figura 13 – Erro de compilação.
Fonte: Autoria Própria, 2009.
O processo de compilação só é necessário para o ambiente de execução
Java. Para o ambiente Python o processo de compilação não existe, portanto os
erros de sintaxe só são percebidos em tempo de execução.
Para que a submissão ocorra de forma adequada, é necessário que o pacote
esteja em formato ZIP.
Ao final da submissão é gerado um link para o usuário acessar o seu
aplicativo, conforme ilustrado na figura 14.
39
Figura 14 – Status do processo de submissão.
Fonte: Autoria Própria, 2009.
Monitoramento
O Google App Engine disponibiliza um arquivo XML com diversos indicadores
sobre o status dos serviços do ambiente. Esse XML foi incorporado ao portal, e traz
alguns indicadores tais como: uptime, gráfico de latência de leitura, gráfico de
latência de escrita, status do ambiente Python, status do ambiente Java, status das
APIs de serviços, entre outros.
Tutoriais
O módulo de Tutoriais está encarregado em auxiliar o usuário a executar os
serviços do Portal. Estão disponíveis três tutoriais. São eles: Guia de Utilização do
GAE, Como criar/submeter uma aplicação em Java e Como criar/submeter uma
aplicação em Python.
O Guia de Utilização do GAE fornece uma visão geral sobre o ambiente de
execução do Google. Ensina a criar uma conta, passa por todo processo de
instalação, e finaliza ensinando a criar uma aplicação básica.
O tutorial Como criar/submeter uma aplicação em Java fornece informações
detalhadas sobre como utilizar o serviço de Geração de Código do Portal para
40
desenvolver um aplicativo em Java. Vai desde a parte inicial da criação do projeto,
até a submissão para a nuvem.
O tutorial Como criar/submeter uma aplicação em Python é semelhante ao
anterior, mas detalha os aspectos específicos desta outra linguagem de
programação.
Controle de Projetos
Este serviço é responsável por armazenar todos os projetos gerados através
do portal, exibindo informações como: nome do projeto, nome do pacote, data de
criação, ambiente, um link para download do projeto, e um link para exclusão do
projeto, conforme ilustrado na figura 15.
Figura 15 – Controle de projetos.
Fonte: Autoria Própria, 2009.
É armazenada nesse serviço também a URL de acesso a última aplicação
submetida pelo usuário.
41
3.2 Implementação e avaliação
Para a implementação do Portal e de seus respectivos serviços, foi escolhido
o ambiente de execução em Java. Existem duas maneiras de desenvolver nesse
ambiente. Uma delas é com a utilização de ferramentas comuns de desenvolvimento
da web e padrões de APIs em Java. Para interação com o ambiente é utilizado o
padrão servlet Java. Podem ser utilizadas também tecnologias comuns de
aplicativos da web, como JavaServer Pages (JSPs). A outra forma, escolhida para o
desenvolvimento deste trabalho, é a utilização de um plugin para integração do
Google App Engine com o Eclipse.
O Eclipse é um ambiente de desenvolvimento integrado, que reúne
ferramentas de apoio ao desenvolvimento de software. Para a implementação do
Portal foi utilizado o Eclipse 3.4 (Ganymede)8.
A seguir serão vistos detalhes de implementação dos serviços do Portal.
Login
Este serviço utiliza a API das Contas Google em Java. Seus principais
métodos são:
o createLoginURL(): retorna uma URL podendo ser utilizada para a
exibição de página de login para o usuário.
o createLogoutURL(): retorna uma URL podendo ser utilizada para
desconectar o usuário do aplicativo.
o getCurrentUser(): retorna informações sobre o usuário, se este estiver
conectado.
o isUserAdmin(): retorna um valor booleano. Se a solicitação foi feita por
um usuário administrador retorna true, caso contrário retorna false.
o isUserLoggedIn(): retorna um valor booleano. Se o usuário está
conectado retorna true, caso contrário retorna false.
A tela de login das Contas do Google informa ao usuário que ele está fazendo
login no aplicativo, utilizando o nome do aplicativo escolhido no momento do
8 (http://www.eclipse.org/ganymede/)
42
registro. Este nome pode ser alterado em Configurações do aplicativo no Console de
administração.
Após a autenticação, o usuário é redirecionado diretamente ao aplicativo.
Esse controle é realizado automaticamente pela API.
No ambiente de desenvolvimento, a API simula o sistema de contas utilizando
uma tela de login fictícia. Quando a aplicação chama a API de usuários para obter a
URL da tela de login, a API retorna uma URL especial do servidor de
desenvolvimento que solicita somente o usuário (endereço de e-mail), mas não
solicita a senha. Não é feita nenhuma verificação nos dados informados, e o
aplicativo se comportará como se tivesse sido realizado um login com uma conta
verdadeira.
Gerador de Código
O Google App Engine suporta dois padrões diferentes de APIs para
armazenamento de dados: JDO e JPA. Essas interfaces são disponibilizadas
através do DataNucleus Access Platform9, que é uma implementação de vários
padrões persistentes Java, juntamente com um adaptador para o armazenamento
de dados do GAE. Todo o armazenamento de dados necessário para
implementação do Portal proposto, foi desenvolvida utilizando essas tecnologias.
Para o desenvolvimento do layout, foi utilizado JSP, que permite a construção
de páginas dinâmicas, realizando a junção de código Java com código HTML. Foram
utilizados
também
servlets
Java,
que
permitem
processar
dinamicamente
requisições e respostas, proporcionando novos recursos aos servidores Java.
O primeiro passo que o usuário deve seguir ao entrar nesse módulo é
escolher entre os ambientes de execução Java e Python. Ao escolher o ambiente
Java, é solicitado para que se informe o nome do projeto e o nome do pacote, que
não podem conter espaços nem caracteres especais. Se a escolha foi pelo ambiente
Python, só é solicitada a informação do nome do projeto.
O segundo passo para geração de código é escolher a personalização do
código. Esta opção fica entre inserir um exemplo de acesso a bando de dados, onde
o usuário pode inserir o nome da entidade de sua preferência, bem como a
quantidade de campos que desejar, informado o nome do campo e seu respectivo
9 (http://www.datanucleus.org/)
43
tipo de dado. A outra opção é a de gerar o código com um exemplo embutido,
podendo escolher os seguintes aplicativos: Hello World, Livro de Visitas e Login.
Figura 16 – Fluxograma do módulo gerador de código.
Fonte: Autoria Própria, 2009.
O fluxograma da figura 16 ilustra o funcionamento do módulo gerador de
código. A primeira etapa é preparar o ambiente para o usuário. Isso compreende a
criação de um diretório, caso ainda não exista, para o usuário conectado ao portal.
Após a criação do diretório é realizada uma cópia de uma aplicação modelo para a
pasta do usuário, conforme prévia seleção.
A etapa de personalização dos arquivos fonte é responsável pela geração de
código na aplicação modelo contida na pasta do usuário. Essa customização é
realizada seguindo as características do projeto informadas pelo usuário através do
portal.
Caso esteja sendo gerado um projeto para o ambiente de execução em Java
é necessário realizar um processo de compilação da aplicação. Esse passo não é
necessário para o ambiente de execução em Python.
O passo seguinte é o armazenamento do projeto no banco de dados do portal
para futura consulta através da funcionalidade de Controle de Projetos.
Finalmente, o projeto é empacotado e um link para download do arquivo
gerado é disponibilizado ao usuário.
44
Submissão
O processo de submissão recebe um arquivo ZIP como entrada. Após o
upload do arquivo para o servidor, o serviço deve descompactar o pacote e colocar
cada arquivo em seu respectivo diretório. Essas etapas são realizadas através de
scripts desenvolvidos para o serviço de submissão do Portal.
Para o ambiente Java, este módulo efetua a compilação dos arquivos e, em
caso de erro, retorna uma mensagem para o usuário.
O fluxograma da figura 17 ilustra todas as etapas percorridas pelo módulo de
submissão.
Figura 17 – Fluxograma do módulo de submissão.
Fonte: Autoria Própria, 2009.
Monitoramento
Para este serviço foi utilizado um arquivo XML disponibilizado pelo ambiente
do Google App Enigne.
Tutoriais
Os tutoriais estão disponibilizados no portal na forma de links para o
download de arquivos no formato PDF.
45
Controle de Projetos
Sempre que o usuário cria ou submete um novo projeto é feito um
armazenamento desses dados, para controle desse módulo.
Avaliação do Portal
A avaliação do portal foi realizada de forma qualitativa. Foi aplicado um
questionário, que pode ser visualizado no apêndice B deste trabalho, com o objetivo
de traçar o perfil do usuário, com a facilidade de utilização dos serviços do portal. O
questionário foi aplicado na turma de Sistemas Distribuídos do curso de Ciência da
Computação do Unilasalle no segundo semestre de 2009.
Foram entrevistadas três pessoas. O perfil dessas pessoas está ilustrado no
quadro 3. Nota-se que todas elas são da área de desenvolvimento de software.
Perfil
P2
P1
P3
Trabalha com desenvolvimento
Sim Sim Sim
Quadro 3 – Identificação do perfil dos entrevistados.
Fonte: Autoria Própria, 2009.
O quadro 4 complementa a identificação do perfil dos entrevistados. Neste
quadro está sendo exibido o nível de conhecimento de desenvolvimento Web, Java
e Python de cada pessoa.
Conhecimento
P1 P2 P3
Desenvolvimento Web
3
4
4
Desenvolvimento Java
3
4
3
Desenvolvimento Python
2 2 2
Quadro 4 – Identificação do nível de conhecimento específico dos entrevistados.
Fonte: Autoria Própria, 2009.
No quadro 5 está sendo demonstrada a avaliação de diversos serviços do
portal. A avaliação foi realizada com base em duas atividades propostas aos
entrevistados. A primeira consistia na geração de código Java e posterior submissão
do projeto, utilizando as ferramentas disponibilizadas pelo portal. A segunda tarefa
foi semelhante à primeira, com a diferença de estar voltada ao ambiente Python.
46
Avaliação Portal
P1 P2 P3
Geração de Código Java
5
5
4
Geração de Código Python
5
5
4
Submissão de Código Java
5
5
5
Submissão de Código Python
5
5
5
Tutoriais
5
Quadro 5 – Avaliação do portal.
4
5
Fonte: Autoria Própria, 2009.
Percebeu-se que mesmo para os usuários com pouco conhecimento em
determinada linguagem de programação, como Python, por exemplo, a utilização do
portal deu-se de forma bastante simples.
47
4 CONCLUSÃO
Ao longo deste trabalho foram estudados os conceitos de computação em
nuvem, seus aspectos mais importantes, bem como as oportunidades e obstáculos
que estão envolvidas neste assunto. Foi proposto e desenvolvido um portal de
serviços para computação em nuvem, com a utilização do ambiente de execução do
Google App Engine.
É possível concluir que os serviços do portal contribuem para auxiliar a
difusão de novos projetos na área de computação em nuvem.
O portal de serviços possui um grande potencial para ser expandido. Como
trabalho futuro, pode ser destacado a criação de um ambiente para edição dos
arquivos de forma on-line, facilitando a edição de novos projetos.
Outra sugestão para ampliação do portal, sugerida por um dos entrevistados
que responderam ao questionário de avaliação, é a inserção de uma lista de
bibliotecas que funcionem no servidor do Google, como por exemplo: displaytag,
displaytable, vraptor, spring, groove, e uma lista de frameworks que podem ser
incorporados nas aplicações.
Conclui-se que o portal de serviços é uma boa alternativa para pessoas que
estão iniciando o desenvolvimento de aplicações para nuvem, por ter um ambiente
amigável, e possuir serviços que auxiliam a construção de novos projetos.
48
REFERÊNCIAS
AMAZON.
Amazon
Elastic
Compute
Cloud.
<http://aws.amazon.com/ec2/>. Acesso em: 10 maio 2009.
Disponível
em:
ARMBRUST, M. et al. Above the Clouds: A Berkeley View of Cloud Computing
[Relatório
Técnico].
Disponível
em:
<http://www.eecs.berkeley.edu/Pubs/
TechRpts/2009/EECS-2009-28.pdf>. Acesso em: 15 mar. 2009.
BUYYA, R. et al. Market-Oriented Cloud Computing: Vision, Hype, and Reality for
Delivering IT Services as Computing Utilities. 2008. High Performance Computing
and Communications. IEEE International Conference.
CHAPPELL, David. Apresentando a Plataforma de Serviços Azure: uma breve
análise do Windows Azure, .NET Services, SQL Services e Live Services. Disponível
em: <http://www.msdnbrasil.com.br/downloads/artigostecnicos/azure/Apresentando
PlataformaAzure.pdf>. Acesso em: 10 out. 2009.
DELIC, K. A.; WALKER, M. A. Emergence of the academic computing clouds.
Ubiquity. Disponível em: <http://doi.acm.org/10.1145/1414663.1414664>. Acesso
em: 12 ago. 2009.
ECLIPSE. Eclipse. Disponível em: <http://www.eclipse.org/>. Acesso em: 5 mar.
2009.
FRANKLIN JUNIOR, Curtis. Cloud Computing: Technologies And Strategies Of The
Ubiquitous Data. São Paulo: CRC Press, 2009.
GOOGLE. Google App Engine. Disponível em: <http://code.google.com/intl/ptBR/appengine/>. Acesso em: 12 maio 2009.
HAYES,
B..
Cloud
computing.
ACM,
2008.
Disponível
<http://doi.acm.org/10.1145/1364782.1364786>. Acesso em 12 ago. 2009.
em:
JAVA. The Source for Java Developers. Disponível em: <http://java.sun.com/>.
Acesso em: 10 out. 2009.
JONES, M. T. Computação em Nuvem com Linux. Disponível em:
<http://www.ibm.com/developerworks/br/library/l-cloud-computing/>. Acesso em: 10
abr. 2009.
LINTHICUM, D. S. Cloud Computing and SOA Convergence in Your Enterprise:
A Step-by-Step Guide. São Paulo: Addison-Wesley Information Technology Series,
2009.
49
MC EVOY, G. V.; SCHULZE, B. Using clouds to address grid limitations.
Proceedings of the 6th international Workshop on Middleware For Grid Computing,
2008. Disponível em: <http://doi.acm.org/10.1145/1462704.1462715>. Acesso em:
10 abr. 2009.
MILLER, Michael. Cloud Computing - Web-Based Applications That: Change The
Way You Work And Collaborate Online. São Paulo: Que, 2008.
PYTHON.
Python
Programming
Language.
<http://www.python.org/>. Acesso em: 10 out. 2009.
SUN. The Sun Cloud API. Disponível em:
suncloudapis/pages/Home>. Acesso em: 13 out. 2009.
Disponível
em:
<http://kenai.com/projects/
WEISS,
A.
2007.
Computing
in
the
clouds.
Disponível
<http://doi.acm.org/10.1145/1327512.1327513>. Acesso em: 13 out. 2009.
em:
50
APÊNDICE A – Guia de utilização do Google App Engine
1. Criando uma conta no Google App Engine.
Acesse o link: http://appengine.google.com/start.
O GAE utiliza a conta padrão Google. Se você já possui uma conta padrão, vá para
o passo 2. Se não possui, clique no link destacado em vermelho na Figura 1.
Figura 1.
Fonte: Google, 2009.
51
Acessando o link para criar uma nova conta, é exibida a tela da Figura 2.
Figura 2.
Fonte: Google, 2009.
Basta preencher os dados solicitados, e clicar no botão “Aceito. Criar minha conta.”
52
2. Ativando uma conta no Google App Engine
Faça o login no link http://appengine.google.com/start utilizando sua conta padrão
Google. Após a autenticação do usuário, é exibida a tela da Figura 3.
Figura 3.
Fonte: Google, 2009.
Para criar uma nova aplicação, deve-se clicar no botão “Create na
Application”, exibido na Figura 3. Ao clicar no botão, é mostrada a tela da Figura 4.
Nessa tela deve ser selecionado o seu país, na lista de seleção destacada em
vermelho, na Figura 4. Até a data de entrega deste trabalho, as opções disponíveis
para seleção são: Other (Not Listed), Canada, Japan e United States. Para o Brasil,
deve ser selecionada a primeira opção.
O segundo campo que deve ser preenchido é o Mobile Number, destacado
em verde na figura 4. Para celulares do Brasil, até a data de entrega deste trabalho,
somente duas operadoras de celular estão habilitadas para receber o código de
confirmação. São elas: TIM Celular S.A. e TNL PCS S.A.
Após preencher corretamente os campos, deve-se clicar no botão “Send”. Essa ação
irá disparar um SMS para o celular informado no campo Mobile Number, contendo o
código de confirmação que deverá ser informado na Figura 5.
53
Figura 4.
Fonte: Google, 2009.
Na figura 5 deve ser informado o código de confirmação recebido no celular
através de uma mensagem SMS, no campo Enter Account Code.
Figura 5.
Fonte: Google, 2009.
Preenchendo corretamente o campo e clicando no botão “Send”, já está
habilitada a sua conta no Google App Engine, e já se pode criar a primeira
aplicação.
3. Criando uma aplicação no Google App Engine
A tela de cadastro de uma nova aplicação está ilustrada na Figura 6. Todos
os aplicativos devem possuir um identificador único. Para verificar se o identificador
desejado ainda está disponível, basta digitá-lo no campo Application Identifier, e
54
clicar no botão “Check Availability”. Esse identificador fará parte da URL para acesso
da aplicação posteriormente.
Figura 6.
Fonte: Google, 2009.
Após a escolha do identificador, deve ser preenchido o campo Application
Title, com o título da sua aplicação. Clicando no botão “Save”, sua aplicação será
registrada, e já estará habilitada para deploys (transferência da aplicação local para
os servidores do Google). Se o registro ocorreu com sucesso, será demonstrada a
tela da Figura 7.
55
Figura 7.
Fonte: Google, 2009.
4. Integrando o Google App Engine com o Eclipse
Para este guia foi utilizado o Eclipse versão 3.4.2 (Ganymede).
O Google desenvolveu um Plug-in para o Eclipse, que pode ser instalado da
seguinte forma: com o Eclipse aberto, selecione Help, depois Software Updates,
conforme ilustrado na figura 8.
Figura 8.
Fonte: Eclipse, 2009.
56
Após essa ação, será aberta uma janela, conforme a figura 9.
Figura 9.
Fonte: Eclipse, 2009.
Nesta janela, deve ser selecionada a aba Available Software. Nessa aba,
deve ser clicado no botão “Add Site...”, destacado em vermelho na figura 10.
Figura 10.
Fonte: Eclipse, 2009.
Será aberta então uma caixa de texto, onde deve ser inserido o endereço:
http://dl.google.com/eclipse/plugin/3.4, conforme ilustrado na figura 11.
57
Figura 11.
Fonte: Eclipse, 2009.
Será então adicionado na lista de softwares disponíveis para instalação no
Eclipse, três novas opções: Google Plugin for Eclipse 3.4, Google App Engine Java
SDK 1.2.5 e Google Web Toolkit SDK 1.7.1.
Para instalá-los, basta clicar no checkbox Google Update Site for Eclipse 3.4,
conforme ilustrado na figura 12. Após essa seleção, deve-se clicar no botão Install....
Figura 12.
Fonte: Eclipse, 2009.
Concluída a instalação do Plug-in, e reiniciado o Eclipse, serão demonstrados
três novos botões na interface do Eclipse (figura 13).
58
Figura 13.
Fonte: Eclipse, 2009.
5. Criando um Projeto
O primeiro botão – New Web Application Project – possibilita a criação de um
novo projeto. Ao ser clicado, exibe a janela demonstrada na figura 14.
59
Figura 14.
Fonte: Eclipse, 2009.
Nessa tela é possível definirmos o nome do projeto, e o nome do pacote do
projeto. Pode ser escolhido o local de armazenamento físico dos arquivos do projeto
em Location. Por último, são exibidas as opções de seleção do Google SDK. O
Google Web Toolkit pode ser habilitado ou desabilitado conforme a necessidade do
projeto, bem com a opção do Google App Engine. É possível escolher entre as
versões padrão instaladas, ou outra específica, conforme a necessidade.
A estrutura de diretórios ficará semelhante ao seguinte:
NovoProjeto/
src/
...Códigos fonte Java...
60
META-INF/
...outras configurações...
jdoconfig.xml
NovoProjeto/
NovoProjetoServlet.java
log4j.properties
war/
...JSPs, imagens, arquivos de dados...
WEB-INF/
...configurações da aplicação...
lib/
...bibliotecas...
classes/
...classes compiladas...
appengine-web.xml
web.xml
O diretório war/ utiliza o layout WAR (http://java.sun.com/j2ee/tutorial/1_3fcs/doc/WCC3.html) padrão para agrupar aplicativos da web. Esse diretório é
necessário para a execução do servidor de desenvolvimento e para implementação
do aplicativo no GAE.
6. Compilando um Projeto
O GAE disponibiliza um compilador específico para as aplicações
desenvolvidas para a nuvem. O ícone para acioná-lo é o:
61
Figura 15.
Fonte: Eclipse, 2009.
Nessa janela é possível escolher diversas opções de compilação.
7. Envio do aplicativo para a nuvem Google
O botão que faz o deploy da aplicação para a nuvem é o seguinte:
Na figura 16 estão os campos que devem ser preenchidos, para que o envio
da aplicação possa ser feito corretamente. Primeiro, o nome do projeto. Nos campos
Email e Password, deve ser informado o seu login padrão Google, que já deve ter
previamente ativado a conta no Google App Engine. Na primeira vez que o projeto é
enviado para a nuvem, devem ser informados outros parâmetros, no link App Engine
project settings...
62
Figura 16.
Fonte: Eclipse, 2009.
Na figura 17 podemos ver um campo muito importante, o Application ID. Esse
identificador deve ser o mesmo que foi criado no item 3 desse guia, para que o
Google possa fazer a correta associação.
Figura 17.
Fonte: Eclipse, 2009.
63
Com tudo preenchido corretamente, basta clicar no botão Deploy da figura 16,
e aguardar o envio dos arquivos para a nuvem.
Na figura 18 pode ser visualizado um exemplo de uma aplicação rodando na
nuvem Google.
Figura 18.
Fonte: Autoria Própria, 2009.
64
APÊNDICE B – Questionário Avaliação
TERMO DE CONSENTIMENTO LIVRE E ESCLARECIDO
Informações para o(a) participante voluntário(a):
Você está convidado(a) a responder este questionário que faz parte da coleta de
dados da pesquisa para o trabalhao de conclusão de curso “Computação em
Nuvem com o Google App Engine" sob responsabilidade do(a) pesquisador(a)
Rodrigo Soares - UNILASALLE.
Caso você concorde em participar da pesquisa, leia com atenção os seguintes
pontos: a) você é livre para, a qualquer momento, recusar-se a responder às
perguntas que lhe ocasionem constrangimento de qualquer natureza; b) você
pode deixar de participar da pesquisa e não precisa apresentar justificativas para
isso; c) sua identidade será mantida em sigilo; d) caso você queira, poderá ser
informado(a) de todos os resultados obtidos com a pesquisa, independentemente
do fato de mudar seu consentimento em participar da pesquisa; e) os dados
serão usados de forma anônima e apenas para o TCC ou publicação decorrente
do mesmo; f) a participação ou não no questionário não trará nenhuma
vantagem ou desvantagem pessoal.
Questionário Avaliação
Nome
E-mail
Curso
1. Trabalha na área de Informática?
Sim
Redes
Desenvolvimento
Outra
Não
2. De acordo com a tabela abaixo, indique o seu grau de conhecimento nos
assuntos listados.
1. Nenhum
2. Básico
Desenvolvimento Web
Desenvolvimento Java
3. Intermediário
4. Avançado
65
Desenvolvimento Python
3. De acordo com a tabela abaixo, indique sua impressão sobre os serviços do
portal.
1. Muito Complexo
2. Difícil
3. Normal
4. Simples
Geração de Código Java
Geração de Código Python
Submissão de Código Java
Submissão de Código Python
Tutoriais
4. Utilize o espaço abaixo para sugestões/críticas:
5. Muito Simples
Download