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

Turbinando seus Microsserviços com Cache Distri...

Turbinando seus Microsserviços com Cache Distribuído via DevConf(Opensanca)

Palestra feita por Jordi Henrique Silva, abordando sobre Cache Distribuído no Devconf 2023.

Sinopse:

Hoje é comum que boa parte das empresas estejam preocupadas em como aumentar o desempenho de seus serviços. Já que cada vez mais vivenciamos uma crescente demanda por features que processam grande volume de dados ou exigem integração com diversos sistemas. Uma das abordagens mais comuns para aumento de performance é armazenar temporariamente informações que são utilizadas frequentemente em um servidor de cache local a fim de acelerar o consumo das mesmas.

No entanto, o uso exclusivo de cache local pode levar a problemas como a inconsistência de dados quando trabalhamos em ambientes clusterizados, já que cada servidor não compartilham recursos entre-si. Então nesta talk iremos explorar como extrair o máximo das ferramentas de cachê distribuído e entender os tradeoffs de cada estratégia.

Opensanca

May 27, 2023
Tweet

More Decks by Opensanca

Other Decks in Programming

Transcript

  1. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  2. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  3. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  4. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  5. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  6. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  7. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  8. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  9. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  10. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  11. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  12. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  13. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  14. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  15. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  16. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  17. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  18. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  19. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  20. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  21. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  22. SELECT f.* FROM usuario_forma_de_pagamento u INNER JOIN forma_de_pagamento f ON

    f.id = u.forma_de_pagamento_id INNER JOIN restaurante_forma_de_pagamento r ON f.id = r.forma_de_pagamento_id WHERE u.usuario_id = :usuarioId AND r.restaurante_id = :restauranteId
  23. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  24. @RestController public class ConsultaFormasDePagamentoController { @Autowired private UsuarioRepository usuarioRepository; @Autowired

    private RestauranteRepository restauranteRepository; @Autowired private FormaDePagamentoRepository formaDePagamentoRepository; @Transactional(readOnly = true) @GetMapping("/api/v1/formas-de-pagamento") public ResponseEntity<?> consultarFormasDePagamentoEmComum( @RequestParam(required = true) Long usuarioId, @RequestParam(required = true) Long restauranteId){ if (usuarioRepository.existsById(usuarioId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Usuario não cadastrado"); } if (restauranteRepository.existsById(restauranteId)) { throw new ResponseStatusException(UNPROCESSABLE_ENTITY, "Restaurante não cadastrado"); } var formasPagamentoComum = formaDePagamentoRepository.findFormaDePagamentoEmComumEntre(usuarioId, restauranteId) .stream() .map(FormaDePagamentoResponse::new) .toList(); return ResponseEntity.ok(formasPagamentoComum); } }
  25. public interface FormaDePagamentoRepository extends JpaRepository<FormaDePagamento, Long> { @Cacheable( value =

    "forma_de_pagamento_entre", key = "T(java.util.Objects).hash(#usuarioId,#restauranteId)“ ) @Query(nativeQuery = true, value = """ SELECT f.* FROM usuario_forma_de_pagamentos u INNER JOIN forma_de_pagamento f ON f.id = u.forma_de_pagamentos_id INNER JOIN restaurante_forma_de_pagamentos r ON f.id = r.forma_de_pagamentos_id WHERE u.usuario_id = :usuarioId AND r.restaurante_id = :restauranteId """) List<FormaDePagamento> findFormaDePagamentoEmComumEntre(Long usuarioId, Long restauranteId); }
  26. public interface FormaDePagamentoRepository extends JpaRepository<FormaDePagamento, Long> { @Cacheable( value =

    "forma_de_pagamento_entre", key = "T(java.util.Objects).hash(#usuarioId,#restauranteId)" ) @Query(nativeQuery = true, value = """ SELECT f.* FROM usuario_forma_de_pagamentos u INNER JOIN forma_de_pagamento f ON f.id = u.forma_de_pagamentos_id INNER JOIN restaurante_forma_de_pagamentos r ON f.id = r.forma_de_pagamentos_id WHERE u.usuario_id = :usuarioId AND r.restaurante_id = :restauranteId """) List<FormaDePagamento> findFormaDePagamentoEmComumEntre(Long usuarioId, Long restauranteId); }
  27. public interface FormaDePagamentoRepository extends JpaRepository<FormaDePagamento, Long> { @Cacheable( value =

    "forma_de_pagamento_entre", key = "T(java.util.Objects).hash(#usuarioId,#restauranteId)" ) @Query(nativeQuery = true, value = """ SELECT f.* FROM usuario_forma_de_pagamentos u INNER JOIN forma_de_pagamento f ON f.id = u.forma_de_pagamentos_id INNER JOIN restaurante_forma_de_pagamentos r ON f.id = r.forma_de_pagamentos_id WHERE u.usuario_id = :usuarioId AND r.restaurante_id = :restauranteId """) List<FormaDePagamento> findFormaDePagamentoEmComumEntre(Long usuarioId, Long restauranteId); }
  28. public interface FormaDePagamentoRepository extends JpaRepository<FormaDePagamento, Long> { @Cacheable( value =

    "forma_de_pagamento_entre", key = "T(java.util.Objects).hash(#usuarioId,#restauranteId)" ) @Query(nativeQuery = true, value = """ SELECT f.* FROM usuario_forma_de_pagamentos u INNER JOIN forma_de_pagamento f ON f.id = u.forma_de_pagamentos_id INNER JOIN restaurante_forma_de_pagamentos r ON f.id = r.forma_de_pagamentos_id WHERE u.usuario_id = :usuarioId AND r.restaurante_id = :restauranteId """) List<FormaDePagamento> findFormaDePagamentoEmComumEntre(Long usuarioId, Long restauranteId); }
  29. Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP GET /formas-de-

    pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1)
  30. Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP GET /formas-de-

    pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados)
  31. Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP GET /formas-de-

    pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados
  32. Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP GET /formas-de-

    pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados dados
  33. Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP

    GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados dados
  34. Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP

    GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 dados
  35. Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP

    GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) dados
  36. Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP

    GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) dados dados
  37. Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados BD HTTP

    GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) dados dados dados
  38. Cache Hit Cache Miss Cache João repository.findFormasPagamentoComumEn tre(1,1); null dados

    BD HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) cache.put(formas-pagamento-1- 1,dados) dados HTTP GET /formas-de- pagamento?usuarioId=1&restauranteId =1 cache.get(formas-pagamento-1- 1) dados dados dados
  39. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  40. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  41. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  42. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  43. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  44. spring: ## # Spring Caching ## cache: cache-names: forma_de_pagamento_entre caffeine.spec:

    maximumSize = 100000, expireAfterWrite = 4h application.yaml
  45. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  46. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  47. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  48. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  49. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  50. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  51. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  52. @Configuration public class RedisCacheConfig { @Bean public RedisCacheConfiguration defaultCacheConfiguration() {

    return RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(4))// 4 horas .disableCachingNullValues() .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer())); } }
  53. Cache Miss null BD cache.put(formas-pagamento- 1-1,dados) dados cache.get(formas-pagamento-1-1) Servidor A

    Servidor B repository.findFormasPagamentoComum Entre(1,1) cache.get(formas-pagamento-1-1) Cache
  54. Cache Miss null BD cache.put(formas-pagamento- 1-1,dados) dados cache.get(formas-pagamento-1-1) dados Servidor

    A Servidor B repository.findFormasPagamentoComum Entre(1,1) cache.get(formas-pagamento-1-1) Cache
  55. Cache Hit Cache Miss null BD cache.put(formas-pagamento- 1-1,dados) dados cache.get(formas-pagamento-1-1)

    dados Servidor A Servidor B repository.findFormasPagamentoComum Entre(1,1) cache.get(formas-pagamento-1-1) Cache
  56. Database Servidor Heap Memory Local Hazel Cache Servidor Heap Memory

    Local Hazel Cache Servidor Heap Memory Local Hazel Cache CLUSTER SERVER
  57. cache: name: forma_de_pagamento_entre spring: ## # Spring Caching ## cache:

    cache-names: forma_de_pagamento_entre type: redis application.yaml
  58. cache: name: forma_de_pagamento_entre spring: ## # demais configurações omitidas ##

    cache: cache-names: forma_de_pagamento_entre type: redis application.yaml
  59. cache: name: forma_de_pagamento_entre spring: ## # demais configurações omitidas ##

    cache: cache-names: forma_de_pagamento_entre type: redis application.yaml
  60. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  61. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  62. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  63. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  64. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  65. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  66. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  67. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  68. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  69. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  70. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  71. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  72. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  73. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }
  74. @Configuration public class HazelCastCacheConfig { @Value("${cache.name}") private String cacheName; private

    final int FOUR_HOURS = 14400;// 4 horas @Bean ClientConfig config() { ClientConfig clientConfig = new ClientConfig(); clientConfig.addNearCacheConfig(nearCacheConfig()); return clientConfig; } private NearCacheConfig nearCacheConfig() { NearCacheConfig nearCacheConfig = new NearCacheConfig(); nearCacheConfig.setName(cacheName); nearCacheConfig.setTimeToLiveSeconds(FOUR_HOURS); // 4 horas return nearCacheConfig; } }