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 ...
Em 2010...
● Tornou-se cliente do Google Apps for
Business (E-Mail, Calendar, Docs, Sites)
● Decisão do Move to the Cloud ...
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...
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 Lat...
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çã...
Google Fusion Tables
●

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

select local from Locais
where CIR...
Google Fusion Tables
● Mudanças constantes no comportamento
da API (App parada em produção)
● API foi descontinuada 6 mese...
Migramos para o Google CloudSQL
●

É o MySQL na núvem

●

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

●

Replicação autom...
How it works?!
● MySQL possui suporte a datatypes de
geometria, GEOMETRY, POINT, CURVE,
POLYGON
OpenGIS Geometry Model
● T...
How it works?!
● O conceito permite buscas indexadas
retornando se o ponto está dentro de um
polígono (MBRWithin / MBRCont...
Mas eu preciso do CÍRCULO!!!
Faça uma limonada...

( 6371 * acos( cos( radians(Latitude) ) * cos(
radians( X(LATLONG) ) ) * cos( radians( Y
(LATLONG) )...
Show me the code!!
SELECT *
FROM (
SELECT *, ( 6371 * acos( cos( radians(1) ) * cos(
radians( X(LATLONG) ) ) * cos( radian...
Pontos interessantes sobre o
CloudSQL
● O CloudSQL trabalha nativamente com
replicação around the globe.
● Configurável: S...
Pontos interessantes sobre o
CloudSQL
● A percepção de performance é notável,
fizemos o teste:
○ Síncrono: 10K inserts com...
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",
UploadO...
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...
Alguns cuidados ao usar Spring
Framework
● Tempo de warmup máximo de 60 segundos
● Evite ou reduza o uso de <component-sca...
Nosso warmup
● 250 beans (@Component)
● Usando component-scanning = Estourou os 60 segs
com ~160 Beans
● Warmup de 38 segu...
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ç...
Obrigado!
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma ...
Próximos SlideShares
Carregando em…5
×

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

449 visualizações

Publicada em

Google AppEngine:
3 anos de estrada no case com a maior
abrangência de produtos usando a
plataforma no Brasil

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
449
No SlideShare
0
A partir de incorporações
0
Número de incorporações
10
Ações
Compartilhamentos
0
Downloads
1
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Google AppEngine: 3 anos de estrada no case com a maior abrangência de produtos usando a plataforma no Brasil
  2. 2. Gustavo Concon Arquiteto de Sistemas @ CI&T gustavoc@ciandt.com ghconcon @gconcon
  3. 3. Backends Cloud Storage CloudSQL Task Queue (Pull Queues) Task Queue (Push Queues) Remote API Datastore
  4. 4. Como tudo começou...
  5. 5. 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)
  6. 6. 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
  7. 7. Maturidade
  8. 8. Datastore (JSP + jQuery) Spring (Objectify)
  9. 9. CloudSQL (JSF + Primefaces) Spring (JPA + Hibernate)
  10. 10. Visão Geral da Arquitetura
  11. 11. Visão Geral da Arquitetura
  12. 12. Integração com a núvem
  13. 13. Descida dos dados gerados na núvem
  14. 14. Para o usuário
  15. 15. Aplicação Replicadora
  16. 16. Redução da dependência do Mainframe
  17. 17. Subida do resultado do processamento
  18. 18. Governança dos Dados
  19. 19. O Problema ● Dados corporativos, comuns a todas as aplicações ● Rastreabilidade e consistência das informações
  20. 20. 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
  21. 21. Busca Geolocalizada por proximidade
  22. 22. O Objetivo
  23. 23. 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
  24. 24. Mas como fazer as buscas por proximidade??
  25. 25. Cenário ● Janeiro de 2011! ● Ferramenta promissora da Google, recém lançada! ● Em fase Experimental! “É o risco da inovação!”
  26. 26. 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;
  27. 27. 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!”
  28. 28. 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 :)
  29. 29. 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);
  30. 30. How it works?! ● O conceito permite buscas indexadas retornando se o ponto está dentro de um polígono (MBRWithin / MBRContains)
  31. 31. Mas eu preciso do CÍRCULO!!!
  32. 32. 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 !!!!!!
  33. 33. 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
  34. 34. 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
  35. 35. 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
  36. 36. Upload & Download de Arquivos
  37. 37. Google CloudStorage ● Resumable Uploads ● Espaço ilimitado
  38. 38. Uploading files ● API de integração no AppEngine SDK (Blobstore API) blobstoreService.createUploadUrl("/uploaded", UploadOptions uploadOptsWithBucketName); blobstoreService.getUploads(request); //File info (BlobKey)
  39. 39. Requisito Exportação da base, de forma analítica (~600.000 registros) em CSV GAE tem limite de 60 s por request!
  40. 40. Solução DATASTORE Push Queue Application Push Queue Backend instance Backend instance Backend instance Cloud Storage
  41. 41. Lições aprendidas
  42. 42. AppEngine SDK não é JEE ● A SDK não implementa 100% da especificação ● Mas calma, é quase lá…
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. Backends Cloud Storage CloudSQL Task Queue (Pull Queues) Task Queue (Push Queues) Remote API Datastore
  47. 47. Pra fechar!
  48. 48. Satisfação geral! ● Cliente satisfeito com a plataforma "Onde fizer sentido, vamos migrar pra núvem"
  49. 49. 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
  50. 50. Obrigado!

×