SlideShare una empresa de Scribd logo
1 de 52
Codebits 2014
SNAKES ON THE CLOUD
Índice
1. MEO Cloud - apresentação
2. Backend
3. Desktop apps
4. API pública
5. Q/A
MEO Cloud
• Serviço de alojamento e sincronização de ficheiros
• Clientes desktop para Windows, OSX e Linux (inc RPI)
• Clientes mobile para iOS, Android, Windows Phone
• Cifra client-side (beta)
• Tráfego mobile gratuito na rede PT
• Music player
• Upload2Me
Backend
Ideia inicial
1. Enviar ficheiros
2. Receber ficheiros
3. ????
4. Profit!!!
Arquitectura inicial
• Metadata:
• BD relacional (MySQL)
• Ficheiros:
• Filesystem distribuído (GlusterFS)
• Web app:
• Nginx + Apache (mod_wsgi) + Python (Django)
Boneco
Desafios desenvolvimento
• Pedidos buffered
• Muitos pedidos lentos em simultâneo
• Green threads
• Modelo event-driven
• Expor servidor aplicacional
Desafios desenvolvimento
• Sincronização de alterações eficiente (deltas)
• Objectos (ficheiros) potencialmente grandes
• librsync
• dividir ficheiros em blocos <= 4MB
Desafios desenvolvimento
• Grande volume de dados (e metadados)
• Resiliência a falhas
• Sistemas escaláveis na horizontal
• Sem SPOF
Desafios desenvolvimento
• Deduplicação de dados
• Hashes dos blocos
Desafios desenvolvimento
• Segurança da informação
• Cifra em todos os passos
Tecnologias usadas
• Python + gevent + Django + M2Crypto
• Cassandra
• Solr
• Zookeeper
• Swift
• uWSGI
• Nginx
• SAPO Broker
• Memcached
Diagrama
requirements.txt
• Django
• uWSGI
• gevent
• greenlet
• oauthlib
• M2Crypto
• duplicity
Core
requirements.txt
• SAPO-Broker
• requests
• pycassa
• kazoo
• python-memcached
Serviços
requirements.txt
• Pillow
• mutagen
• pybloomfiltermmap
• progressbar
• defusedxml
• dm.xmlsec.binding
• objgraph
• Jinja2
Utils
Desafios pós-lançamento
• Solução criada de raiz usando tecnologia recente
(bleeding edge)
• uWSGI - http parser, connector https, Gevent loop engine,
cache distribuído de sessões SSL
• Pycassa - connection pool && long-lived applications
• Solr - SolrCloud
Desafios pós-lançamento
• Schema Cassandra
• normalização vs desnormalização
• tombstones && slice queries
Desafios pós-lançamento
• Swift
• PUT && Rename VS store local
Desafios pós-lançamento
• Python GC
• objgraph
Desafios pós-lançamento
• Processamento não cooperativo ou CPU bound
• Muitos stacktraces, muito debugging
Alguns números…
• 60% imagens, 20% música, 10% vídeos
• 1,2M uploads/dia - 4,8MB tamanho médio
• 310K downloads/dia - 35MB tamanho médio
• Compressão - BZip2 (12,4%) - Zlib (11,7%)
Desktop Apps
Desafios
• Codebase comum entre Windows, OS X e Linux
• Sincronização transparente em background (daemon
que reage a eventos de rede e filesystem)
• Efficiente (RAM, CPU, Disco, Rede, Bateria)
• Robusta/Fiável -> Just works
• De longe, o maior desafio
• A vossa ajuda é preciosa. Really
Python 2.7 (custom) + C
Because awesome
Because speed
Tecnologias usadas
• GUI Windows: C++, Win32 API [Jorge Cruz]
• GUI OS X: Objective-C, Cocoa [Paulo Andrade]
• CLI Linux: Python, gevent [Francisco Vieira]
• GUI Linux: Python, GTK [Ivo Nunes]
Tecnologias usadas
Core de sincronização
Lessons Learned
Tratamento de erros
Tratamento de erros
POSIX Win32
Tratamento de erros
Erros do Windows: It’s over 9000!
Tratamento de erros
• Não podemos pedir ao utilizador “Tente novamente mais tarde”.
• Manter estado:
• O que é que falhou?
• Porque é que falhou?
• Já avisámos o utilizador?
• Quando é podemos voltar a tentar?
• O problema já está resolvido?
• Se é para rebentar, fazê-lo ASAP!
Sistema de Ficheiros
• Surpresas do Python em Windows (para quem vem do Unix)
• rename() se ficheiro de destino já existe, erro
• open(<path>, ‘rb’) abertura em modo exclusivo -> várias aplicações
partem
• readlink() (suporte para symlinks em Windows) não existe
• Tesourinhos: PROGRA~1 -> Usar GetLongPathNameW()
• OS X e Linux
• Pop quiz: link(file1, file2); rename(file1, file2). O que acontece?
Hint: é diferente de mv file1 file2
Nomes de ficheiros
Unicode Normalization
NFC, NFD, NFKC, NFKD
Nomes de ficheiros
(pequeno guia para manter a sanidade mental)
• Em Windows, utilizar paths Unicode e “Long Path Names”, e.g.
u’?C:file.txt' (>= Windows Vista)
• Em OS X, filesystem utiliza NFD
>>> unicodedata.normalize('NFC', u'João').encode('utf-8')
'Joxc3xa3o'
>>> unicodedata.normalize('NFD', u'João').encode('utf-8')
'Joaxccx83o'
• Em Linux, vale tudo :(
Rede
(Much love for pycurl and pyuv)
• Reutilizar ligações para reduzir overhead handshake TCP e SSL
• Transferências simultâneas
• Mitigar overhead relacionado com disk seeks, deltas rsync, etc.
• Minimizar efeito “dente de serra” do TCP quando a latência ou
packet loss são elevados
• Enviar apenas o que foi modificado (deltas rsync)
• SSL/TLS: garantir que os certificados são mesmo validados. Bonus
points: Certificate Pinning
• Tratar timeouts, resets, stalls, outros.
CPU
• “O Python é lento” -> ineficiente, battery hog?
• “O Python não consegue usar mais que um
processador em simultâneo” o “drama” do GIL
(Global Interpreter Lock)”
CPU
• O core é IO-bound (filesystem e rede)
• Tarefas que usam mais CPU implementadas em C:
• Crypto (block hashes, cifra client-side, SSL)
• deltas rsync
• sqlite (Row objects are cool)
CPU
• Na verdade, o GIL é liberto em muitos casos:
• Quando há IO (rede, filesystem)
• Quando os módulos querem :)
The GIL is free
• Cython
• Quando em dúvida, profile stuff: cProfile, logs (!), etc.
CPU
10x mais rápido :)
Memória
6 lessons from Dropbox, on http://highscalability.com/
Memória
:(
malloc(…)
free(obj1)
free(obj3)
Memória
To the moon!
Memória
• Melhorou muito a partir do Python 3.4 (issue #11849)
• Fizemos backport do novo memory allocator
(mmap/VirtualAlloc based) para o nossa versão do Python
• Exemplo: Quanta RAM precisamos para sincronizar?:
• 148.887 ficheiros (100.000 ficheiros aleatórios de 10KB +
Linux 3.14 source tree):
• Ficheiro 50GB (much data)
Memória
MB 100k ficheiros kernel tree
ficheiro 50 GB
force reclaim
50 MB RAM
API Pública
API Pública
• Autenticação:
• OAuth 1.0a
• OAuth 2.0
• Documentação:
• https://meocloud.pt/developers
• Superset da API REST da Dropbox
• 40+ operações
Exemplos
• Long-polling para notificação de alterações
• Key-Value store por user e por aplicação
• Download de pasta como zip
• Thumbnails
• …
• 95% da funcionalidade do web site
Use case(s)
• Cameras + Long polling = motion sensor
• CopyRef + Proximidade = instant transfers
• Upload 2 me = transferências anónimas
Perguntas?
Obrigado

Más contenido relacionado

La actualidad más candente

Tópicos Avancados com DBExpress Framework e Firebird
Tópicos Avancados com DBExpress Framework e FirebirdTópicos Avancados com DBExpress Framework e Firebird
Tópicos Avancados com DBExpress Framework e FirebirdKelver Merlotti
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesJoao Galdino Mello de Souza
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website CacheavelLucas Brasilino
 
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters) iG - Internet Group do Brasil S/A
 
Linux Network Fault Tolerance
Linux Network Fault ToleranceLinux Network Fault Tolerance
Linux Network Fault ToleranceFrederico Madeira
 
Alta disponibilidade com PostgreSQL
Alta disponibilidade com PostgreSQLAlta disponibilidade com PostgreSQL
Alta disponibilidade com PostgreSQLLeonardo Cezar
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopAlexei Znamensky
 
Instalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosAlexandre Almeida
 
Projeto Terminais Leves Linux
Projeto Terminais Leves LinuxProjeto Terminais Leves Linux
Projeto Terminais Leves LinuxMarco Neves
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneosFernando Ike
 
Iseltech13 – Node.Js Like a Star Wars episode
Iseltech13 –  Node.Js Like a Star Wars episodeIseltech13 –  Node.Js Like a Star Wars episode
Iseltech13 – Node.Js Like a Star Wars episodeNuno Paz
 

La actualidad más candente (18)

Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
Tópicos Avancados com DBExpress Framework e Firebird
Tópicos Avancados com DBExpress Framework e FirebirdTópicos Avancados com DBExpress Framework e Firebird
Tópicos Avancados com DBExpress Framework e Firebird
 
Virtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno Domingues
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website Cacheavel
 
Aula Windows 1
Aula Windows 1Aula Windows 1
Aula Windows 1
 
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
TDC2010 - Trilha Python: Python no iG (Automação de Datacenters)
 
(14) ftp
(14) ftp(14) ftp
(14) ftp
 
Linux Network Fault Tolerance
Linux Network Fault ToleranceLinux Network Fault Tolerance
Linux Network Fault Tolerance
 
Alta disponibilidade com PostgreSQL
Alta disponibilidade com PostgreSQLAlta disponibilidade com PostgreSQL
Alta disponibilidade com PostgreSQL
 
Palestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl WorkshopPalestra DataFlow - II São Paulo Perl Workshop
Palestra DataFlow - II São Paulo Perl Workshop
 
Instalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutos
 
Google File System
Google File SystemGoogle File System
Google File System
 
Projeto Terminais Leves Linux
Projeto Terminais Leves LinuxProjeto Terminais Leves Linux
Projeto Terminais Leves Linux
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneos
 
Projeto OpenJDK [Java8]
Projeto OpenJDK [Java8]Projeto OpenJDK [Java8]
Projeto OpenJDK [Java8]
 
Node slide
Node slideNode slide
Node slide
 
GlusterFs
GlusterFsGlusterFs
GlusterFs
 
Iseltech13 – Node.Js Like a Star Wars episode
Iseltech13 –  Node.Js Like a Star Wars episodeIseltech13 –  Node.Js Like a Star Wars episode
Iseltech13 – Node.Js Like a Star Wars episode
 

Similar a MEO Cloud - Python Lisbon Meetup

Tecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensTecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensAlessandro Binhara
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoelliando dias
 
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...Lucas A. Romão
 
Plataforma Zope Plone na PGR
Plataforma Zope Plone na PGRPlataforma Zope Plone na PGR
Plataforma Zope Plone na PGRLucas Brasilino
 
SNMP - Rafael Rodriques
SNMP - Rafael RodriquesSNMP - Rafael Rodriques
SNMP - Rafael Rodriquesmarleigrolli
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolarisCindy Dalfovo
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolarisguest830f1
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceTiago Peczenyj
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Marcelo Dieder
 
OpenBSD Segurança por Padrão
OpenBSD Segurança por PadrãoOpenBSD Segurança por Padrão
OpenBSD Segurança por Padrãowsouzant
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeStefan Teixeira
 
História dos Sistemas - Por que estamos fazendo desse jeito
História dos Sistemas - Por que estamos fazendo desse jeitoHistória dos Sistemas - Por que estamos fazendo desse jeito
História dos Sistemas - Por que estamos fazendo desse jeitoLeo Lorieri
 
GDG Conf Node JS sem segredos
GDG Conf Node JS sem segredosGDG Conf Node JS sem segredos
GDG Conf Node JS sem segredosCaio Cutrim
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e MemcacheAndre Golvea
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...BHack Conference
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Getup Cloud
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Apresentação Openstack - FISL 2013
Apresentação Openstack - FISL 2013Apresentação Openstack - FISL 2013
Apresentação Openstack - FISL 2013Marcelo Dieder
 

Similar a MEO Cloud - Python Lisbon Meetup (20)

Tecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensTecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvens
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...
Microsoft Azure Storage - Tudo o que você precisa saber sobre armazenamento d...
 
Plataforma Zope Plone na PGR
Plataforma Zope Plone na PGRPlataforma Zope Plone na PGR
Plataforma Zope Plone na PGR
 
SNMP - Rafael Rodriques
SNMP - Rafael RodriquesSNMP - Rafael Rodriques
SNMP - Rafael Rodriques
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolaris
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolaris
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open source
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?
 
OpenBSD Segurança por Padrão
OpenBSD Segurança por PadrãoOpenBSD Segurança por Padrão
OpenBSD Segurança por Padrão
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
História dos Sistemas - Por que estamos fazendo desse jeito
História dos Sistemas - Por que estamos fazendo desse jeitoHistória dos Sistemas - Por que estamos fazendo desse jeito
História dos Sistemas - Por que estamos fazendo desse jeito
 
GDG Conf Node JS sem segredos
GDG Conf Node JS sem segredosGDG Conf Node JS sem segredos
GDG Conf Node JS sem segredos
 
PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...
Palestra Tony Rodrigues - OctaneLabs WarpSpeed Project – Computação Forense e...
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Apresentação Openstack - FISL 2013
Apresentação Openstack - FISL 2013Apresentação Openstack - FISL 2013
Apresentação Openstack - FISL 2013
 

MEO Cloud - Python Lisbon Meetup

Notas del editor

  1. Feito por utilizadores ávidos da concorrência
  2. SSL entre clientes e os nossos servidores, e AES 128 em counter mode
  3. Objectos que têm referências para eles durante muito tempo, acabam por demorar muito mais tempo a ser coletados pelo GC quando finalmente deixam de ter.
  4. APIs diferentes: POSIX vs Win32. Filesystems diferentes ext4, NTFS, HFS, etc. APIs de eventos de fs diferentes. Sincronização: queríamos os ficheiros disponíveis offline: FUSE/WebDAV descartados
  5. Porquê Python? Desenvolvimento rápido Porquê C? Integração com sistemas operativos Desempenho Python 2.7 (alguns módulos ainda não são compatíveis com Python 3 - thrift) Custom stuff: assinaturas digitais, release buffers, bug fixes stat() (symlinks)
  6. Gostávamos de partilhar alguma coisas que aprendemos ao longo do desenvolvimento da app. Algumas delas são mais ou menos óbvias, outras apanharam-nos de surpresa. Esperamos que possam utilizar esta informação para melhorar as vossas aplicações :)
  7. Há muitos erros diferentes a lidar com o filesystem. Rede é relativamente fácil: timeouts e stalls -> libcurl dá-nos erros uniformes. Retry.
  8. Códigos de erros diferentes entre POSIX e Windows. Fomos surpreendidos por vários erros. errno 22?
  9. POSIX 30 e tal erros (para fs). Win32: over 9000 :)
  10. Point: Desenvolver uma camada de gestão de erros foi muito importante. Numa webapp, podemos safar-nos com o “tente mais tarde”. Aqui não. Lidar com erros vs esconder erros :)
  11. Short Path Names: MAX_PATH=260
  12. unicode tem várias formas. não é tão uniforme como seria esperado
  13. Caso real: ficheiros nfd-normalized no servidor, finder auto-refresh O que fizémos: escolher um formato interno e usá-lo (encode/decode).
  14. Não entrar nos subpontos! Error handling rede: é mais simples porque as libs de http dão erros uniformes
  15. Não queríamos que a app fosse pesada e usasse muito CPU.
  16. Cool stuff O GIL pode ser libertado a partir do Cython também É possível chamar código nativo (C) a partir do Cython sem overhead
  17. Versões alfa usavam > 1 GB de RAM para sincronizar 100.000 ficheiros A fragmentação em linguagens de scripting é complexa devido ao fraco controlo da gestão de memória
  18. Java resolve PyPy resolve
  19. Em vez de game over, o SO dá-nos mais memória
  20. - Módulos de eventos de filesystem não eram simpáticos (macfsevents) mmap evita o problema da fragmentação
  21. - Módulos de eventos de filesystem não eram simpáticos (macfsevents) mmap evita o problema da fragmentação
  22. Aplicações móveis usam esta API Praticamente tudo o que se faz no webclient pode ser feito através da API