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

Pilares da Escalabilidade - Tecnologias envelhe...

Pilares da Escalabilidade - Tecnologias envelhecem, Fundamentos permanecem

O que te vem a cabeça quando te perguntam sobre como escalar uma aplicação web? 🤔 Se a primeira coisa que você pensou foi Microservices, Kafka ou Redis, então eu tenho uma péssima notícia pra te dar.

Te fizeram acreditar que escalar sistemas distribuídos é sinônimo de Microservices, Event-Driven Architecture (EDA), Cache distribuído ou Cloud computing. Mas será mesmo?

Já parou para pensar como arquitetos desenhavam sistemas há 20 anos? Como sistemas suportavam milhões de usuários quando essas tecnologias ainda nem existiam? Que tipos de práticas eram utilizadas? E aliás, será mesmo que o seu sistema precisa escalar para centenas ou milhares de usuários?

A verdade é que os princípios que fazem um sistema escalar nunca mudaram, só as ferramentas em cima deles. E é exatamente isso que vamos explorar de forma didática nessa palestra: os pilares de escalabilidade por trás de qualquer sistema distribuído — do monolito ao microservices, das soluções mais simples e baratas às mais caras e sofisticadas.

Se você entende pouco ou quase nada sobre como escalar um sistema distribuído, então essa palestra é para você!

Avatar for Rafael Ponte

Rafael Ponte

August 14, 2026

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. EDA | Event-Driven Architecture EDA é um estilo arquitetural no

    qual os componentes de um sistema produzem, publicam e reagem a eventos, permitindo que mudanças de estado ou acontecimentos relevantes desencadeiem ações e novos eventos.
  2. s e ic M .5 v e d 5 fl

    https://www.infoq.com/presentations/ne ix-push-messaging-scale/
  3. Rafael Ponte /rponte Brazilian Software Engineer 20+ years of experience

    working with Java and distributed systems Loves working with "boring techs" aka Prince of the Ocean aka Maharaja of the Legacies
  4. JVM

  5. 2Gb

  6. modo servidor -server 1 Gb -Xms1024m -Xmx1024m memoria -XX:MaxPermSize=192m coletor

    de lixo (GC) 2 -XX:+UseConcMarkSweepGC Gb -XX:+CMSParallelRemarkEnabled
  7. fi nalizar-compra.jsp GravaProdutoServlet.java servidor index.jsp app.js site.css carrinhoDeCompras.jsp Produto.java Venda.java

    Pagamento.java FinalizarCompra.java BancoDeDados.java GravaProduto.java EnviaEmail.java
  8. "Dever de casa” fi Antes de recorrer a soluções e

    tecnologias “mágicas”, torne seu sistema mais e ciente.
  9. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  10. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  11. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  12. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  13. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  14. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  15. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  16. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  17. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  18. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  19. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  20. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  21. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  22. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  23. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  24. EM

  25. Carregando uma nota por ID NotaFiscal nf1 = entityManager .find(NotaFiscal.class,

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

    42); NotaFiscal nf2 = entityManager .find(NotaFiscal.class, 42); NotaFiscal nf3 = entityManager .find(NotaFiscal.class, 42);
  27. Hibernate executa 1 select NotaFiscal nf1 = entityManger.find(NotaFiscal.class, 42); SELECT

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

    nf.* FROM NotaFiscal nf WHERE nf.id = 42 NotaFiscal nf2 = entityManger.find(NotaFiscal.class, 42); // sem SQL NotaFiscal nf3 = entityManger.find(NotaFiscal.class, 42); // sem SQL
  29. #2 con guramos as entidades @Entity @Cache(...) class NotaFiscal {

    … @OneToMany(fetch=FetchType.EAGER) List<Item> itens; fi }
  30. #3 …seus relacionamentos @Entity @Cache(...) class NotaFiscal { … @Cache(...)

    @OneToMany(fetch=FetchType.LAZY) List<Item> itens; }
  31. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  32. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  33. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  34. @RestController public class ReciboController { private NotaFiscalRepository repository; @GetMapping("/api/recibos/{notaFiscalId}") public

    ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  35. @RestController public class ReciboController { Spring Boot Cache private NotaFiscalRepository

    repository; @Cacheable("recibos-cache") @GetMapping("/api/recibos/{notaFiscalId}") public ReciboResponse gerarRecibo(@PathVariable Long notaFiscalId) { NotaFiscal nota = repository.findById(notaFiscalId) .orElseThrow( // lança exception ); List<Item> itens = // processa itens BigDecimal total = // computa total } } return new ReciboResponse(nota, itens, total); // constrói payload
  36. “There are only two hard things in Computer Science: cache

    invalidation and naming things.” — Phil Karlton
  37. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  38. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  39. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  40. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  41. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  42. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  43. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  44. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  45. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  46. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  47. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  48. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  49. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  50. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  51. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  52. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  53. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  54. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  55. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  56. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  57. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  58. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  59. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  60. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  61. @Service public class PedidoService { } public void finaliza(Pedido pedido)

    { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  62. @Service public class PedidoService { } @Async public void finaliza(Pedido

    pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  63. @Async The @Async annotation in Spring allows you to execute

    heavy or timeconsuming tasks in a separate background thread, preventing the main application thread from being blocked.
  64. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  65. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  66. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA); IMEDIATO! Não espera pelo resultado.
  67. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  68. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.CONFIRMADA);
  69. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.PENDENTE);
  70. @Controller public class PedidoController { @Autowired public PedidoService service; “Estamos

    processando seu pedido.” @PostMapping("/vendas/finaliza") public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.PENDENTE);
  71. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.PENDENTE);
  72. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); // demorado… } } return new PedidoResponse(pedido, Status.PENDENTE);
  73. Controller Thread Pool R1 R2 R3 … Rn new Thread(()

    -> { service.finaliza(pedido); }).start();
  74. Controller Thread Pool R1 T1 R2 R3 … Rn new

    Thread(() -> { service.finaliza(pedido); }).start();
  75. Controller Thread Pool R1 T1 R2 T2 R3 … Rn

    new Thread(() -> { service.finaliza(pedido); }).start();
  76. Controller Thread Pool R1 T1 R2 T2 R3 … Rn

    new Thread(() -> { service.finaliza(pedido); }).start(); T3
  77. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  78. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  79. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  80. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  81. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  82. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  83. Thread Pool Executor Controller Thread Pool R1 T1 … R2

    Task Queue R3 … … Rn … T2 … T3 … … Tn
  84. Thread Pool Executor Controller Thread Pool R1 T1 … R2

    Task Queue R3 … … Rn … T2 … T3 … … Tn
  85. Thread Pool Executor Controller Thread Pool R1 T1 5 R2

    Task Queue T2 R3 4 T3 … Rn 3 2 1 … Tn
  86. Thread Pool Executor Controller Thread Pool R1 T1 … R2

    Task Queue R3 … … Rn … T2 … T3 … … Tn
  87. Thread Pool Executor Controller Thread Pool R1 T1 … R2

    Task Queue R3 … … Rn … … T2 … T3 … … Tn
  88. Thread Pool Executor Controller Thread Pool R1 T1 5 …

    Task Queue R2 R3 … Rn … … … … T2 … T3 … … Tn
  89. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  90. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  91. @Controller public class PedidoController { @Autowired public PedidoService service; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados service.finaliza(pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  92. @Controller public class PedidoController { @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  93. @Controller public class PedidoController { @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  94. r e c @Controller u d public class PedidoController {

    o rP @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza") public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  95. @Service public class PedidoService { } @Async public void finaliza(Pedido

    pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  96. @Service public class PedidoService { } @Async public void finaliza(Pedido

    pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  97. @Service public class PedidoService { } @Async public void finaliza(Pedido

    pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  98. @Service public class PedidoService { } @JmsListener(destination="fila.pedidos") public void finaliza(Pedido

    pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  99. re m u @Service s n o public class PedidoService

    { C } @JmsListener(destination="fila.pedidos") public void finaliza(Pedido pedido) { // autoriza pagamento no gateway // dá baixa no estoque // atualiza pedido // envia email de confirmação // gera nota fiscal }
  100. @Controller public class PedidoController { @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  101. @Controller public class PedidoController { @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE);
  102. @Controller public class PedidoController { @Autowired public JmsTemplate producer; @PostMapping("/vendas/finaliza")

    public PedidoResponse finaliza(@RequestBody PedidoRequest request) { // faz alguma validação de dados producer.convertAndSend("filas.pedidos", pedido); } } return new PedidoResponse(pedido, Status.PENDENTE); IMEDIATO! Não espera pelo resultado.
  103. TRAFFIC SHAPING Filas invertem o uxo de controle fl fl

    https://www.enterpriseintegrationpatterns.com/ramblings/queues_ ow_control.html
  104. TRAFFIC SHAPING Filas invertem o uxo de controle fl fl

    https://www.enterpriseintegrationpatterns.com/ramblings/queues_ ow_control.html
  105. X

  106. X

  107. =

  108. ip?

  109. ?

  110. ?

  111. u ir b d et iH t s i D

    y l h g s y S m te