SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
Google AppEngine:
3 anos de estrada no case com a maior
abrangência de produtos usando a
plataforma no Brasil
Gustavo Concon
Arquiteto de Sistemas @ CI&T

gustavoc@ciandt.com
ghconcon
@gconcon
Backends
Cloud Storage
CloudSQL
Task Queue
(Pull Queues)

Task Queue
(Push Queues)

Remote API
Datastore
Como tudo começou...
Contexto tecnológico
● Infra-estrutura complexa e sistemas
legados
● Alto custo com manutenção da infra
● Grande parte do processamento
backoffice no Mainframe (COBOL Batch e
COBOL CICS)
Em 2010...
● Tornou-se cliente do Google Apps for
Business (E-Mail, Calendar, Docs, Sites)
● Decisão do Move to the Cloud por redução
de custos e complexidade de suporte
Maturidade
Datastore

(JSP + jQuery)
Spring

(Objectify)
CloudSQL

(JSF + Primefaces)
Spring

(JPA + Hibernate)
Visão Geral da
Arquitetura
Visão Geral da Arquitetura
Integração com a núvem
Descida dos dados gerados na núvem
Para o usuário
Aplicação Replicadora
Redução da dependência do Mainframe
Subida do resultado do processamento
Governança dos Dados
O Problema
● Dados corporativos, comuns a todas as
aplicações
● Rastreabilidade e consistência das
informações
App com serviços corporativos, centralizadora dos dados
(domínio) em todo ecossistema AppEngine

●

Domínios como consulta de CEP,
Empresas, UF, Profissão...

●

Cacheable, baixíssimo custo
(Latência de rede não é problema)

●

Gestão de volume e
permissionamento

●

Dashboard específico
Busca Geolocalizada por
proximidade
O Objetivo
Geocodificação dos endereços
● Endereços na base armazenados como
“Avenida Paulista, 1000, São Paulo”
● Conversão para Latitude/Longitude
● Google Geocoding API
Mas como fazer as buscas por
proximidade??
Cenário
● Janeiro de 2011!
● Ferramenta promissora da Google, recém
lançada!
● Em fase Experimental!
“É o risco da inovação!”
Google Fusion Tables
●

Cláusulas e funções como ORDER
BY DISTANCE, CIRCLE, INTERSECTs

select local from Locais
where CIRCLE(<latlong>, <raio>)
order by distance;
Google Fusion Tables
● Mudanças constantes no comportamento
da API (App parada em produção)
● API foi descontinuada 6 meses depois
● Hoje ainda existe, API reestruturada
“É o risco da inovação!”
Migramos para o Google CloudSQL
●

É o MySQL na núvem

●

Disponível (na fase oficial) desde
Jun/2012

●

Replicação automática, síncrona ou
assíncrona, around the globe!

●

Suporte a consultas geospaciais
nativas do MySQL :)
How it works?!
● MySQL possui suporte a datatypes de
geometria, GEOMETRY, POINT, CURVE,
POLYGON
OpenGIS Geometry Model
● Tabelas do tipo MyISAM, InnoDB não tem
suporte!
● Índice R-Tree para consulta geométrica
CREATE SPATIAL INDEX sp_index ON mytable (g);
How it works?!
● O conceito permite buscas indexadas
retornando se o ponto está dentro de um
polígono (MBRWithin / MBRContains)
Mas eu preciso do CÍRCULO!!!
Faça uma limonada...

( 6371 * acos( cos( radians(Latitude) ) * cos(
radians( X(LATLONG) ) ) * cos( radians( Y
(LATLONG) ) - radians(Longitude) ) + sin( radians
(Latitude) ) * sin( radians( X(LATLONG) ) ) ) ) AS
DISTANCE !!!!!!
Show me the code!!
SELECT *
FROM (
SELECT *, ( 6371 * acos( cos( radians(1) ) * cos(
radians( X(LATLONG) ) ) * cos( radians( Y(LATLONG) ) radians(1.1) ) + sin( radians(1) ) * sin( radians( X
(LATLONG) ) ) ) ) AS DISTANCE
FROM MAPA_ATENDIMENTO
WHERE MBRWithin( LATLONG, Envelope( GeomFROMText(
'LineString( X Y , X Y)'))

) inner
WHERE inner.DISTANCE <= Z
Pontos interessantes sobre o
CloudSQL
● O CloudSQL trabalha nativamente com
replicação around the globe.
● Configurável: Síncrona ou Assíncrona
● Síncrona: Insert/Update/Delete são
replicados dentro do statement
● Assíncrona: Insert/Update/Delete são
replicados fora do statement
Pontos interessantes sobre o
CloudSQL
● A percepção de performance é notável,
fizemos o teste:
○ Síncrono: 10K inserts com commit de 500 em 500
10 segundos
○ Assíncrono: 10k inserts com commit de 500 em
500

5 segundos
Upload & Download de
Arquivos
Google CloudStorage
● Resumable Uploads
● Espaço ilimitado
Uploading files
● API de integração no AppEngine SDK
(Blobstore API)
blobstoreService.createUploadUrl("/uploaded",
UploadOptions uploadOptsWithBucketName);
blobstoreService.getUploads(request); //File info
(BlobKey)
Requisito
Exportação da base, de forma
analítica (~600.000 registros) em CSV

GAE tem limite de 60 s por request!
Solução

DATASTORE

Push
Queue
Application
Push
Queue

Backend instance
Backend instance
Backend instance

Cloud
Storage
Lições aprendidas
AppEngine SDK não é JEE
● A SDK não implementa 100% da
especificação
● Mas calma, é quase lá…
O que usamos
● Spring Framework 3.2
● Hibernate 4.2 (Apenas com CloudSQL)
● JSF 2.1 + Primefaces 3.5 (Precisamos de alguns

workarounds)
● iText 2.1.7 (Adaptado)
● Objectify 3.1
Alguns cuidados ao usar Spring
Framework
● Tempo de warmup máximo de 60 segundos
● Evite ou reduza o uso de <component-scan>
● Evite ou reduza o uso de @AutoWire
(Principalmente by-type)
● Desabilite o XML Validation em produção
● lazy-init=”true” na declaração dos Beans
Nosso warmup
● 250 beans (@Component)
● Usando component-scanning = Estourou os 60 segs
com ~160 Beans
● Warmup de 38 segundos apenas removendo o
component-scanning + lazy-init
Backends
Cloud Storage
CloudSQL
Task Queue
(Pull Queues)

Task Queue
(Push Queues)

Remote API
Datastore
Pra fechar!
Satisfação geral!
● Cliente satisfeito com a plataforma

"Onde fizer sentido,
vamos migrar pra núvem"
E o principal… CUSTO!
● Uma máquina de servidor de aplicação
tradicional (hosting):
~ US$ 30.000,00 mês
● Todas as aplicações + CloudStorage +
CloudSQL + Ambientes QA/UAT/PRD
+ Premier Support
Em média US$ 1600,00
Obrigado!
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma no Brasil

Weitere ähnliche Inhalte

Ähnlich wie CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma no Brasil

Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App Engine
Frederico Maia Arantes
 
Ambiente de CI/CD com Google Cloud
Ambiente de CI/CD com Google CloudAmbiente de CI/CD com Google Cloud
Ambiente de CI/CD com Google Cloud
Alvaro Viebrantz
 

Ähnlich wie CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma no Brasil (20)

Loucos fc
Loucos fcLoucos fc
Loucos fc
 
Java Nuvem Appengine
Java Nuvem AppengineJava Nuvem Appengine
Java Nuvem Appengine
 
Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App Engine
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Cloud computing & Spring Framework
Cloud computing & Spring FrameworkCloud computing & Spring Framework
Cloud computing & Spring Framework
 
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXFIntrodução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
Introdução ao JBoss Fuse 6.x: criação e implantação de um serviço CXF
 
Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)Projetos reativos com Angular, RxJS e Redux (ngRx)
Projetos reativos com Angular, RxJS e Redux (ngRx)
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Ambiente de CI/CD com Google Cloud
Ambiente de CI/CD com Google CloudAmbiente de CI/CD com Google Cloud
Ambiente de CI/CD com Google Cloud
 
VRaptor - Ciclo CASIN 2011
VRaptor - Ciclo CASIN 2011VRaptor - Ciclo CASIN 2011
VRaptor - Ciclo CASIN 2011
 
Utilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
Utilizando GeoTools para Manipulação de Dados Geográficos - ApresentaçãoUtilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
Utilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
 
Rodando uma API Com Django Rest Framework no Google Cloud
Rodando uma API Com Django Rest Framework  no Google CloudRodando uma API Com Django Rest Framework  no Google Cloud
Rodando uma API Com Django Rest Framework no Google Cloud
 
Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018Jenkins por dentro e por fora - Oracle Code São Paulo 2018
Jenkins por dentro e por fora - Oracle Code São Paulo 2018
 
Meetup #17
Meetup #17Meetup #17
Meetup #17
 
Google BigQuery - Introdução
Google BigQuery - IntroduçãoGoogle BigQuery - Introdução
Google BigQuery - Introdução
 
Tech lunch: highlights Google Cloud Platform Live 2014
Tech lunch: highlights Google Cloud Platform Live 2014Tech lunch: highlights Google Cloud Platform Live 2014
Tech lunch: highlights Google Cloud Platform Live 2014
 
Cross testing mobile com ruby, cucumber e appium
Cross testing mobile com ruby, cucumber e appiumCross testing mobile com ruby, cucumber e appium
Cross testing mobile com ruby, cucumber e appium
 
Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015Backend em aplicações Android - Google I/O 2015
Backend em aplicações Android - Google I/O 2015
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 

CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma no Brasil