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

Arquitetura Java: Escalando Alem do Hype - #BSB...

Arquitetura Java: Escalando Alem do Hype - #BSBDevFestival

(Palestra ministrada no evento #BSBDevFestival em JUN-2018)

É muito comum evangelizarem que hoje em dia uma aplicação somente escala se utilizarmos micro-serviços, containers, cloud computing e muitos outras tecnologias e práticas da moda, o tal do HYPE.

Mas será mesmo? Já se perguntou como as aplicações escalavam ANTES desse hype todo? Que tipos de práticas e tecnologias eram utilizadas? Alias, será mesmo que meu sistema web precisa escalar para centenas ou milhares de usuários?

Nessa palestra vamos entender como podemos escalar nosso sistema web SEM se levar pelo hype, partindo de práticas mais simples e baratas até as mais rebuscadas e que precisam de um maior investimento. Se você entende pouco ou quase nada sobre como escalar uma aplicação web, então essa palestra é para você!

Rafael Ponte

June 09, 2018
Tweet

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. JVM

  2. 2Gb

  3. db T = Tacq + Treq + Texec + Tres

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

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

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

    + Tidle apresentação negócio persistência
  7. List<Produto> produtos = //... for (Produto p : produtos) {

    entityManager.persist(p); } Persistindo várias entidades
  8. 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
  9. List<Produto> produtos = //... for (Produto p : produtos) {

    entityManager.persist(p); } Persistindo várias entidades
  10. Query : ["INSERT INTO produto(nome, id) VALUES (?, ?)"] Params:

    [(‘Prod.1', 1), (‘Prod.2', 2), (‘Prod.3', 3)] 1 roundtrip
  11. List<Produto> produtos = //... for (Produto p : produtos) {

    p.setNome(p.getNome() .toUpperCase()); } Atualizando várias entidades
  12. Query : [“UPDATE produto SET nome = ? WHERE id

    = ?”] Params: [(‘PROD.1', 1), (‘PROD.2', 2), (‘PROD.3', 3)] 1 roundtrip
  13. List<Produto> produtos = //... for (Produto p : produtos) {

    entityManager.remove(p); } Removendo várias entidades
  14. db T = Tacq + Treq + Texec + Tres

    + Tidle apresentação negócio persistência
  15. Processando os itens de uma nota NotaFiscal nf = entityManager

    .find(NotaFiscal.class, 42); 
 processaItensDaNota(nf);
  16. 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);
  17. List<NotaFiscal> notas = dao.lista(); for (NotaFiscal nf : notas) {

    processaItensDaNota(nf); } Processando os itens de varias notas
  18. Processando os itens de varias notas List<NotaFiscal> notas = dao.lista();

    for (NotaFiscal nf : notas) { processaItensDaNota(nf); }
  19. SELECT nf.* FROM NotaFiscal 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=? ... Hibernate executa n+1 selects List<NotaFiscal> notas = dao.lista(); for (NotaFiscal nf : notas) { processaItensDaNota(nf); }
  20. SELECT nf.*, i.* FROM NotaFiscal nf LEFT OUTER JOIN Item

    i ON nf.id = i.nota_fiscal_id
 Hibernate executa 1 select List<NotaFiscal> notas = dao.lista();
  21. entityManager
 .createQuery( " SELECT n FROM NotaFiscal n LEFT JOIN

    fetch n.itens")
 .getResultList(); Utilizando Join Fetch
  22. entityManager
 .createQuery( " SELECT n FROM NotaFiscal n LEFT JOIN

    fetch n.itens")
 .getResultList(); Utilizando Join Fetch LAZY permite mudar para EAGER
  23. List<NotaFiscal> notas = entityManager
 .createQuery( " SELECT n.numero, n.serie FROM

    NotaFiscal n WHERE n.tipo = 'DEVOLUCAO'")
 .getResultList(); DTO Projections
  24. List<NotaFiscal> notas = entityManager
 .createQuery( " SELECT n.numero, n.serie FROM

    NotaFiscal n WHERE n.tipo = 'DEVOLUCAO'") .getResultList(); DTO Projections
  25. List<?????> notas = entityManager
 .createQuery( " SELECT n.numero, n.serie FROM

    NotaFiscal n WHERE n.tipo = 'DEVOLUCAO'") .getResultList(); DTO Projections
  26. class Devolucao { Integer numero; String serie; public Devolucao(Integer n,

    String s) { this.numero = n; this.serie = s; } // getters e setters } Criando o DTO
  27. List<Devolucao> notas = entityManager
 .createQuery( " SELECT n.numero, n.serie FROM

    NotaFiscal n WHERE n.tipo = 'DEVOLUCAO'") .getResultList(); DTO Projections
  28. List<Devolucao> notas = entityManager
 .createQuery( " SELECT new Devolucao(n.numero, n.serie)

    FROM NotaFiscal n WHERE n.tipo = 'DEVOLUCAO'") .getResultList(); DTO Projections
  29. db T = Tacq + Treq + Texec + Tres

    + Tidle apresentação negócio persistência
  30. SELECT nf.* FROM NotaFiscal nf WHERE nf.id = 42 Hibernate

    executa 1 select NotaFiscal nf = entityManger.find(NotaFiscal.class, 42);
  31. 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
  32. 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
  33. db T = Tacq + Treq + Texec + Tres

    + Tidle apresentação negócio persistência
  34. “There are only two hard things in Computer Science: cache

    invalidation and naming things.” — Phil Karlton
  35. @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... } }
  36. @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... } }
  37. @Service public class PedidoService { public void finaliza(Pedido pedido) {


    // efetua pagamento // dá baixa no estoque // atualiza pedido // envia email de confirmação } }
  38. @Service public class PedidoService { @Async public void finaliza(Pedido pedido)

    {
 // efetua pagamento // dá baixa no estoque // atualiza pedido // envia email de confirmação } }
  39. @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!! } }
  40. @Service public class PedidoService { @Autowired private JmsTemplate fila; public

    void finaliza(Pedido pedido) { fila.convertAndSend("fila.pedidos", pedido);
 } }
  41. @Service public class PedidoService { @Autowired private JmsTemplate fila; public

    void finaliza(Pedido pedido) { fila.convertAndSend("fila.pedidos", pedido);
 } }
  42. @Service public class ProcessadorDePedidos { @JmsListener(destination="fila.pedidos") public void processa(Pedido pedido)

    {
 // efetua pagamento // dá baixa no estoque // atualiza pedido // envia email de confirmação } }
  43. @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!! } }
  44. 1) tunamos a JVM; 2) tunanamos a camada de persistência;

    3) adicionamos caching; 4) adicionamos processamento assincrono;
  45. 1) tunamos a JVM; 2) tunanamos a camada de persistência;

    3) adicionamos caching; 4) adicionamos processamento assincrono;
  46. 1) tunamos a JVM; 2) tunanamos a camada de persistência;

    3) adicionamos caching; 4) adicionamos processamento assincrono;
  47. 1) tunamos a JVM; 2) tunanamos a camada de persistência;

    3) adicionamos caching; 4) adicionamos processamento assincrono;
  48. X

  49. X

  50. =

  51. ip?

  52. ?

  53. ?