Internet sem drama

334 visualizações

Publicada em

Palestra apresentada para o Curso de Sistemas para Internet at Faculdade Murialdo

Publicada em: Internet
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

Nenhuma nota no slide

Internet sem drama

  1. 1. Internet sem Drama Enfrentando desafios diários! @iuriandreazza /iuri.andreazza
  2. 2. @iuriandreazza - Travel Engineering @ Fabuloso Destino - B.el em Ciência da Computação (Unisinos) - Engenheiro de Software/Devops - PHP,Python,Ruby,Java - RBS/Zap Imóveis - Geek - Tech Crazy - Early Adopter
  3. 3. Do começo • Background • Deploy de 3 em 3 meses • Features requests semanais • 5 camadas de processos para deploy • Go live não agile • O que fazer? @iuriandreazza /iuri.andreazza
  4. 4. Estrutura que havia • Deploy somente com script (GMud) • Sem acesso a PRD (mesmo sem nível de usuário ou logs) • Scripts de banco somente executados por um DB oficial • Somente atualizações não criticas durante o dia • Qualquer mudança de médio ou grande porte deveria ser a noite. @iuriandreazza /iuri.andreazza
  5. 5. O que era realmente bom? • Apoio dos DBAs • Apoio da Infra em questões estruturais • A necessidade de pensar bem antes de “Go Live” • Ambientes bem estáveis @iuriandreazza /iuri.andreazza
  6. 6. O que era ruim? • Dificuldade de liberar rapidamente uma versão do portal • Resistência da equipe de infra-estrutura em aplicar patchs e correções • Grande dificuldade de se colocar algo rapidamente no ar. @iuriandreazza /iuri.andreazza
  7. 7. O que enfrentávamos? • Necessidade de ajustar o negócio de forma rápida • Necessidade de colocar rapidamente soluções novas ou correções imediatas • Desenvolvimento era todo Agile, infra não era • Falta de processo e entendimento de como liberar o software do portal @iuriandreazza /iuri.andreazza
  8. 8. PaaS/Cloud o que????? • Analise: • Ir para AWS - Amazon • Ajustar Infra do datacenter local e tentar fazer o melhor possível • Pesquisar e implementar um processo de deploy mais consigo e mais rápido com a infra • Começar a instigar soluções PaaS para a equipe, como openstack, mesos ou openshift. @iuriandreazza /iuri.andreazza
  9. 9. Gestão de versão • Entender como separar features • Entender como quebrar em etapas entregáveis • Criar metodologia no time e na infra-estrutura de como liberar • Deploy-continuo consiste: • Desenvolvimento com Testes (TDD, BDD) • Facilidade de liberar uma versão nova sem downtime, ou com processo preciso. @iuriandreazza /iuri.andreazza
  10. 10. @iuriandreazza /iuri.andreazza Time release branchesmasterhotfixes 1.0.0 2.0.0 dev Inicio Release PRD BUG featurebranches Ontologia New Ecommerce 1.0.5 Atualiza from HOTFIX 2.0.1 X Inicio Release GITFLOW
  11. 11. Infra 1.5 • Ajustar com a equipe de infra-estrutura para um deploy mais rápido • Processo de Deploy maquina-a-maquina • Scripts de banco que sejam incrementais e nunca quebrem o software • Liberação de regras para atualização de arquivos estáticos @iuriandreazza /iuri.andreazza
  12. 12. Infra 2.0 • Mover para a Amazon-AWS • Assumir toda a gestão da infra • Criar estrutura de deploy continuo usando Jenkins-CI • Adicionar e remover maquinas on-the-fly conforme a necessidade • Monitoramento avançado para uso do portal @iuriandreazza /iuri.andreazza
  13. 13. Penseimoves->ZAP • Venda do penseimoveis para o ZAP • 40 Milhões • Ocorreu somente por causa do movimento para o Cloud e da capacidade da equipe • ZAP absorveu a tecnologia e a equipe e trocou o portao penseimoveis pelo deles. @iuriandreazza /iuri.andreazza
  14. 14. Recortando Imagens on-the-go • Problema: • Imagens do portal do antigo penseimoveis.com.br estavam estranhas • Debug: • As vezes os recortes eram entregues as vezes não • As vezes as imagens vinham parcialmente criadas • As vezes as imagens vinham coloridas e com “filtros" errados @iuriandreazza /iuri.andreazza
  15. 15. Achando o problema! • Possíveis causas iniciais: • Tempo de resposta durante a entrega • Cache não sendo feito de forma correta (lado server) • Headers de cache não sendo colocados • Rede (3g/4g/Wifi/Ethernet …) • Recortador "baleando" @iuriandreazza /iuri.andreazza
  16. 16. Estrutura que havia • Recortador dividia recursos com a aplicação principal • Tech-Stack: JAVA App + Glassfish Clusterizado 4.1 (App Server), varnish(webcache),apache(lb) • Datacenter RBS (4 Maquinas 32Gb) • 8Cores 2.3Ghz (Blades) • NAS - HDD SCSI/SSD • Link dedicado @iuriandreazza /iuri.andreazza
  17. 17. Métricas (Stack-Java) segundos 0 0,75 1,5 2,25 3 RPM 500 1000 4000 9000 20000 Tempo de Resp. IO/W Mb 0 100 200 300 400 RPM 500 1000 4000 9000 20000 MEM @iuriandreazza /iuri.andreazza
  18. 18. Desafios • Java-NIO • Causava problemas de IO e drop da JVM em alguns casos de concorrência • IO Wait (FS, NAS vs MemFS) • Espaço vs Escalabilidade vs Nível Cache • Hang Glassfish • Refatoring constante do codigo em busca de melhorias @iuriandreazza /iuri.andreazza
  19. 19. Pragmatico! • Qual tech usar? • Python? • comunidade bastante ativa • boa lib de manipulação de imagens “Pylon" • bom micro-framework web (@flask) • Simples de usar, pouco código necessário para fazer o mesmo • Simples de fazer deploy @iuriandreazza /iuri.andreazza
  20. 20. Stack-Py • Usando Pyhton • PIL • flask • Setup (infra-estrutura) • Varnish • Nginx+ • 4 instancias flask @iuriandreazza /iuri.andreazza
  21. 21. Stack-Py import sys
 import pense_lib
 from flask import Flask
 from flask import request
 
 import hmac
 import hashlib
 import requests
 import base64
 import time
 import datetime
 
 app = Flask(__name__)
 app.config.from_pyfile('flaskapp.cfg')
 @app.route('/images/<path:file_path>')
 def static_asset(file_path): w = request.args.get('w', None)
 h = request.args.get('h', None)
 fit = request.args.get('fit', "f")
 env_rec = request.args.get('e', "production")
 #tratando de recorte
 center = request.args.get('c', "a")
 if "," in center:
 center = center.split(",")
 
 return pense_lib.processRequest(file_path, w, h, fit, center, env_rec) @iuriandreazza /iuri.andreazza def resize(img, box, fit, out, quality, center, ext="JPEG", save = True): #... def processRequest(file_path, w, h, fit, center, env_rec): if not os.path.exists("/tmp/ images/"+file_original_path_s3):
 res = k_file_original.get_contents_to_filename("/tmp/ images/"+file_original_path_s3)
 
 im = Image.open("/tmp/images/"+file_original_path_s3)
 im = resize(im, box, fit, "/tmp/images/files/"+env_rec +"/"+file_rec_name, 100, center)
 # ext = imghdr.what("/tmp/images/files/"+file_rec_name)
 s3_utils.s3Push(bucket, file_path_s3, "/tmp/images/ files/"+env_rec+"/"+file_rec_name).start()
 
 output = io.BytesIO()
 im.save(output, format='JPEG') # or another format
 output.seek(0)
 
 return send_file(output, mimetype='image/JPEG') app.py pense_lib.py
  22. 22. Stack-Py @iuriandreazza /iuri.andreazza • Ex. deploy
 PS: Colocar foto do MESOS e Marathon
  23. 23. Métricas (Stack-Py) segundos 0 0,175 0,35 0,525 0,7 RPM 500 1000 4000 9000 20000 Tempo de Resp. IO/W Mb 0 7,5 15 22,5 30 RPM 500 1000 4000 9000 20000 MEM @iuriandreazza /iuri.andreazza
  24. 24. Perguntas??? @iuriandreazza /iuri.andreazza

×