$30 off During Our Annual Pro Sale. View Details »

Pilares da Escalabilidade: Estratégias de Otimização e Melhoria de Performance

Rafael Ponte
September 06, 2023

Pilares da Escalabilidade: Estratégias de Otimização e Melhoria de Performance

Conheça os 3 pilares para escalar qualquer aplicação web e distribuída, partindo de passos mais simples e baratos até passos mais rebuscados e complexos.

(PS: melhorar descrição)

Rafael Ponte

September 06, 2023
Tweet

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. PILARES DA ESCALABILIDADE
    Estratégias de Otimização e Melhoria de Performance

    View Slide

  2. o hype

    venceu…

    View Slide

  3. Hype-Driven Development
    https://blog.daftcode.pl/hype-driven-development-3469fc2e9b22

    View Slide

  4. View Slide

  5. View Slide

  6. …e de todas as modas

    View Slide

  7. View Slide

  8. https://deniseyu.io/art/

    View Slide

  9. https://deniseyu.io/art/

    View Slide

  10. View Slide

  11. Se você não tem pré-
    requisito de
    desempenho ou
    throughput então você
    não tem problema de
    escala.

    View Slide

  12. View Slide

  13. Microservices não
    existe para escalar
    aplicações, mas
    sim para escalar
    times.

    View Slide

  14. https://www.youtube.com/watch?v=GBTdnfD6s5Q

    View Slide

  15. https://www.youtube.com/watch?v=GBTdnfD6s5Q
    “ Eu não escrevi um livro
    sobre microservices, mas sim
    sobre como você arquiteta
    para Entrega Contínua. ”
    — Sam Newman

    View Slide

  16. View Slide

  17. View Slide

  18. View Slide

  19. The monolith to microservices

    SPECTRUM
    https://chrisscott.me/the-monolith-to-microservice-spectrum/

    View Slide

  20. The monolith to microservices

    SPECTRUM
    https://chrisscott.me/the-monolith-to-microservice-spectrum/

    View Slide

  21. The monolith to microservices

    SPECTRUM
    https://chrisscott.me/the-monolith-to-microservice-spectrum/

    View Slide

  22. The monolith to microservices

    SPECTRUM
    https://chrisscott.me/the-monolith-to-microservice-spectrum/

    View Slide

  23. Um bom arquiteto escolhe
    tecnologias por suas
    DESVANTAGENS

    View Slide

  24. https://twitter.com/argentinomota/status/1222941731424960515?s=20

    View Slide

  25. podemos escalar
    SEM o hype?

    View Slide

  26. podemos escalar
    SEM o hype?

    View Slide

  27. podemos escalar
    SEM o hype?

    View Slide

  28. podemos escalar
    SEM o hype?

    View Slide

  29. Rafael Ponte


    @rponte

    View Slide

  30. View Slide

  31. View Slide

  32. Fortaleza - Terra do Sol

    View Slide

  33. View Slide

  34. PILARES DA ESCALABILIDADE
    Estratégias de Otimização e Melhoria de Performance

    View Slide

  35. Como escalar minha
    app para MILHARES de
    usuários?

    View Slide

  36. Loja Virtual

    View Slide

  37. View Slide

  38. View Slide

  39. Revisitando a Web…

    View Slide

  40. servidor

    View Slide

  41. servidor

    View Slide

  42. navegador
    servidor

    View Slide

  43. navegador
    servidor
    requisição

    View Slide

  44. navegador
    servidor db
    requisição

    View Slide

  45. navegador
    servidor db
    requisição
    resposta

    View Slide

  46. navegador
    servidor db
    requisição
    resposta

    View Slide

  47. 2 conceitos
    importantes

    View Slide

  48. Performance

    X

    Escalabilidade

    View Slide

  49. tempo de resposta


    (response time)
    performance

    View Slide

  50. tempo de resposta


    (response time)
    performance

    View Slide

  51. navegador
    servidor db
    requisição
    resposta

    View Slide

  52. navegador
    servidor db
    requisição
    resposta
    tempo resposta

    View Slide

  53. navegador
    servidor db
    requisição
    resposta
    tempo resposta: 100ms

    View Slide

  54. operações / unidade_tempo


    (throughput)
    escalabilidade

    View Slide

  55. operações / unidade_tempo


    (throughput)
    escalabilidade

    View Slide

  56. usuários / minuto


    (throughput)
    escalabilidade

    View Slide

  57. usuários / segundo


    (throughput)
    escalabilidade

    View Slide

  58. usuários / segundo


    (throughput)
    escalabilidade

    View Slide

  59. requisições / segundo


    (throughput)
    escalabilidade

    View Slide

  60. navegador
    servidor db
    requisição
    resposta

    View Slide

  61. navegador
    servidor db
    requisição
    resposta
    tempo resposta: 100ms

    View Slide

  62. servidor db
    requisição
    resposta
    tempo resposta: 100ms

    View Slide

  63. servidor db
    requisição
    resposta
    tempo resposta: 100ms

    View Slide

  64. servidor db
    requisição
    resposta
    tempo resposta: 1s

    View Slide

  65. servidor db
    requisição
    resposta
    tempo resposta: 7s

    View Slide

  66. servidor db
    requisição
    resposta
    tempo resposta: 24s

    View Slide

  67. servidor db
    requisição
    resposta
    tempo resposta: 0

    View Slide

  68. nossa aplicação não escala mais
    do que: 80 req/s

    View Slide

  69. navegador
    servidor db
    requisição
    resposta
    throughput: 80 req/s

    View Slide

  70. navegador
    servidor db
    requisição
    resposta
    throughput: 250 req/s

    View Slide

  71. navegador
    servidor db
    requisição
    resposta
    throughput: 1000 req/s

    View Slide

  72. PASSOS
    5
    RESUMINDO EM

    View Slide

  73. Passo 1

    (TUNANDO A APLICAÇÃO)

    View Slide

  74. navegador
    servidor db
    requisição
    resposta

    View Slide

  75. navegador
    servidor db
    requisição
    resposta

    View Slide

  76. View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. View Slide

  81. View Slide

  82. JVM

    View Slide

  83. View Slide

  84. 2Gb

    View Slide

  85. 2Gb
    ???

    View Slide

  86. 2Gb
    256Mb

    View Slide

  87. 2Gb
    ??Mb

    View Slide

  88. 2Gb
    2Gb

    View Slide

  89. 2Gb
    2Gb
    =

    View Slide

  90. 2Gb
    2Gb
    =
    X

    View Slide

  91. 2Gb
    1Gb

    View Slide

  92. 2Gb
    1Gb
    -Xms256m -Xmx1024m 

    -XX:MaxPermSize=192m

    View Slide

  93. 2Gb
    1Gb
    -Xms256m -Xmx1024m 

    -XX:MaxPermSize=192m

    View Slide

  94. 2Gb
    1Gb
    -Xms256m -Xmx1024m 

    -XX:MaxPermSize=192m
    minimo != maximo

    View Slide

  95. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    minimo = maximo

    View Slide

  96. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    Heap Size

    View Slide

  97. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m

    View Slide

  98. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    PermGen Size

    View Slide

  99. 2Gb
    1Gb

    View Slide

  100. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    memoria

    View Slide

  101. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    -server
    modo servidor
    memoria

    View Slide

  102. 2Gb
    1Gb
    -Xms1024m -Xmx1024m 

    -XX:MaxPermSize=192m
    -XX:+UseConcMarkSweepGC

    -XX:+CMSParallelRemarkEnabled
    -server
    modo servidor
    memoria
    coletor de lixo (GC)

    View Slide

  103. Ganhou fôlego,
    mas…

    View Slide

  104. navegador
    servidor db
    requisição
    resposta

    View Slide

  105. servidor
    Aplicação

    View Slide

  106. servidor

    View Slide

  107. servidor
    Produto.java
    Venda.java
    BancoDeDados.java
    FinalizarCompra.java
    Pagamento.java
    carrinhoDeCompras.jsp
    index.jsp
    site.css
    app.js
    GravaProduto.java
    EnviaEmail.java
    GravaProdutoServlet.java
    fi
    nalizar-compra.jsp

    View Slide

  108. servidor

    View Slide

  109. servidor

    View Slide

  110. servidor

    View Slide

  111. Divisão de Camadas

    View Slide

  112. servidor

    View Slide

  113. servidor
    modelo

    View Slide

  114. servidor
    modelo
    telas

    View Slide

  115. servidor
    modelo
    acesso a dados
    telas

    View Slide

  116. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  117. servidor
    apresentação
    negócio
    persistência
    controle das telas
    camadas

    View Slide

  118. servidor
    apresentação
    negócio
    persistência
    controle das telas
    logica de negocio
    camadas

    View Slide

  119. servidor
    apresentação
    negócio
    persistência
    controle das telas
    logica de negocio
    acesso a banco e dados
    camadas

    View Slide

  120. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  121. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  122. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  123. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  124. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  125. servidor
    apresentação
    negócio
    persistência
    camadas

    View Slide

  126. navegador
    servidor db
    requisição
    resposta

    View Slide

  127. navegador
    servidor db
    requisição
    resposta
    tempo resposta: 1000ms

    View Slide

  128. navegador
    servidor db
    requisição
    resposta
    tempo resposta: 1000ms
    700ms

    View Slide

  129. navegador
    servidor db
    requisição
    resposta
    tempo resposta: 1000ms
    700ms

    View Slide

  130. servidor
    db

    View Slide

  131. db
    apresentação
    negócio
    persistência

    View Slide

  132. db
    apresentação
    negócio
    persistência
    Transaction Response Time

    View Slide

  133. db
    T =
    apresentação
    negócio
    persistência

    View Slide

  134. db
    T = Tacq
    apresentação
    negócio
    persistência

    View Slide

  135. db
    T = Tacq + Treq
    apresentação
    negócio
    persistência

    View Slide

  136. db
    T = Tacq + Treq + Texec
    apresentação
    negócio
    persistência

    View Slide

  137. db
    T = Tacq + Treq + Texec + Tres
    apresentação
    negócio
    persistência

    View Slide

  138. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  139. quanto menor o transaction
    response time, maior o
    throughput

    View Slide

  140. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  141. navegador
    servidor db

    View Slide

  142. navegador
    servidor db
    1 requisição 1 conexão

    View Slide

  143. navegador
    servidor db
    10 requisições 10 conexões

    View Slide

  144. navegador
    servidor db
    100 requisições
    100 conexões

    View Slide

  145. navegador
    servidor db
    1000 requisições
    1000 conexões

    View Slide

  146. navegador
    servidor db
    1001 requisições
    0 conexões

    View Slide

  147. Criar conexões
    é CARO!

    View Slide

  148. navegador db
    app

    View Slide

  149. navegador db
    app

    View Slide

  150. navegador db
    app

    View Slide

  151. navegador db
    app
    ini=5

    View Slide

  152. db
    app
    ini=5

    View Slide

  153. db
    app …
    max=30
    ini=5

    View Slide

  154. db
    app …
    max=30
    ini=5

    View Slide

  155. db
    app
    min=3 max=30
    ini=5

    View Slide

  156. navegador db
    connection pool
    app
    min=3 max=30
    ini=5

    View Slide

  157. quanto mais rápido obter
    uma conexão, menor o
    response time

    View Slide

  158. mas qual o tamanho
    ideal do pool?

    View Slide

  159. https://mobile.twitter.com/Nick_Craver/status/969043553711218691

    View Slide

  160. mensure!

    View Slide

  161. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  162. View Slide

  163. Habilite o Batch Size

    View Slide

  164. @Entity
    public class Produto {
    @Id
    @GeneratedValue
    private Integer id;
    private String nome;
    // outros atributos
    }

    View Slide

  165. List produtos = //...
    for (Produto p : produtos) {
    entityManager.persist(p);
    }
    Persistindo várias entidades

    View Slide

  166. INSERT INTO produto(nome, id) VALUES ('Prod.1', 1)
    INSERT INTO produto(nome, id) VALUES ('Prod.2', 2)
    INSERT INTO produto(nome, id) VALUES ('Prod.3', 3)
    INSERT INTO ...
    3 roundtrips

    View Slide



  167. name="hibernate.jdbc.batch_size"


    value="50"


    />
    persistence.xml

    View Slide



  168. name="hibernate.jdbc.batch_size"


    value="50"


    />
    persistence.xml

    View Slide

  169. List produtos = //...
    for (Produto p : produtos) {
    entityManager.persist(p);
    }
    Persistindo várias entidades

    View Slide

  170. INSERT INTO produto(nome, id) VALUES (?, ?)
    Params: [('Prod.1', 1), ('Prod.2', 2), ('Prod.3', 3)]
    1 roundtrip

    View Slide

  171. Params: [('Prod.1', 1), ('Prod.2', 2), (‘Prod.3', 3)]
    1 roundtrip
    INSERT INTO produto(nome, id) VALUES (?, ?)

    View Slide

  172. Para UPDATE e DELETE também

    View Slide

  173. List produtos = //...
    for (Produto p : produtos) {
    p.setNome(p.getNome()
    .toUpperCase());
    }
    Atualizando várias entidades

    View Slide

  174. UPDATE produto SET nome = ? WHERE id = ?
    Params: [('PROD.1', 1), ('PROD.2', 2), ('PROD.3', 3)]
    1 roundtrip

    View Slide

  175. List produtos = //...
    for (Produto p : produtos) {
    entityManager.remove(p);
    }
    Removendo várias entidades

    View Slide

  176. DELETE FROM produto WHERE id = ?
    Params: [(1), (2), (3)]
    1 roundtrip

    View Slide

  177. quanto menos roundtrips ao
    banco, menor o response time

    View Slide

  178. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  179. Use Consultas Planejadas


    (DTO Projections)

    View Slide

  180. @Entity
    class NotaFiscal {

    @OneToMany
    List itens;
    }

    View Slide

  181. NotaFiscal nf = entityManager
    .find(NotaFiscal.class, 42);

    processaItensDaNota(nf);
    Processando os itens de uma nota

    View Slide

  182. Processando os itens de uma nota
    NotaFiscal nf = entityManager
    .find(NotaFiscal.class, 42);

    processaItensDaNota(nf);

    View Slide

  183. Processando os itens de uma nota
    NotaFiscal nf = entityManager
    .find(NotaFiscal.class, 42);

    processaItensDaNota(nf);

    View Slide

  184. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    Hibernate executa 2 selects
    NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);

    View Slide

  185. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    SELECT i.*
    FROM Item i
    WHERE i.nota_fiscal_id = 42
    Hibernate executa 2 selects
    NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
    processaItensDaNota(nf);

    View Slide

  186. List notas = dao.lista();
    for (NotaFiscal nf : notas) {
    processaItensDaNota(nf);
    }
    Processando os itens de varias notas

    View Slide

  187. Processando os itens de varias notas
    List notas = dao.lista();
    for (NotaFiscal nf : notas) {
    processaItensDaNota(nf);
    }

    View Slide

  188. Processando os itens de varias notas
    List notas = dao.lista();
    for (NotaFiscal nf : notas) {
    processaItensDaNota(nf);
    }

    View Slide

  189. SELECT nf.* FROM NotaFiscal nf
    Hibernate executa n+1 selects
    List notas = dao.lista();

    View Slide

  190. SELECT nf.* FROM NotaFiscal nf
    Hibernate executa n+1 selects
    List notas = dao.lista();
    for (NotaFiscal nf : notas) {
    processaItensDaNota(nf);
    }
    SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
    SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
    SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
    SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
    SELECT i.* FROM Item i WHERE i.nota_fiscal_id=?
    ...

    View Slide

  191. são muitos hits ao banco


    (Select N+1)

    View Slide

  192. são muitos hits ao banco


    (Select N+1)

    View Slide

  193. solução?

    View Slide

  194. @Entity
    class NotaFiscal {

    @OneToMany(fetch=FetchType.EAGER)
    List itens;
    }
    Utilizando FetchMode=EAGER

    View Slide

  195. Hibernate executa 1 select
    List notas = dao.lista();

    View Slide

  196. SELECT nf.*, i.*
    FROM NotaFiscal nf
    LEFT OUTER JOIN Item i
    ON nf.id = i.nota_fiscal_id

    Hibernate executa 1 select
    List notas = dao.lista();

    View Slide

  197. antes de de
    fi
    nir um mapeamento
    global deste tipo você precisa se
    perguntar...

    View Slide

  198. SEMPRE que uma Nota é carregada,
    todos seus Itens também são
    necessários?

    View Slide

  199. não?

    View Slide

  200. @Entity
    class NotaFiscal {

    @OneToMany(fetch=FetchType.LAZY)
    List itens;
    }
    Utilizando FetchMode=LAZY

    View Slide

  201. entityManager

    .createQuery(
    "SELECT n
    FROM NotaFiscal n
    LEFT JOIN fetch n.itens")

    .getResultList();
    Utilizando Join Fetch

    View Slide

  202. entityManager

    .createQuery(
    "SELECT n
    FROM NotaFiscal n
    LEFT JOIN fetch n.itens")

    .getResultList();
    Utilizando Join Fetch
    habilita EAGER em
    mapeamentos
    LAZY

    View Slide

  203. Opa! Não para aí…

    View Slide

  204. SEMPRE que uma Nota é carregada,
    TODAS as colunas são
    necessárias?

    View Slide

  205. não?

    View Slide

  206. List notas =
    entityManager

    .createQuery(
    “SELECT n
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")

    .getResultList();
    DTO Projections

    View Slide

  207. List notas =
    entityManager

    .createQuery(
    “SELECT n.numero, n.serie
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")

    .getResultList();
    DTO Projections

    View Slide

  208. List notas =
    entityManager

    .createQuery(
    "SELECT n.numero, n.serie
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .getResultList();
    DTO Projections

    View Slide

  209. List????> notas =
    entityManager

    .createQuery(
    "SELECT n.numero, n.serie
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .getResultList();
    DTO Projections

    View Slide

  210. class Devolucao {
    Integer numero;
    String serie;
    public Devolucao(Integer n, String s) {
    this.numero = n;
    this.serie = s;
    }
    // getters e setters
    }
    Criando o DTO

    View Slide

  211. List notas =
    entityManager

    .createQuery(
    "SELECT n.numero, n.serie
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .getResultList();
    DTO Projections

    View Slide

  212. List notas =
    entityManager

    .createQuery(
    “SELECT new Devolucao(n.numero, n.serie)
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .getResultList();
    DTO Projections

    View Slide

  213. SQL otimizado
    List notas = //...

    View Slide

  214. SELECT nf.numero, nf.serie
    FROM NotaFiscal nf
    WHERE nf.tipo = 'DEVOLUCAO'
    SQL otimizado
    List notas = //...

    View Slide

  215. Opa! Ainda carrega MUITAS linhas
    do banco…

    View Slide

  216. List notas =
    entityManager

    .createQuery(
    “SELECT new Devolucao(n.numero, n.serie)
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .getResultList();
    Paginação

    View Slide

  217. List notas =
    entityManager

    .createQuery(
    “SELECT new Devolucao(n.numero, n.serie)
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .setMaxResults(100)
    .getResultList();
    Paginação

    View Slide

  218. List notas =
    entityManager

    .createQuery(
    “SELECT new Devolucao(n.numero, n.serie)
    FROM NotaFiscal n
    WHERE n.tipo = 'DEVOLUCAO'")
    .setMaxResults(100)
    .getResultList();
    Paginação

    View Slide

  219. SQL otimizado
    List notas = //...

    View Slide

  220. SELECT nf.numero, nf.serie
    FROM NotaFiscal nf
    WHERE nf.tipo = ‘DEVOLUCAO'
    LIMIT 100
    SQL otimizado
    List notas = //...

    View Slide

  221. quanto menor a quantidade de
    dados recuperados, menor o
    response time

    View Slide

  222. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  223. Como otimizar minha query?

    View Slide

  224. SQL Nativo


    (deixe seu banco trabalhar)

    View Slide

  225. Stored Procedures


    (leve o processamento para os
    dados)

    View Slide

  226. View Slide

  227. DBA


    (peça ajuda)

    View Slide

  228. mesmo com todas essas
    melhorias…

    View Slide

  229. …PICOS de acessos
    podem aumentar
    nosso response time

    View Slide

  230. Caching


    (aliviando o banco de dados)

    View Slide

  231. NotaFiscal nf = entityManager
    .find(NotaFiscal.class, 42);

    Carregando uma nota por ID

    View Slide

  232. View Slide

  233. EM

    View Slide

  234. Banco de Dados
    EM

    View Slide

  235. Banco de Dados
    EM NotaFiscal nf = entityManager
    .find(NotaFiscal.class, 42);

    View Slide

  236. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    Hibernate executa 1 select
    NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);

    View Slide

  237. NotaFiscal nf1 = entityManager
    .find(NotaFiscal.class, 42);

    NotaFiscal nf2 = entityManager
    .find(NotaFiscal.class, 42);
    NotaFiscal nf3 = entityManager
    .find(NotaFiscal.class, 42);
    Carregando uma nota por ID

    View Slide

  238. NotaFiscal nf1 = entityManager
    .find(NotaFiscal.class, 42);

    NotaFiscal nf2 = entityManager
    .find(NotaFiscal.class, 42);
    NotaFiscal nf3 = entityManager
    .find(NotaFiscal.class, 42);
    Carregando uma nota por ID

    View Slide

  239. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    Hibernate executa 1 select
    NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);

    View Slide

  240. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    Hibernate executa 1 select
    NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);
    NotaFiscal nf2 = entityManger.find(NotaFiscal.class, 42);
    // sem SQL

    View Slide

  241. SELECT nf.*
    FROM NotaFiscal nf
    WHERE nf.id = 42
    Hibernate executa 1 select
    NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42);
    NotaFiscal nf2 = entityManger.find(NotaFiscal.class, 42);
    NotaFiscal nf3 = entityManger.find(NotaFiscal.class, 42);
    // sem SQL
    // sem SQL

    View Slide

  242. Banco de Dados
    EM

    View Slide

  243. Banco de Dados
    EM
    First Level Cache

    View Slide

  244. Banco de Dados
    EM

    View Slide

  245. Banco de Dados
    EM EM EM EM

    View Slide

  246. Banco de Dados
    ????
    EM EM EM EM

    View Slide

  247. Banco de Dados
    Second Level Cache
    EM EM EM EM

    View Slide

  248. Banco de Dados
    Second Level Cache
    EM Session Session
    Session
    EM EM EM
    First Level Cache

    View Slide

  249. Banco de Dados
    EntityManagerFactory
    EM EM EM EM

    View Slide



  250. name="hibernate.cache.second_level_cache"


    value="true" />


    persistence.xml
    #1 habilitamos o cache

    View Slide

  251. @Entity
    @Cache(...)
    class Produto {
    @Id
    private Long id;
    private String nome;
    }
    #2 con
    fi
    guramos as entidades

    View Slide

  252. db
    T = Tacq + Treq + Texec + Tres + Tidle
    apresentação
    negócio
    persistência

    View Slide

  253. a consulta mais rápida é
    aquela que nem chega no banco
    de dados

    View Slide

  254. db
    apresentação
    negócio
    persistência

    View Slide

  255. db
    apresentação
    negócio
    persistência

    View Slide

  256. db
    negócio
    persistência
    apresentação

    View Slide

  257. “There are only two hard things in
    Computer Science: cache invalidation
    and naming things.”
    — Phil Karlton

    View Slide

  258. navegador
    servidor db
    requisição
    resposta
    Performance Consistência

    View Slide

  259. E se houver um

    processamento PESADO?

    View Slide

  260. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido); // demorado...


    }


    }


    View Slide

  261. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido); // demorado...


    }


    }


    View Slide

  262. @Service


    public class PedidoService {




    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  263. navegador
    servidor db

    View Slide

  264. navegador
    servidor db

    View Slide

  265. navegador
    servidor db

    View Slide

  266. se a execução é custosa então
    ela é um possível gargalo…

    View Slide

  267. Assincronicidade


    (processa mais tarde)

    View Slide

  268. @Service


    public class PedidoService {




    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  269. @Service


    public class PedidoService {


    @Async


    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  270. Spring usa um
    pool de threads

    View Slide

  271. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido);


    }


    }


    View Slide

  272. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido);


    }


    }


    IMEDIATO!

    View Slide

  273. …e se além de
    custosa ela também
    for em grande
    quantidade?

    View Slide

  274. poderíamos usar
    uma
    fi
    la…

    View Slide

  275. navegador
    servidor db

    View Slide

  276. navegador
    servidor db
    X

    View Slide

  277. navegador
    servidor db
    fi
    la

    View Slide

  278. navegador
    servidor db
    fi
    la

    View Slide

  279. navegador
    servidor db
    fi
    la

    View Slide

  280. navegador
    servidor db
    fi
    la

    View Slide

  281. navegador
    servidor db
    fi
    la

    View Slide

  282. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido);


    }


    }


    View Slide

  283. @Controller


    public class PedidoController {


    @Autowired


    public PedidoService service;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    service.finaliza(pedido);


    }


    }


    View Slide

  284. @Controller


    public class PedidoController {


    @Autowired


    public JmsTemplate fila;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    fila.convertAndSend("fila.pedidos", pedido);


    }


    }


    View Slide

  285. e em algum momento um
    processo consumiria a
    fi
    la…

    View Slide

  286. navegador
    servidor db
    fi
    la

    View Slide

  287. navegador
    servidor db
    fi
    la
    consumidor

    View Slide

  288. servidor db
    fi
    la
    consumidor
    navegador

    View Slide

  289. servidor db
    fi
    la
    consumidor
    navegador

    View Slide

  290. servidor db
    fi
    la
    consumidor
    navegador

    View Slide

  291. @Service


    public class PedidoService {


    @Async


    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  292. @Service


    public class PedidoService {


    @Async


    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  293. @Service


    public class PedidoService {


    @JmsListener(destination="fila.pedidos")


    public void finaliza(Pedido pedido) {

    // efetua pagamento


    // dá baixa no estoque


    // atualiza pedido


    // envia email de confirmação


    }


    }


    View Slide

  294. no
    fi
    m nossa requisição
    continuaria respondendo
    imediatamente

    View Slide

  295. @Controller


    public class PedidoController {


    @Autowired


    public JmsTemplate fila;


    @PostMapping(path="/vendas/finaliza", ...)


    public void finalizaPedido(Pedido pedido) {


    // faz alguma validação de dados



    fila.convertAndSend("fila.pedidos", pedido);


    }


    }


    IMEDIATO!

    View Slide

  296. Wow!!

    View Slide

  297. 1) tunamos a JVM;


    2) tunanamos a camada de
    persistência;


    3) adicionamos caching;


    4) adicionamos processamento
    assincrono;

    View Slide

  298. 1) tunamos a JVM;


    2) tunamos a camada de
    persistência;


    3) adicionamos caching;


    4) adicionamos processamento
    assincrono;

    View Slide

  299. 1) tunamos a JVM;


    2) tunamos a camada de
    persistência;


    3) adicionamos caching;


    4) adicionamos processamento
    assincrono;

    View Slide

  300. 1) tunamos a JVM;


    2) tunamos a camada de
    persistência;


    3) adicionamos caching;


    4) adicionamos
    processamento assincrono;

    View Slide

  301. Sistema

    não aguenta?

    View Slide

  302. Passo 2

    (MELHORANDO A MÁQUINA)

    View Slide

  303. navegador
    servidor db
    requisição
    resposta

    View Slide

  304. navegador
    servidor db
    requisição
    resposta

    View Slide

  305. cpu
    memoria

    View Slide

  306. View Slide

  307. View Slide

  308. X

    View Slide

  309. View Slide

  310. View Slide

  311. View Slide

  312. x 6
    x 6

    View Slide

  313. Mais
    requisições?

    View Slide

  314. View Slide

  315. View Slide

  316. View Slide

  317. Escalabilidade Vertical


    (scale up)

    View Slide

  318. View Slide

  319. View Slide

  320. View Slide

  321. View Slide

  322. View Slide

  323. View Slide

  324. View Slide

  325. X

    View Slide

  326. Sistema

    não aguenta?

    View Slide

  327. Passo 3

    (ADICIONANDO MAIS MÁQUINAS)

    View Slide

  328. navegador
    servidor db
    requisição
    resposta

    View Slide

  329. navegador
    servidor db
    requisição
    resposta

    View Slide

  330. View Slide

  331. View Slide

  332. =

    View Slide

  333. View Slide

  334. View Slide

  335. View Slide

  336. ip?

    View Slide

  337. View Slide

  338. View Slide

  339. View Slide

  340. 200 reqs

    View Slide

  341. 200 reqs
    100 reqs
    100 reqs

    View Slide

  342. Balanceador
    de Carga

    View Slide

  343. Balanceador
    de Carga

    View Slide

  344. Balanceador
    de Carga

    View Slide

  345. View Slide

  346. Mais
    requisições?

    View Slide

  347. View Slide

  348. View Slide

  349. View Slide

  350. View Slide

  351. Cluster

    View Slide

  352. View Slide

  353. View Slide

  354. Escalabilidade Horizontal


    (scale out)

    View Slide

  355. Apesar de mais
    barata…

    View Slide

  356. View Slide

  357. (1a requisição)

    View Slide

  358. (1a requisição)

    View Slide

  359. Sessão

    View Slide

  360. (2a requisição)
    qual?

    View Slide

  361. (2a requisição)

    View Slide

  362. (2a requisição)

    View Slide

  363. Sticky Session

    View Slide


  364. View Slide

  365. Mas e se…

    View Slide

  366. View Slide

  367. View Slide

  368. View Slide

  369. View Slide

  370. View Slide

  371. View Slide

  372. View Slide

  373. View Slide

  374. View Slide

  375. ?

    View Slide

  376. ?

    View Slide

  377. Falta
    Redundância

    View Slide

  378. Passo 4

    (REPLICANDO ESTADO)

    View Slide

  379. View Slide

  380. (1a requisição)

    View Slide

  381. (1a requisição)

    View Slide

  382. (2a requisição)

    View Slide

  383. (2a requisição)
    qual?

    View Slide

  384. (2a requisição)

    View Slide

  385. (2a requisição)

    View Slide

  386. View Slide

  387. Session
    Replication

    View Slide

  388. View Slide

  389. View Slide

  390. View Slide

  391. View Slide

  392. Replica Estado

    View Slide

  393. View Slide

  394. Alta Disponibilidade


    (high availability)

    View Slide

  395. Mais
    requisições?

    View Slide

  396. View Slide

  397. View Slide

  398. View Slide

  399. View Slide

  400. Se tenho mais
    máquinas…

    View Slide

  401. View Slide

  402. View Slide

  403. View Slide

  404. View Slide

  405. Replicar sessão é
    CARO

    View Slide

  406. Passo 5

    (REMOVENDO ESTADO)

    View Slide

  407. View Slide

  408. View Slide

  409. View Slide

  410. View Slide

  411. X X X X X

    View Slide

  412. View Slide

  413. ONDE?

    View Slide

  414. View Slide

  415. View Slide

  416. View Slide

  417. View Slide

  418. View Slide

  419. Cache Distribuído

    View Slide

  420. Cache Distribuído

    View Slide

  421. Cache Distribuído

    View Slide

  422. View Slide

  423. STATELESS


    (shared nothing architecture)

    View Slide

  424. View Slide

  425. View Slide

  426. View Slide

  427. Mais
    requisições?

    View Slide

  428. View Slide

  429. 256GB

    View Slide

  430. 256GB 256GB

    View Slide

  431. Recapitulando…

    View Slide

  432. tunando sua aplicação

    View Slide

  433. tunando sua aplicação
    melhorando sua máquina

    View Slide

  434. tunando sua aplicação
    adicionando máquinas
    melhorando sua máquina

    View Slide

  435. tunando sua aplicação
    replicando estado
    adicionando máquinas
    melhorando sua máquina

    View Slide

  436. tunando sua aplicação
    replicando estado
    adicionando máquinas
    melhorando sua máquina
    removendo estado

    View Slide

  437. Todas
    plataformas

    View Slide

  438. View Slide

  439. CACHE

    View Slide

  440. CACHE
    PROCESSAMENTO
    ASSINCRONO

    View Slide

  441. CACHE
    BALANCEAMENTO
    DE CARGA
    PROCESSAMENTO
    ASSINCRONO

    View Slide

  442. Não escala
    ainda…

    View Slide

  443. View Slide

  444. View Slide

  445. View Slide

  446. e só então…

    View Slide

  447. View Slide

  448. Distributed System

    View Slide

  449. OBRIGADO!

    View Slide

  450. @rponte
    Rafael Ponte

    View Slide