O documento discute estratégias para otimização e escalabilidade de aplicações web, incluindo dicas para código eficiente, uso de caches, bancos de dados distribuídos e computação em nuvem.
2. Para quem não me conhece Graduando em ciência da computação pela UFES; Trabalho com internet há 9 anos; Gerente de Tecnologia do iMasters desde 2003; Obtive o ZendCertifiedEngineer para PHP5 em 2008;
6. Casos famosos Twitter – instabilidade devido a falha na estratégia de escalabilidade Digg – teve de mudar toda a arquitetura da aplicação para manter-se online World ofWarcraft – durante o lançamento, foi sobrecarregado e ficou fora do ar Youtube, LiveJournal, Facebook....
9. Código-fonte Dicas Profiling Infra-estrutura Usando cache opcode memcache Banco de dados Otimização de consultas Distribuindo banco de dados Distribuindo tarefas Arquiteturas escaláveis Computação em nuvem
11. Dicas echoé mais rápido que print(); utilize aspas simples ao invés de aspas duplas quando possível; evite métodos mágicos como __get, __set, __call e etc.. prefira require() ao require_once() quando possível; utilize caminhos absolutos sempre que possível; $array['foo'] é até 7x mais rápido do que que$array[foo]; evite o operador @ para ocultar erros; ...
15. Dicas Lembre-se de executar exit() depois dos redirecionamentos if($redirect) { header("Location: index.php"); } // algum código aqui
16. Dicas Lembre-se de executar exit() depois dos redirecionamentos if($redirect) { header("Location: index.php"); exit(); } // algum código aqui
17. Dicas Evite SQLs dentro de loops foreach($usuarios as $u) { mysql_query(" INSERT INTO usuario (nome, email) VALUES('".$u->nome."','".$u->email."') ", $conn); }
18. Dicas Evite SQLs dentro de loops $sql = "INSERT INTO usuario (nome, email) VALUES"; $values = array() foreach($usuarios as $u) { $values[] = "('".$u->nome."','".$u->email."')"; } mysql_query($sql.implode("," , $values), $conn);
19. Dicas Evite SQLs dentro de loops INSERT INTO usuario (nome, email) VALUES ('Leo Hackin','leo@hackin.com'), ('Almir Mendes','almir@mendes.com'), ('Reinaldo Junior','reinaldo@junior.com')
20. Dicas Utilize páginas estáticas Requisições a páginas estáticas não precisam carregar o engine PHP, economizando memória e diminuindo o tempo de resposta. Preste atenção aos índices do banco de dados A ausência de índices nas colunas que aparecem em cláusulas WHERE ou JOIN pode 'destruir' a performance da sua aplicação.
22. Profiling É a investigação do comportamento do script, através dos dados recolhidos durante a sua execução, com o objetivo de determinar quais partes podem ser otimizadas melhorando a velocidade e reduzindo o consumo de memória
40. Banco de dados Master-slave Um (e apenas um) master Um ou mais slaves Todas as escritas são enviadas ao master Leituras são distribuídas entre todos os nós Falhas Único ponto de falha Gargalo
41. Banco de dados Servidores de Aplicação Master Slave Slave Slave Escrita Leitura
42. Banco de dados Master-master Um ou mais masters Escritas e leituras vão para todos os masters Escritas são replicadas entre si Falhas Alta complexidade Introduz altas latências de comunicação
43. Banco de dados Servidores de Aplicação Master Master Master Escrita Leitura
44. Banco de dados Particionamento vertical Colocar as tabelas em servidores diferentes agrupadas por área funcional Escalona seus dados por funcionalidade Joins são realizados na aplicação Falhas Perde os relacionamentos reais do banco de dados Escalabilidade limitada
45. Banco de dados Servidores de Aplicação Clients Comments Products
46. Banco de dados Particionamento horizontal Separe os dados por chaves e coloque em servidores diferentes (sharding) Escalona seus dados por chave Joins são realizados na aplicação Necessita de um “roteamento” das consultas na aplicação Falha Perde os relacionamentos reais do banco de dados
47. Banco de dados Servidores de Aplicação Clients (i – q) Clients (r – z) Clients (a – h)