Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Back End Performático - CPGoiás 2019

Diana Arnos
September 06, 2019

Back End Performático - CPGoiás 2019

Apresentada durante o PHPWeekend 2019 (https://brasil.campus-party.org/campus-party-goias/)

Trabalhar a performance no backend vai muito além de simplesmente "subir mais máquinas".
Vamos apontar alguns gargalos comuns que podem ser tratados ou evitados desde o começo do desenvolvimento, já que não dependem da tecnologia utilizada.

Diana Arnos

September 06, 2019
Tweet

More Decks by Diana Arnos

Other Decks in Programming

Transcript

  1. Backend Performático
    Além do “aumenta a máquina lá”

    View Slide

  2. @dianaarnos
    Dev, Sec, Music, Kung Fu.
    Dev / Arquiteta @ Senhasegura
    Evangelista @ PHPSP
    Evangelista @ PHPWomenBR

    View Slide

  3. ERA UMA VEZ UMA APLICAÇÃO WEB...

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. ENTÃO, UM DIA...

    View Slide

  12. - CARA, A RESPOSTA TÁ MEIO LENTA...

    View Slide

  13. - AUMENTA A MÁQUINA LÁ

    View Slide

  14. - AUMENTA A MÁQUINA LÁ
    a.k.a.: escalonamento vertical

    View Slide

  15. View Slide

  16. View Slide

  17. - AINDA TÁ MEIO LENTO...

    View Slide

  18. - BOTA MAIS MÁQUINA LÁ

    View Slide

  19. - BOTA MAIS MÁQUINA LÁ
    a.k.a.: escalonamento horizontal

    View Slide

  20. View Slide

  21. LOAD BALANCER

    View Slide

  22. E NUNCA MAIS TIVERAM PROBLEMAS.

    View Slide

  23. View Slide

  24. SERÁ?

    View Slide

  25. E VOCÊ, DEV?

    View Slide

  26. E VOCÊ, DEV?
    JÁ ANALISOU O
    SEU CÓDIGO?

    View Slide

  27. BANCO DE DADOS

    View Slide

  28. View Slide

  29. View Slide

  30. DE QUAIS TABELAS VOCÊ PRECISA?

    View Slide

  31. COMO AS TABELAS ESTÃO
    ESTRUTURADAS?

    View Slide

  32. COMO VOCÊ FAZ AS QUERIES?

    View Slide

  33. MUITOS JOINS?

    View Slide

  34. MUITOS JOINS?
    ÚNICO GRANDE INSERT OU VÁRIOS PEQUENOS
    INSERTS?

    View Slide

  35. MUITOS JOINS?
    ÚNICO GRANDE INSERT OU VÁRIOS PEQUENOS
    INSERTS?
    QUANTAS REQUISIÇÕES AO BANCO POR MINUTO?

    View Slide

  36. PREPARED STATEMENT

    View Slide

  37. $query = "SELECT * FROM usuarios WHERE " .
    "username = :usuario OR username = administrador";
    $stmt->bindValue(":usuario", $username);
    $stmt->bindValue(":administrador", "admin");

    View Slide

  38. $query = "SELECT * FROM usuarios WHERE " .
    "username = :usuario OR username = administrador";
    $stmt->bindValue(":usuario", $username);
    $stmt->bindValue(":administrador", "admin");

    View Slide

  39. $query = "SELECT * FROM usuarios WHERE " .
    "username = :usuario OR username = administrador";
    $stmt->bindValue(":usuario", $username);
    $stmt->bindValue(":administrador", "admin");

    View Slide

  40. $query = "SELECT * FROM usuarios WHERE " .
    "username = :usuario OR username = administrador";
    $stmt->bindValue(":usuario", $username);
    $stmt->bindValue(":administrador", "admin");

    View Slide

  41. CACHE

    View Slide

  42. O QUÊ?

    View Slide

  43. - BUSCAS FREQUENTES NO BANCO

    View Slide

  44. - BUSCAS FREQUENTES NO BANCO
    - OBJETOS

    View Slide

  45. - BUSCAS FREQUENTES NO BANCO
    - OBJETOS
    - RESPONSES INTEIRAS

    View Slide

  46. COMO/ONDE?

    View Slide

  47. - MEMÓRIA

    View Slide

  48. - MEMÓRIA
    - SERVIÇO (EX. REDIS)

    View Slide

  49. - MEMÓRIA
    - SERVIÇO (EX. REDIS)
    - DISCO

    View Slide

  50. CUIDADO

    View Slide

  51. O “O QUÊ” É TÃO IMPORTANTE QUANTO O
    “COMO”

    View Slide

  52. View Slide

  53. COMO VAI O SEU CÓDIGO?

    View Slide

  54. COMO VAI O SEU CÓDIGO?
    SUA LÓGICA?

    View Slide

  55. COMO VAI O SEU CÓDIGO?
    SUA LÓGICA?
    SEUS ALGORITMOS?

    View Slide

  56. BIG O

    View Slide

  57. FIBONACCI

    View Slide

  58. FIBONACCI
    public function getFibonacci (int $number): int
    {
    if ($number <= 1) {
    return $number;
    } else {
    return getFibonacci($number - 1) + getFibonacci($number - 2);
    }
    }

    View Slide

  59. FIBONACCI
    Quantas linhas de código vão rodar para dado input n?
    T(n)?
    T(0) = 2
    T(1) = 2
    T(2) = 3 + T(1) + T(0)
    T(3) = 3 + T(2) + T(1)
    T(4) = 3 + T(3) + T(2)
    ...
    Observando a progressão, temos:
    Dado n = 0 ou n =1, T(n) = 2

    View Slide

  60. FIBONACCI

    View Slide

  61. FIBONACCI
    Com o processamento de 1GHz,
    levaríamos aproximadamente 56 mil
    anos para calcular T(100)

    View Slide

  62. FIBONACCI

    View Slide

  63. FIBONACCI
    0, 1, 1, 2, 3, 5, 8, 13, 21...
    0 + 1 = 1
    0, 1, 1
    1 + 1 = 2
    0, 1, 1, 2
    1 + 2 = 3
    0, 1, 1, 2, 3
    2 + 3 = 5
    0, 1, 1, 2, 3, 5
    3 + 5 = 8
    0, 1, 1, 2, 3, 5, 8
    ...

    View Slide

  64. FIBONACCI
    public function getFibonacci (int $number): int
    {
    $fibonacci[0] = 0;
    $fibonacci[1] = 1;
    for ($i = 2; $i <= $number; $i++) {
    $fibonacci[$i] = $fibonacci[$i-1] + $fibonacci[$i-2];
    }
    return $fibonacci[$number];
    }

    View Slide

  65. FIBONACCI
    Calculando quantas linhas de código rodam para cada
    iteração, considerando que as 3 primeiras linhas e a
    última (return) vão rodar sempre:
    T(2) = 4 + 2 = 6
    T(3) = 4 + 2 + 2 = 8
    T(4) = 4 + 2 + 2 + 2 = 10
    ...
    T(n) = 2n + 2

    View Slide

  66. MUITO MAIS RÁPIDO

    View Slide

  67. E LEMBREM-SE:

    View Slide

  68. View Slide

  69. View Slide

  70. OBRIGADA!
    Fale comigo: @dianaarnos (twitter, instagram, github)

    View Slide