Spring Boot Parte 3 - Avançado: Threads, Promisses e Starters | PPT Não Compila Podcast
Convidados
Marcello Ribeiro
VMBears
Valdir Scarin
VMBears
Explore o episódio
No episódio de hoje do podcast PPT Não Compila, mergulhamos fundo nas funcionalidades avançadas do Spring Boot. Contamos com a presença de Marcello Ribeiro e Valdir Scarin da VMBears, dois especialistas do mundo Java, para nos guiar por essa jornada técnica. Vamos explorar a mais recente versão do Java 21, entender a arte por trás do uso de threads e promisses, e descobrir os padrões de paralelização de código. Quer saber os motivos para usar programação em threads no java? Ou talvez esteja curioso sobre Spring boot starters, cache, ou o caso de uso do Schedule? Temos tudo isso e muito mais! Não perca a oportunidade de elevar suas habilidades em Spring Boot ao próximo nível. Se você é um entusiasta da tecnologia ou um desenvolvedor ávido para aprender mais, este episódio é imperdível. Aperte o play e venha conosco nessa viagem tecnológica! 00:42 Abertura e apresentação 04:06 Episódios passados da série 07:52 Java 21 10:51 Uso de Threads e Promisses 20:12 Padrões de paralelização de código 29:50 Motivos para usar programação em Threads no Java 33:50 Eventos 41:16 Spring Boot Starters 44:18 Cache 1:05:40 Polêmica no uso do Schedule 1:12:42 Spring Boot Serveless 1:19:05 Agradecimentos e considerações finais Convidados: Marcello Ribeiro: https://www.linkedin.com/in/marcello-ribeiro/ Valdir Scarin: https://www.linkedin.com/in/valdir-scarin/ Spotify: https://spoti.fi/48S2EQd Youtube: https://youtu.be/8jO2rW7C8ws Outras plataformas: https://linktr.ee/pptnaocompila Acompanhe nas redes Instagram e Twitter: @pptnaocompila LinkedIn: https://www.linkedin.com/company/pptnaocompila Produção: Voz e conteúdo | https://www.vozeconteudo.com.br - @estudiosvoz
- Java Avançado e Verboso
- Apresentação do Episódio e Série
- Tópicos Avançados do Spring Boot
- Apresentação dos Convidados e Promos
- Chamada para Ação e Transição
- Bate-papo Inicial e Analogias Cinematográficas
- Discussão sobre Java e Capacidades de Paralelismo
- Promises, Threads e Scopes de Beans no Spring
- TaskExecutor, @Async e Futures no Spring
- Patrocínio: Clever Pay
- Desafios de Concorrência e Design de Thread Pools
- Escalabilidade e Paralelismo na Infraestrutura
- Arquitetura de Webhooks e Eventos Distribuídos
- Recapitulação: Uso Estratégico de Threads
- História da Programação Paralela e Evolução do Java
- Debate sobre Java, Kafka e Conceito de Eventos
- Eventos Internos do Spring e Programação Reativa
- Eventos com Spring Boot Starter Kafka e Redis
- Patrocínio: VMBs
- Caching no Spring Boot (@Cacheable)
- Configuração de Caching e Perfis Spring
- Discernimento no Uso de Caching em Ambientes Distribuídos
- Agendamento de Tarefas com @Scheduled
- Debate: Agendamento Interno vs. Eventos e Infraestrutura
- Prós e Contras do @Scheduled e Contexto Histórico
- Tópicos Futuros: Testes e Spring Native (GraalVM)
- Spring Boot em AWS Lambda e SnapStart
- Conclusão sobre Spring Boot em Lambda e Otimização
- Encerramento e Agradecimentos
há quem diga que o Java já o cara já tá no avançado quando tá no hello world né exatamente para est no Java você já tem que nascer avançado toda a parte ali da da jvm n que foi mudado você já começa ganho né quando virou hotspot ganhar Ganhou se com hotspot o Spring velho é diferente dessas linguagen Zinha MEF que você usa s linguagen zinhas me Ah cara você já começou falando aí de umas não sei o qu com então é cara é um Bet cara no final é um Bet sim mas ele é gatilhado em runtime é isso que eu quero dizer eu tenho esse cara que vem de fora eu entendo é a mesma coisa tudo bem meus amigos do PPT não compil estamos aqui para o terceiro episódio dessa trilogia que eu acho que vai virar uma vai ter mais cara quintologia tipo Star Wars tá ligado é a gente começa com três aí vem o Jorge Lucas inventa mais três um livro aí gente emenda no token isso será que a gente vai virar tipo Spring verso Spring vero boa spring spring versus no Ig igual mcu né examente Spring a saga a saga Spring a saga Spring Estamos aqui hoje para falar sobre os tópicos avançados do Spring boot nunca ninguém escreveu tanto texto na vida para programar Como assim eu entender não tô entendendo tô entendendo se você não sabe do que a gente tá falando a gente já teve o Episódio número um episódio número dois falamos sobre o básico do Spring boot para quem não sabia nada sobre Spring falamos sobre um episódio mais produtivo sobre o uso ali do Spring boot o o o cartão vai est não desse lado aqui ó arquitetura exagonal é isso exatamente o básico ali sobre sobre o Spring e hoje estamos aqui para falar sobre o tópicos avançados Spring boot a gente vai falar sobre Cash vai falar sobre processamento paralelo vamos falar sobre thread sobre Promises e eventos da própria da própria Framework do próprio Spring exatamente vamos falar sobre starters Cash e outros assuntos aqui avançados sobre Spring para falar sobre esse assunto aqui como sempre está aqui os magos doing do Spring exagerado praticamente os Como é o nome cabaleiro Jedis os Jed eu quero seu Luc Ky Walker eu ia falar gandolf gandolf é o mago lá n do Senhor dos Anéis isso né o o jedai funciona muito bem Marcelo Ribeiro da VMB obrigado pela oportunidade sa é da casa né chamando eu tô aqui e aqui o nosso gigante Gentil o Bal diris carim Obrigado Wel o cara que criou o Spring praticamente prazer tá aqui de novo com Marcelão meu amigo você também e todo mundo uniformizado né hoje a gente tá aqui de de de farda né em breve essa camiseta vai est disponível para você também aguarde aí as novidades em breve R 50 é mentira é mentira mentira mas vamos ter aqui novas camisetas do PPT no compila na nova identidade Então vamos lá que hoje temos aqui muito conteúdo relevante sobre Spring é a série que mais faz sucesso aqui no podcast então se você não deixou o like ainda se você ainda não compartilhou esse episódio Se você não se inscreveu no canal se você não foi aí no Spotify no Google podcast Apple podcast deu cinco estrelinhas pra gente a sua oportunidade agora que o episódio tá muito bom então vamos lá falar de spring [Música] bora [Aplausos] ô ô Marcelão Opa vamos parte um parte dois agora é a parte três é isso né então aqui é igual John Wick nesse nessa parte morre todo mundo é é é assim no jck eu não assisti mas é spoiler Alguém falou já me disseram também nunca assisti você Você acredita que também não assisti John Wick quant quantos John wick tem por enquanto quatro quatro quatro quatro mas como é que pode ter o quatro se no três morre todo mundo é porque o mundo vai vai tendo filho né bicho é tipo graml né GR Ah entendi o quatro o quatro é uma revolução o quatro ele vai conversar com Deus assim mas eu acho que essa série de spring boot ela tá mais pra Missão Impossível Spring boot de novo Missão Impossível é boa tá mais para missão impossível não cara com o Spring boot é possível não é possível mas não disse em relação a não ser possível mas para a quantidade de de episódios episódios isso seria o Valdir o Tom Cruz e do Spring boot muito prov D dá uma olhada na camiseta aqui né Tá justinho de vez em quando ele sobe numa moto e se lança pela pela o desfiladeiro Né isso ou ele desce tipo de parapente no meio de um prédio estourando pro Tetro de vidro assim ó é isso aí o dia da implantação isso aí dia deplo depl dia de gud o Valdir chegando para resolver as tretas em produção be noite você falou gemu Pera aí que bate na madeira o Spring boot é justamente para não ter gud não ter exato gud Killer exatamente p p mas aí fodeu a governança ISS é implanta em produção já e acabou é direto é no pelo S foi pesado corta pode cortar pode cortar o a gente a gente falou bastante no episódio dois né bicho a gente falou bastante sobre design falou bastante sobre eh exceptions nós falamos também sobre o arquitetura exagonal né E como Spring te ajuda né e e a gente tava no meio do caminho a gente falou bom acabou o tempo né a gente vai deixar pro próximo o avançado avançado [ __ ] avançado né então Master blaster há quem diga que o ja já o cara já tá no avançado quando tá no hello world né exatamente para tá no Java você já tem que nascer avançado entendeu eu vou eu vou eu vou me abster resposta eu vou guardar as resposta porque a minha opinião é que tipo o Java deveria ser extens tipo a pós--graduação do curso de digitador Ah tá ligado quantas laudas por segundo você consegue digitar Ah beleza Já pode programar em Java porque is tá chamando Java de verboso cara nãoa aqui é porque ele parou de estudar lá na versão 7 e antes de sair lambda [ __ ] nós estamos na versão 21 já bicho já tem já já tem coisa muito pronta e e outra é que ele eu acho que ele não tava aqui no episódio anterior que a gente falou do lombok também você começa a falar isso começa pera aí uma coisa é ser verboso outra coisa é ter alguma coisa que faça o verboso para você continua sendo verboso não mas parou de ser parou de ser claro depois que criar o chat GPT não se não se codifica mais n você a sorte do Java é que a área de transferência dos computadores modernos podem pode carregar texto para [ __ ] tem problema a programação computação quântica tá aí para isso se daí vai acabar essa essa piadinha quando sair os computadores quânticos entendeu acabou dá para transmitir 2 Mega na área de transferência de Puro texto exato Tex Pure text iso é você fala dava 21 waler já já saiu aí faz esse fico pensando eu tô ficando realmente velho cara é P amor de Deus o James go o James goslin tá vivo ainda sai sai Java todo mês agora também tá cara ele tava graças a Deus né porque a partir da versão era 10 anos para sai uma versão do Java agora todo partir da versão oito eles criaram toda uma política diferente para poder lançar e e muito disso aconteceu em função da quebra de compatibilidade né Então a partir da JV M8 eh você não tem mais aquela retrocompatibilidade total que você tinha na JV que deixava ela gorda para caramba né então agora a jvm ela vai evoluindo e você se quiser usufruir dos novos benefícios você tem que deixar os antigos para trás né e e muito também tem aí veio a modularização também da jvm né e mas o o grande benefício do Java a gente tá brincando aqui né mas é que você consegue modernizar as aplicações cara e trazer benefícios PR para aplicações lá de 2004 cara 2005 n você muito mais barata mano exat exatamente mesmo sendo uma Java 6 hum mesmo sendo uma Java 6 cara um bonitão lá um monolit você faz um makeup ali você faz um makeup ali e chega na versão mais nova dá para você ajustar né não é tão diferente né exatamente Car Mas é uma é uma é uma modernização que eu consigo rodar numa versão nova da jvm e tal mas para usufruir de fato dos benefícios do jvm nova tem que ter refactory maior ali não não Obrigatoriamente usar os objetos novos não Obrigatoriamente assim de Fato né Você tem um monte de coisa nova Então você tem o Java lá que mudou tudo né lá mas mudou lá atrás também na versão oito tal eh mas o ponto é o seguinte quando você compila pra versão nova toda a parte ali da da jvm né que foi mudado você já começa tem ganho né quando virou hotspot ganhar Ganhou se com hotspot né exato tudo que tem de novidade Você já ganha tambémm Você só não vai ter o que você não programou né você não utilizou de código mas O legal é que você pode fazer a migração da versão e ir tunando ela ao longo do tempo né E aproveitando essas coisas novas que tem a computação o paralelismo né Essas coisas novas Cara essa parte do paralelismo mudou muito então Eh também já aí já vem lá do do Java 5 Java 6 né você você tem lá o o um um toda uma API de Future né para você ter concorrência Pô o Spring traz isso para você de forma transparente o programador Júnior não precisa de muita coisa para colocar e para fazer esse benefício para usar esse benefício né lá com Spring ele bota um arass em cima da classe e fala mas aí a gente já vai falar disso daqui a pouco é esse é um assunto eu queria até dar uma entradinha nesse assunto porque um assunto que eu gosto eu sou é então eu eu eu não gostava de trabalhar com in tredes com com Java e quando eu comecei a trabalhar com linguagens de fato nativamente assíncronas que nem eu gosto muito do node Eu você vê você vê que eu sou um cara meio [ __ ] PR PR pr pra linguagem né Eu sempre fui muito cara do Python quando eu comecei a aprender node o meu coraçãozinho já bate esse episódio aqui já vai sair com disclaimer lá né 18 anos se deixar o meu pelo menos que eu peguei cara no assunto anterior aí então eu eu eu eu hoje meu coração bate forte ali com o node justamente por trabalhar muito bem com as Promises e e e com a a questão assíncrona natural do próprio JavaScript né E tá próximo disso de trabalhar com Promises no jav ou ou é trad ex exatamente igual assim é uma promessa que vai ser executada numa T paralela né e pro para o programador eh então assim né aí já já já começa a gente já tá no terceiro episódio né então a gente já falou bastante sobre Beans do Spring né mas um segredo muito grande é você saber usar os escopos dos Bins Então você precisa saber se você tem um Bim que é singleton você tem que saber se você tem um Bin que é é Prototype se você tá numa aplicação web você tem um um um Bin que é escopo de request de sessão né e o que que é isso é o é você tá gerenciando o ciclo de vida daquele objeto então se ele é um objeto singleton aí a a gente tá falando daqueles padrões de de desenvolvimento e orientado objetos exato que ele a a Instância dele vai ser compartilhada né Então tá bom aí quando você tá usando uma promessa você tem que saber que você vai estar chamando esse cara E aí se você tiver guardando variável naqua naquele bim você corre um risco é você corre um risco tremendo na verdade vai não é nem risco é certeza certeza vai dar merda entendeu É porque se se você tem um singon e você tem um processamento para em relação a isso é vou vou extrapolar Aqui Talvez num heresia de comparação mas é como se você tivesse trabalhando com uma variável Global compartilhada ali né Exatamente porque é um objeto que ele tem um estado único para várias promessas rodando ao mesmo tempo né E tá certo e tá errado depende do teu algoritmo né então você tem que você tem que entender o problemaa é que quando você tô falando isso de programação no geral talvez não sei se no jav assim mas quando você dispara várias promessas em paralelo você não tem garantia da ordem que elas são executadas né então se o que você tá guardando naquele singon ele Depende de uma sequência de de de de cálculo e de guardar valores você não tem garantia se a sua tred número um dois ou três vai ser executada e e vai afetar o resultado que você tem naquele single to que uma Instância única né perfeito então é exatamente isso né então você tá falando do algoritmo o algoritmo o cara precisa entender o que ele tá fazendo para para escrever um algoritmo que possa fazer uso de concorrência né E aonde que o Spring vem a gente tá falando Java a gente tá falando que a jvm faz muita coisa e o Spring vem para facilitar essa a a a utilização do desenvolvedor dessa capacidade né como ele faz isso eh primeiro o Spring ele dá pro desenvolvedor um tesk Executor né Eh padrão então tesque Executor é nada mais nada menos que um p de trads que vai executar Eh esses essas promessas que a gente tá falando aqui né E você tem lá nesse tesk Executor um conjunto de promessas que você pode colocar ele inicialmente começa com limite Mas você pode colocar sem limite e tudo bem mas um outro ponto importante é será que eu quero que as minhas promessas de vários assuntos diferentes concorram pelas trads pelo P de trads ou será que eu quero ter PS de trads diferentes para assuntos diferentes então um exemplo e dá para antes você terminar o raciocínio dá para priorizar os pulls porque no fundo tá todo mundo rodando a mesma JV você fala que esse Pool vai ter cinco trads o outro Pool Vai ter 29 você diz quantas trads por Pool né Não mas tudo bem ó vamos supor eu tenho separo tenho duas trads uma rodando para um domínio outra rodando para outro domínio Beleza beleza aí eu posso ter 10 trads em cada em cada domínio dentro de cada domínio elas vão concorrer entre si perfeito beleza mas eu posso dar prioridade para um Pool você pode dar prioridade de várias formas diferentes uma que eu tô te falando aqui é você diminui a quantidade de trads você diminui automaticamente na na média que ele vai pelo uma média eu tenho 10 o de 10 vai ter mais tempo de processador do que o de três e tem outras formas mais grosseiras por exemplo você pode dar a a prioridade para trad exato tem lá priority né Aí você faz isso mas assim o o em em linha geral você eu eu se eu tivesse programando aqui eu ia fazer isso [ __ ] eu vou colocar isso aqui eu quero mais perade dou cinco trad para ele ele vai usar mais CPU do que um que eu tiver duas trads três trads entendeu eh mas mas dá para fazer o que você falou as trads por si só elas têm esse esse set priority tá E e o Spring nada mais é do que um um um uma de abstração que fica em cima da jvm Então você sempre consegue acessar lá os componentes básicos do Java Tá mas o ponto é então quando você cria esse esse test Executor você deu pro Spring Ó tem aqui um pulinho de trads que você pode usar lá no teu método que você quer que ele possa virar promessas né você coloca em cima dele @ isso é uma anotação do do do Spring que que implementa uma CR da própria da própria especificação né que que ele vai entender o qu Ah quando ele tiver inicializando a o contexto Spring ele vai criar ali um aspecto né E aí quando você chama aquele método Puff ele coloca na trad ou tira da trad enfim e aí ele retorna para você uma classe que é do próprio Java chama Future essa classe é é como você vai obter o valor da Promessa né então se você pegou uma lista de futures né Então você vai ter que ver pô itera sobre a lista ver se veio todos os dados né você dá lá o método get o get é legal porque o get ele ele garante que você vai ter o retorno do valor daquela trad da da daquele processamento quando ele tiver né Eh sido executado então se você tem uma lista de 200 itens eh e você pega o primeiro e da get se a tua essa tua trade principal tiver a necessidade de ter aquele resultado ela vai ficar bloqueada o get é para isso ele dá o o o blo na na tred E aí beleza ele vai pegar vai tentar né pegar o dado só que em paralelo tem um monte de processamento acontecendo pegou o primeiro tá bom só que 90% da sua lista já foi processada Porque ela foi processada em em paralelo então quando se você dá get em tudo né você teve o benefício da sua lista ser processada por um conjunto grande de treds e você pegou o dado de todo mundo quando eles estavam PR esse get é da especificação do Java tá é é o método da da da interface Future mas eu tô tentando entender se el equivalente ao weight que a gente tem lá no no no node n a weight lá né é a weight porque o a weight é para isso eu vamos supor Eu tenho dois processamentos Paralelos no começo do do da classe mãe eu starto uma tred paralela ele vai seguir e eu posso seguir com meu fluxo aqui em paralelo chega determinado momento que eu dependo do valor processado na a trad se a a trad ainda não se resolveu eu vou colocar uma weight para poder esperar aquele processamento mas já cheguei num ponto em que eu tenho que unificar as treds porque o valor de lá pra retornar para cá quero falar com você agora quem ainda não conhece a Clever Clever é uma empresa que já tem mais de 3 milhões de usuários em 30 países com 30 idiomas diferentes que tem trazido Soluções em blockchain criptomoedas e ativos digitais o objetivo da Clever é te dar liberdade financeira para operar nesse mercado de cripto então se você acredita nisso se você acredita nessa Liberdade você já Pensa como a Clever vai conhecer os caras é Clever Paio estão contratando também pessoal para trabalhar com cripto com blockchain então se você tem interesse se você tem conhecimento nessa área procura Clever se você gosta de criptomoedas se você opera no mercado você precisa conhecer a Clever precisa conhecer as soluções da Clever então o endereço tá aqui embaixo no vídeo para quem não tá no YouTube é Clever pai vai lá vai conhecer que realmente é um mercado sensacional é agora olha só como o design é fundamental né então a gente falou de um caso simples aqui que a gente vai lá pega três assuntos diferentes dispara paraul de TR diferentes no final você faz o fork ali né você junta tudo Puff processa né E só que cara o tamanho da tr né o tamanho do qu de TR que você tem é tão fundamental e você precisa entender tanto sobre o que você tá fazendo e tem um cenário de produção que eu vivenciei tá numa empresa que nós trabalhamos aqui no passado de de um de um microsserviço que ele retornava mais ou menos 700 requisições por segundo tá segundo É acho que era segundo ou era minuto não acho que era segundo não acho que era minuto é dava tipo 12 13 por minuto sei lá era assim era bem grande tá E e aí como é que o programador tinha feito cara ele recebia os requests do do rest aí tinha lá o processamento né do código e ele pegou e falou ah eu vou criar uma classe singleton né dele que gerenciar um p de trads E aí todo mundo que chegar faz o seguinte manda essa esse P executar meus processamentos E aí depois Depois eu pego o resultado E continuo processando ele só que ele não olhou pro design como o todo do contêiner e Spring boot do pull trads do do http ele tava usando lá o o sabor tcat né do do do Spring web então o tcat ele tem 200 trads padrão para receber requisições as 200 trads elas concorriam o mesmo P trads sim que tinha cinco trads então o que que ele fazia ele fazia um funil em vez de fazer um funil que abre né ele fez um funil que que fica pequenininho no final Então tinha 200 requisições chegando esperando processar as que ele tinha aberto exatamente Então tinha cinco trads para processar o a requisição de e 200 trads pô ele fez o contrário é ele o que que ele tinha que pensar ele tinha que pensar assim ah vamos fazer o seguinte de 200 requisições que chegar para cada uma das 200 Eu Abro mais cinco aí tudo bem aí ele tá aumentando o o a capacidade de processamento de cada trad né só que o cara criou um gargalo literalmente a boca do de uma garrafinha que na ponta do http exatamente por quê Porque o cara não conhecia o que tava fazendo né então não sei se eu consigui ser claro até para você me ajudar aqui a explicar bem o cenário não assim Inclusive a pergunta que eu ia fazer ela é relacionada com isso né porque quando a gente trabalha com principalmente com Spring boot para gerenciamento de concorrência geralmente você tá com Spring boot rodando com kubernetes com a escabilidade etc né e é comum a gente ter o problema da dessa segregação de escopo e de contêiner físico né então às vezes você pensa num tratamento de processamento paralelo como se a sua aplicação fosse única dentro do monolito né E aí faz sentido Então você por exemplo você recebe essas todas essas requisições no ú no único endpoint http e você enfila numa fila como se ela fosse a única fila só que você não pensa que essa tua aplicação ela pode escalar no contêiner em paralelo E se ela tiver processando a mesma coisa isso tem que dar um fork único não só da aplicação Mas entre os contêiners para ter um resultado http só né Isso é muito comum quando você tem múltiplas requisições h attp para Chaves diferentes mas para um processamento só e aí você tem um desafio maior ainda porque você tem que orquestrar múltiplos contêiners para ter um um um processamento único num único Pool e ter o mesmo resultado aí onde entra a mágica da arquitetura você precisa sincronizar isso em algum componente fora da sua aplicação ou em um CFC ou num Rabbit MQ separado para que você tenha esse o Spring dá suporte a isso também né ess Essa coisa da concorrência né entre múltiplos processos porque isso é muito comum em por exemplo você tem um endpoint de um web service que ele tem que ser altamente disponível para poder enfileirar e ter processamento assíncrono fora dele então rece eu recebo ali um um payload ess cara tem que ser processado e esse meu próprio microserviço ISO ele escala Então eu tenho duas questões aí e aí entra entra o o GAP arquitetural né que você falou eu posso simplesmente colocar num Pool de trad e liberar meu endp para ser para ter uma a requisição porque se ele tá assíncrono meu serviço volta a ficar disponível mas aí é aí você tá fazendo corretamente um um desenho de de de de aplicação assíncrona né isso que você tá falando mas eu tava falando do problema o cara não fez isso sim exato mas mas percebe que o problema ele escala o o ponto é esse o o problema ele escala porque o problema que o desenvolvedor ele tinha feito ali que ele tinha criado um gargalo na aplicação como é que o servidor como é que a infraestrutura vai resolver ela vai criar out pod e ela vai criar out pod [ __ ] isso ex Exatamente porque o outro podde vai ter o mesmo gargalo né e e foi era Justamente esse o comportamento da aplicação e E aí pegando o gancho então do do do desse ponto que você trouxe né é muito importante gente entender Por que nós estamos paralizando E por que nós estamos paralizando naquela camada porque a a arquitetura nova né ela já dá pr gente a capacidade de paralisar na infraestrutura que é o tal da escalabilidade né só na aplicação a gente a gente tem que pensar pô eu vou paralisar para quê Vou paralisar porque eu tenho um monte de Waiting que eu tenho na em algum acesso a recurso externo banco de dados tal e para que que eu vou deixar o meu processador parado esperando coisas então eu paralelizado né então o o cara que tá escrevendo o código ali tem que saber disso p e e nesses casos por exemplo um um caso que eu acho que as pessoas usam muito mal o arquitetura síncrona Ah e paralela é web Hook nesses casos por exemplo você pode ter um um microsserviço que é esse cara que recebe uma requisição e é muito muito comum você ver o cara receber essa requisição ele coloca numa num trad Pool a requisição numa outra num outro serviço que ele vai pegar e vai devolver depois para um outro cara então ele libera o processamento para continuar recebendo http esperar o processamento da requisição que ele vai fazer e devolver depois num outro endp né E quando você pensa numa aplicação só eh isso é fácil de você resolver porque eu tenho lá uma aplicação ela recebe libera de novo o processador para receber outra enquanto eu espero o resultado de um outro http para poder postar de volta no meu web Hook mas quando você olha isso paraa escala isso fica ingerencia Vel por isso que a gente usa uma arquitetura distribuída baseada em fila e streaming porque aí eu posso criar NPS que são os Pods que recebem esse tipo de requisição ele põe numa fila e acabou acabou o problema dele ele pode escalar quantas vezes ele quiser ele não tem que ficar com a conexão assíncrona ativa para ele mesmo ser o responsável por fazer aquela requisição de volta então ele pode pôr numa fila nessa fila eu vou fazer um outro cara é um outro processo que vai ser responsável por um outro processo que vai ser responsável por fazer uma outra requisição Esse cara é assíncrono e esse cara devolve para uma outra fila E aí eu tenho um outro cara na borda que pega o resultado e leva para onde tem que levar é justamente por questão de escala pode ser pode ser de uma certa forma chamar de evento isso aí né uma isso Exatamente porque aí você pode ter um exército de 50 podes na frente e aí você pode ter um único trad Pool por trás gerenciando o processamento dessa fila né E você pode dar escala pro cara que tá lá na frente o cara que tá fazendo frente com o epi gator e que é o cara que tem que escalar não importa quanto tempo Lore para fazer a chamada interna lá no meu backend mas o end Point que recebe o pelod ele tá sem sempre tem que tá altamente disponível né é o cara da do do balcão né is o cara que tá esperando o pedido no balcão ali ele tem que estar sempre dispon po D um dá uma coxinha o cara sai vai lá no na cozinha começa a bater a massa não e ficar e não pode ficar esperando também entendeu ele tira pedido Ele tira pedido é pedido e acabou quem vai entregar depois não é responsabil vai pegar sua coxinha lá naquele balcão lá atrás isso entrega a coxinha a coxinha vai com o nome do cliente jantei ainda por isso entendi tá pensando no Hambúrguer né o Burguer aquele Burguer ele inesquecivel mas é muito louco pensando aqui né a gente tá falando a gente tá falando de treds né então a gente já a gente já tá mudando de assunto né a gente tá falando depois de programação assíncrona né mas é que eu eu como eu não manjo muito de Java Eu já fui pra arquitetura é exatamente mas o o ponto é o o por que que a gente usa né e a programação em em trads no no Java no geral para você poder não ficar com o processador parado enquanto seus outros recursos mais demorados eles eh ficam lá gastando seu tempo né então você coloca isso e o programador precisa saber disso para não cair no cenário que eu tava comentando aqui do do http que que criava um funil né É usar os recursos no limite máximo que não te prejudique não te que que prejudica é o que aconteceu com o seu colega aí né exatamente cara posso fazer um um parêntese antes da gente trocar o assunto Eu tenho um amigo muito parceiro Um abraço para ele pro pazim um dia ele vai vir aqui falar disso e ele fez um trabalho de programação paralela na época que eu fiz meu TCC também no maense e cara que era muito difícil nessa época trabalhar com computação paralela porque basicamente para você ter computação paralela de alto nível você tinha que trabalhar com c baseado em cuda que era com eh uma uma um dialeto do c ou um Framework do c não lembro muito bem para você trabalhar com GPU e etc porque não era tão simples como a gente consegue fazer hoje com com node ou com @sy cara exatamente um abraço pro pazinho que vem contar essa história um dia aqui porque eu lembro que então hoje hoje hoje o jav o Java é verboso para quem não estuda cara assim de verdade não o Java ele é vergos já foi ele já foi ele já foi assim um desafio né com XML com as parad toda né Mas assim a diferença é que o programador não precisa escrever mais tudo mas continua sendo um um verbo não vai C cas cara com 50 caracteres a classe é Ou você tem Public static X no Java você tem público está vo b pronto público está vo bem é mesma coisa cara assim talvez o da Sil Talvez o texto ele fique um pouquinho maior sim mas cara você pega um eclipse eu não digito nada no Eclipse contr trac trob trob trob o negócio vai completando mas é mas é verboso você não precisa escrever tudo mudou muito mudou muito assim as a questão de de functions né Não sei se você já viu isso né questão de lâm da das interis n que você CONSEG encadear código ali eh mudou muito a sintaxe do Java hoje cara é completamente diferente do que er Não mexa com o ego no programador Java falou mal do Java eles vão voltar verade fazer um episódio fazer um episódio aqui comparando Zone cara Rone é tipo mostrar que faz na tela Python node e Java exato Java versão 21 e aí a gente coloca 2 milhões de registros para ser processado aí ganha não aí não tem que falar ó aí Java ganha ganha quem escrever menos car car Você gosta do Kafka você você acha o Kafka [ __ ] [ __ ] PR [ __ ] feito em Java velho então faz o seguinte mano faz o seguinte cara entra lá ó vou fazer merch agora entra lá na na lura e faz o cursinho de atualização cara faz o cursinho de atualização bicho cara Eu consumo o Car ficar no no de boa eu eu peguei esses dias aí falei não eu vou tirar a certificação do do Spring né Aí eu entrei lá aí o dem velho fazendo merchan aqui dos cara ó faz isso você também cara entendeu Eu gosto de Java cara eu eu não estou bem cozidinho na panada de pressão fica uma delícia de bins ele adora Bin um binzinho Bem cozido e tal mas eu gosto ainda mais de zoar quem gosta de Java é mais gostoso ainda Ó mas pegando esse gancho aí né que a gente tá falando de eventos né então assim só pra gente frescar a memória de quem tá tá escutando a gente aqui fazer essas piad toda né evento é a gente compartilhar uma alteração de estado e um um objeto uma entidade alguma coisa mudou o estado Puf eu tenho um evento eu lanço para alguém que vai posso fazer um parentes aqui para para não ter confusão não não faz o seguinte faz um um Chaves ou um colchete cochete cochete fazer um cochete então a gente é muito engraçado cara essa daqui essa daqui eu demorei Eu juro que eu tô por dentro Eu tô eu tô rindo tô por dentro tô gargalhando o cara o cara o cara o cara depois tá no meio do banho lá na casa dele porque quando a gente fala de evento a gente tem a comunicação por evento que est falando com cafca etc que é uma abstração mais longa mas a gente tem os eventos internos da própria aplicação que é os retornos das Promises etc evento por por por por por si só né é um conceito isso você aplica onde você quiser Que nível você quiser né exatamente Então você tem no nível eh de aplicação você tem quando você tem uma aplicação web você tem vários eventos na interface isentão aqui a gente é que a gente tá tratando dos eventos internos da aplicação que é tratado pela própria jvm e você não tem que nós vamos chegar lá nós vamos chegar lá mas assim estamos falando de evento né Eh Mudou alguma coisa Puff eu tenho eu tenho algum estado alterado eu tenho uma uma requisição feita nesse processador de Vent é não é que eu quero deixar claro é que não estamos falando de mensageria estamos falando de evento de negócio qual o exemplo por exemplo D um exemplo aí de situação dessa fala do ponto de vista de negócio chuta pega um não eu ia falar aqui né eu ia falar do do do Spring eu ia falar de como eu eu consigo lançar eventos dentro do Spring é que você deu o conceito de evento né pra pessoa saber que a gente tá falando de eventos no geral né E aí eu tenho a possibilidade de falar de evento de negócio então o evento de negócio é o seguinte mudou o estado da pessoa né a pessoa foi cadastrada a pessoa tava lá como aguardando validação aí ela foi validada Puff é um evento novo né nova pessoa nova pessoa foi lançada eh eu tenho não importa o gatilho desse evento não importa o gatilho poderia ser inclusive uma mensagem cfca onde eu tenho um subscriber que gatilhar esse evento dentro da aplicação nesse caso da pessoa normalmente é um programa cobol agora pode ser por exemplo uma tela o cara eh tava fazendo um processamento na tela a tela deu um erro um um evento foi lançado né deu um evento de Crash lá o JavaScript sabe receber isso eh então a gente tá falando de eventos mesmo conceito aplicado em tecnologias diferentes e aí puxando o gancho aqui do Spring ele tem isso a JV a o aplication context do do Spring ele tem um um mecanismo interno que ele te dá eventos então ele ele tem um evento assim a aplicação inicializada aplicação eh estado de erro o próprio Spring né o próprio Spring tem uma máquina de eventos que te ajuda a fazer e esse processamento interno ali de objetos né E você pode usar isso então tem lá uma interface chamada application event que você estende né e e você pode atachar essa esse essa Classe A um evento que aí o sei lá o teu Spring boot Starter Kafka lê lá do Kafka uma mensagem e dispara essa mensagem e dispara essa essa Esse processador né ou eu posso ter listeners do desses eventos ali dentro né vários né Você pode ter vários obje tenhos dentro da sua classe do do do teu Spring context que fica escutando esses eventos né que é o que a gente chama de programação reativa né a aplicação ela reage aos eventos que ela mesmo produz ali do do do próprio do próprio contexto onde ela tá inserida né então eu vou gerando eventos e eu não preciso ter uma como gente chamava do paradigma não é IMP positivo cara é declarativo não declarativo não era é o contrário de declarativo determinista não não volta dá um procura na internet corta isso daí procur contrário de procurar aqui é não que é para imperativo imperativo manoo que é o o eu não preciso necessariamente eh ao gatilhar um um um evento eu fazer uma chamada do método eu já tenho declarado de forma reativa O que fazer quando aquele evento é declarado né então eu já tenho uma reação esperada a um determinado comport ento né isso lá no começo era chamado de programação orientada a aspectos Depois virou programação reativa né enfim então des cara fando o fundo tá comentando nesse caso no conceito do application context é que ele acontecem diversos eventos assim o Bin ele não aparece lá simplesmente tem um tem before bubles eu não lembro o nome dos eventos e você pode reagir a essas no ciclo de vida por exemplo de um de um bim né o exato e e você pode fazer o seu ciclo de vida também seu próprio ciclo de vida e aí você vai lá lança um evento Puff eh mandar uma mensagem vamos fazer o seguinte ó eu quero mandar mensagem pro Kafka a minha aplicação em vez de eu criar lá um dentro do do sei lá no meu repository né uma mensagem que vai lá pro Kafka eu posso lançar um evento ó Mande pro Kafka quando quando quando der eu eu desconecto a tred faço o que eu tenho que fazer e aquela mensagem foi foi pro gerenciador de eventos do contexto do Spring E aí ele vai ter alguém que vai vai ler esse essa esse evento de mandar mensagem e vai mandar a mensagem ou gravar log né Quantas vezes você tem lá um processamento que ele ele é crítico E aí no final você precisa gravar uma mensagem de Log em algum lugar e aí poxa será que o log faz sentido eu esperar e eu eu onerar minha trede principal Será que eu preciso colocar um arass Às vezes eu não quero nem fazer desse jeito eu quero botar um evento ó grave logo em tal lugar pronto ele vai gravar né para um evento a natureza do evento ela é naturalmente assíncrona exato então alguém vai capturar isso desde que você tenha declarado esse list senão ele vai pro pro espaço lá e aí lá você tem a lógica de persistência lá no momento no momento antes da tred cair fora por exemplo você captura ali e ali entra o log por exemplo inclusive isso é bom porque no final final do processamento da sua trade principal o evento foi disparado e você não não perdeu aqu aquele evento aquele ele ele vai mesmo que a sua tred principal ela morreu e ela disparou um evento mesmo que a lógica do processamento daquele evento ele não tenha se executado ele tá lá no pul ele vai rodar exato então a gente a gente trouxe aqui o mecanismo do Spring né a gente tem um exemplo e que uma outra tecnologia usa também que é o cafca Né o o Spring boot Starter usa isso para trazer mensagem do kafica para dentro dos objetos do Spring eu já usei isso também para falar de objetos do redis que foram eh inspirados o Spring boot Starter do redis ele lá conectados no redis né ele recebe uma notificação Puff tal objeto foi inspirado aí como é que como é que a sua a sua classe vai vai processar esse dado né também é um evento Então sua classe vai lá estende de um eu esqueci o nome da interface né Mas você estende essa essa interface falando ó quando o o o a tua chave do Cash expirar você Puff faz esse processamento aqui ou atualiza né consulta de novo para pô no cash E aí você faz todo um processamento assim fiz uma arquitetura baseada em redis olhando para isso né pro evento de expir do do redis configura para manter um kip Alive do dado quente né ele ele chama um callback na sua aplicação se você como era uma arquitetura distribuída o redis chamava o balconista falava Opa expirou e ele jogava para uma fila aí o cara dessa fila consumia essa mensagem fazia uma chamada num outro web service para pegar o o datado atual e persistia de volta no redis é ali basta a gente já fez isso acho que lá lá mesmo na empresa de de seguros lá É ISO lá meu você basta você chamar o mesmo método que coloca no cash que tem o Cash lá em cima você chama ele mesmo e ele já coloca de volta é tão simples assim né então de novo né outro mecanismo para você tratar com a sincronicidade sem ser trad né com paralelismo sem ser trad e o programador Spring boot Master aí tem que tá ter isso na manga é um evento do redis é um evento do redis que é traduzido para um evento do Spring boot Spring boot Exatamente exatamente bom você que tá vendo esse podcast da hora tá vendo um monte de problema aqui que a gente tá colocando né e Quer uma ajuda aí na sua empresa faz o seguinte entra no site aqui da vmbs que a gente pode te ajudar vem be.io nós somos uma empresa relacionada à arquitetura de soluções a modernizações e aplicações também atuamos na frente devops para ajudar vocês a serem extremamente ágeis então dá uma olhada no nosso site que vai est aqui embaixo vb. i e lá você vai poder ver um pouquinho da nossa história dos nossos profissionais e aproveitando se você for um profissional da área de tecnologia que tá Aim de trabalhar numa empresa legal um monte de colega gente boa e tecnologia te ponta manda o e-mail para people care @ vmbs já agora eu quero meu show já que a gente falou do redis aqui desse movimento de manter o dado quente em cas etc que outras características que o Spring tem para Tá Com cash cara cash pro Spring é sai na urina é transparente cara vai ser 18 mais mesmo esse episódio é 18 mais Maso é um termo os médicos usam esse termo sai na urina não cara ass porque realmente sai na urina cara pro Spring velho é diferente dessas linguagen zinhas MEF que você usa C linguagen zinhas MEF Ah cara você já começou falando aí de umas não sei o que com pitão pitão é cara ess bem que é treff que você usa cara é não é linguagem é script é é interpretado aí o jvm não é interpretado você você tem o o b code ó o bite code é o jeito mais bonito de chamar linguagem interpreta pois ele ali ele ele vira código nativo compilado nativo nativo em tempo de execução sei meu assim wellon eu nunca vi um Java pxe Então não é nativo continua vamos fazer isso na próximo episódio nó vamos fazer isso no próximo epis gra VM e versão a parte quatro a gente vai fazer igual o o o John Wick velho passar faca passa faca em todo mundo velho então fique vou furar vocês e vai buchar inteirinho cara sacanagem ó vai bicho cash pro Spring cara é um Starter no pom depois automaticamente as anotações é @ cashb Cash cashb cara tudo que passar naquele método que tiver com essa anotação cashb baseado nos parâmetros de entrada hum ele cria uma chave pro Cash E aí o retorno é cacheado bicho e acabou retorno do dos métodos da classe M exato É você você chama por exemplo é uma consulta é chave valor eu passo um ID do métod vai ele vai o ID da pessoa ele vai ID da pessoa não passa um Ranger de data aí ele retorna 20 pessoas daquele R data exemplo o retorno Dependendo do provider que você usou de que é um Starter um p que você colocou ele já joga para aquele direto el primeira coisa né já não tem loquin já começa por aí se você tiver essas linguagen Zin mais ou menos você vai ter que fazer lá não sei quantas linhas sem emoção Calma eu tenho método método é tipo CPF e Range de data C CPF get CPF é não vamos complicar um pouco mais CPF e de data beleza retorno a rei Sei lá o Jon é o Jon de qualquer coisa isso já você não precisa retornar um Jon né lista porque tudo tudo é é automaticamente é convertido mas linguagem nenhuma você precisa retornar um jeisson jeon é ling linguagem que você usa aí jeon é um protocolo de output não você você constrói string lá velho a camada de integração você usa converte para um protocolo Isso é uma rei e E aí é que o Valdir Tá emocionado ele entendeu Valdir ele tem uma paixão né É maravilhosa isso não que você não tenha também mas você é mais contido eu sou eu guardo É platônica a minha é platônica Então esse método eu tenho a assinatura desse método eu tenho como chave o input dele e eu cacheio o retorno é ele cria uma chave para você pode ser composto Pelo Baseado pelas entradas pelas entradas isso porque são os são os inputs né então eu sei que aquele método para esses inputs eu não preciso executar de novo porque eu já sei que o retorno é esse Inés dele in vez dele ir lá naquele entrar no método o corpo do método e chamar 13 apis lá atrás para conseguir o que ele quer já sei que aquele retorn ele já vai direto no nos provider De Cash porque ele sabe que aquela chave pergunta tem chave aí essa chave tá aí tá pega daqui direto isso aí a pergunta que o arquiteto sempre tem que fazer como que eu configuro o ttl e o método essa anotação essa anotação que você coloca em cima do método para indicar que ele ele é cashable você também tem propriedades né então você tem propriedades como o ttl você tem propriedades para indicar como é que você vai fazer a inspiração daquilo mais eu uso um driver para saber se isso vai para um redis vai pro f systemar a gente falou um pouquinho disso no episódio anterior né que os starters do Spring boot são as configurações as pré-configurações que você utiliza para para configurar um recurso interno então eu uso um Starter de web para falar que a minha aplicação ela tem a capacidade web e eu também tem o Starter web tcat que fala que a capacidade web ela vem do tcat ou eu posso ter um Starter WebJet que é outro servidor né Eh htp htp compliance é ou eu posso ter um undert então eu tenho vários sabores né de Starter e eu tenho também por exemplo o Spring data JPA eu tenho Spring data JPA com hibernate ou se eu quiser eu posso ter o Spring data com Eclipse link e porque o Java né o Starter ele é como se implementasse então uma Interface para aquela capacity com um determinado driver é o Starter ele não é uma interface a interface ela ela é maior que o Starter sim é é é é uma abstração para para entender eu tenho eu tenho ali uma uma fronteira uma fronteira eh que eu vou utilizar os meus annotations para fazer a mesma capacidade Mas dependendo do Starter que eu inicializo ele implementa dentro dele como eu vou fazer por exemplo o Cash se é um Starter que eu vou implementar em disco ou em redis etc tem do Oracle enfim você usa @ eh cashable que é do Spring E aí depois você escolhe o provedor Cara você não ess Amã eu quero trocar o Cash Eu só troco lá o código fica igual eu desacoplo então se eu instrumente com todos os annotations a minha classe para ser cashable E aí depois eu troco meu Starter para outros parâmetros para vez eu cachar em redes cachar em disco a minha classe não tem Impacto nenhum e ele continua ele só troca o meu entre aspas driver para queixar em disco e não em redis por exemplo dá um jeito de fazer com que fique Transparente é através de lá dentro com certeza ele vai ter interfaces garantias de de né de interfaces é no no fundo é é comunicação por interface né não dentro do Starter né chega um ponto que você tem que ter essa comunicação meio que o contrato ali perto do cashable tem que tá garantido mas dali para trás ele te entrega todo isso tem toda uma implementação para trás mas não é um absurdo a gente imaginar que toda classe de Starter para Cash tem uma interface padrão onde os métodos são os mesmos é isso que acontece por peg o redis o redis ele tem um protocolo chato ele é ele é chato ele é ele é chato se você tivesse que fazer isso por por H por por socket sim seria complicado ele já te entrega pronto botou uma linha de né s mas o Starter do redis ele implementa uma interface padrão de Cash que tem todos é para para abstrair ISS isso né valon que você acha exatamente sentido né e assim pro programador cara faz nada para ele é pro programador se ele se ele quiser o sabord Def né o palmilha ele @ cashb Ah quero dar uma uma uma melhorada [ __ ] vai lá não você estende nada não bicho e você cria uma classe chamada baranha configuration que é sua é da tua aplicação Aí você coloca lá em cima @configuration aí o Spring sabe essa classe aqui ela tem que ser inicializada lá no começo do do do do ciclo de vida dos beins né E aí ela vai ela tem algumas e o Spring é todo baseado em objetos que você joga lá no no contexto a gente também falou disso aqui no na parte um né quando você cria lá uma configuração que você quer você joga pro contexto ó essa aqui é uma configuração do meu do meu redis aí o Spring ele vai automar automaticamente pegar aquela configuração e e configurar a sua comunicação com o redis você intercepta o padrão do redis que tinha sido colocado no meio do caminho intercepta ele altera ele e deixa ele voltar PR deixa ele voltar pro contexto deixa ele voltar pro pro pro caminho feliz dele né exato cara então assim o Spring Ele trouxe isso também né é o Spring boot Ele trouxe isso é a cap a valor valor Def tudo tem valor defold cara ah quero pro banco de dados Poxa você só precisa dar o IP usuário e senha acabou mas tem que selecionar o driver para saber qual que é o não o banco que eu estou conectando certo pro caso pro pro caso do banco de dados né a as interfaces do jdbc elas são extremamente bem definidas é aí o Starter seria um jdbc exato E aí o driver do banco é uma propriedade jdbc certo Exatamente é isso Então nesse caso aqui ainda é muito mais abstrato ainda né agora no no caso do do Cash aí você já tem e um pouco mais de de de interfaces do Spring no meio Tá sim porque no cash a gente tem mídias diferente você poss ter um cas em banco po um Cash em disco Cash memória né Então rola até isso né e localmente no desenvolvimento você pode colocar o Cash em Memory no ele vai ele vai pro quando ele cai no outro ambiente que tem lá no servidor o c ele já você não mexe no código e ó para vocês ver como eu aprendo bem eu posso fazer tudo isso atrelado aos profiles do Spring para iniciar por exemplo eu posso ter um Cash em memória em desenvolvimento e um cach em redis em produção e isso pode ser alterado configurando os profiles do Spring você assistiu a parte um hein assisti cara tem um podcast muito bom que eu gosto bastante chama PPT no compila eles estão fazendo uma série sobre episódios sobre Spring eu vi esses dias lá os caras fal dis ah e e que lado da cabeça que ele tem que clicar aqui eu não sei é algum desses aqui ó ele El ele fez uma dancinha outro dia a dancinha do Aché é ele pá pá dos dois lados cara mas é por aqui ó tá aqui ó para qu aqui né produção aqui do outro esse aqui ó aqui ó Isso Tinha alguns né já de graça que era o próprio redit tinha o hussle cast né hussle cast é esse e os dois são gigantescos né esses dois são são gigantescos 90% merado exato é a grande diferença dos dois a gente estudou muito isso lá né no passado eh é a forma de de clusterização né um usava a estrela o outro era Centralizado né Eh mas tem o próprio em memória você tem lá um map no memory da da processo do da você vai ter um hash map ali para coisas que já é um RH map no final é um RH map concurrent Rash map é o nome da classe não e e convenhamos em casos que você tem tipo processamento pequeno etc você só quer evitar por exemplo uma chamada http a mais bom hashmap em memória resolve resolve exatamente Cara eu acho que assim o programador ele tem que ter essa esse discernimento do que ele tá fazendo se você tiver uma única processo né porque aquele cashing às vezes você quer que ele seja utilizado entre vários processos né gente teve esse problema lá você não lembra disso Eu lembro do dar do daril tô falando do daru que teve aqui daril teve aqui Você lembra do dar Qual que é o episódio dar do cara aqui foi uma aula he bicho aqui a gente falou sobre cara é é faça do jeito certo né indo PR PR Claud do jeito certo eu assisti inteiro chav vou usar esse braço aqui ó ó Teve teve uma teve um problema desse que acabou ficando no produção fica doida Ficou ficando acabou ficando no no no no na memória e por conta de serem múltiplos eh Pods né Eh deu problema então é uma a opção desse do Web desse Memory é mais para desenvolvimento mesmo então mas é o mesmo caso que a gente falou antes das próprias tredes Exatamente exatamente às vezes essa barreira entre a escala na no contexto da aplicação e a escala nível infra tem que ser muito claro pro programador porque você tem que fazer uma aplicação para ser stateless para poder ser escalável a nível de infraestrutura porque senão o seu pod vai vai escalar E se ele foi desenvolvido para ser uma aplicação única monolítica onde ele gerencia tudo o que ele faz seja em cash seja em treds etc você tem que imaginar que você vai ter um clone depois velho e isso já a sua unicidade de Pool De Cash e de trads já foi pro saco já aquela inviabilidade inviabilizou não inviolabilidade isso aí que o Marcelo falou inviolabilidade do seu Pool ou do seu cash e ou até o sincronismo do dado nessa parada já foi pro saco né porque você tem um outro Clone rodando do teu lado Cash é muito fácil cara no spring bicho é muito fácil fácil e assim como as outras capacidades que a gente tá falando aqui o que é difícil é usar direito sego é usar direito o biche E aí o Spring tem disso né ele te dá muita coisa ele te dá ali a versão eh palmilha né mas você precisa você sabe de onde vilha n vanilha né que o pessoal fala do do sorvete é É isso mesmo tudo bom Não posso falar em português pode pode o nome do teu do teu podcast é inglês ou em português não é porque tem um contexto P PPT doas not compile isso é que essa questão do Bal Depois eu te conto offl mas o o ponto é esse né E aí até pra gente ir pro próximo passo né que faz todo o sentido essa discussão de capacidade na aplicação versus capacidade na infraestrutura É agendamento [ __ ] E aí vou botar o agendamento dentro da aplicação boa o Spring pode tá o Spring ele tem lá uma anotação que também não é dele né é da especificação mas ele que ajudou a especificação chegar lá do Java eh @sad você coloca em cima isso em cima do seu método Puff aquele método ele vai ser chamado recorrentemente baseado no período que você colocou dentro da das características dessa dessa anotação né Ah eu quero que ela ela seja executada a cada 5 minutos ela coloca lá você coloca lá num igual igual você coloca no Chrome né E aquele método executar toda vez posso ser polêmico agora não pode sempre posso não seu dever seu dever por favor eu acho que todo método sked Independente se ele é chrom se ele é Spring se ele é Cloud Run eu pode ser um pode ser um pouco preconceito meu porque eu acho que tipo todo Bet nasce assim e nasce errado todo bho eu acho que todo Schedule ele poderia ser evitado não vou dizer que tipo 100% mas eu acho que se a gente pegar no mundo da ti é se eu se eu trato O Mundo É eu acho que vou tentar adivinhar você me dar um soco na boca se eu tiver falando merda garrafada cara garrafada eu tô entendendo Wel tô imaginando que você tá falando o seguinte se eu fizer o uso de eventos de maneira potente mesmo real corporativa eu não preciso mais de Bet e exato se se eu se eu tiver um momento onde eu tenho arquitetura bem ajustada etc cara eu vou ter 1% dos casos onde eventualmente eu posso ter um processo que é gatilhado por tempo Eu nem eu nem chamo de processo esed lado é é processo gatilhado por tempo porque às vezes eu posso ter alguma coisa que eu tenho que rodar 5 horas da manhã mandar Nuk pro Window dos caras pro Windows dos caras para quebrar os Car a máquina dos caras isso é isso a o inuk é coisa de velho vocês não sabe que é o Você lembra do in eu lembro eu lembro mas não lembro do horário mas bom continua palhaçada né cara falando coisa séria com palhaçada aqui não mas é uma boa é bom vamos vamos ter que fazer um episódio sobre velharias tipo subseven e etc Vel Mas enfim eh eu acho que se você abstrair uma boa arquitetura de comunicação por evento seja mensageria seja ah eventos dentro da própria aplicação como a gente falou aqui cara vai sobrar 1% de necessidade de você ter eh eventos que são periódicos e eventos que são gatilhos por tempo porque o evento que ele é periódico ele remete a pulling naturalmente cara e e você consegue por muitas estratégias de arquitetura evitar pulling né você pode fazer isso por pus por mensageria etc agora eventualmente Você pode ter uma regra de negócio que você precisa ter aquilo lá em determinado momento e etc você tem razão no que você tá falando né de fato é no estado da arte né no estado da arte você tem que fazer isso e eu vou dizer mais no stad art você não tem que fazer isso na aplicação você tem que fazer isso na infraestrutura porque aí a infraestrutura só usa enc controu m é você pode ter um C um abraço IBM IBM a IBM ultimamente comentou até o você vai você vai querer você vai querer ir pra sua casa a gente vai comer hambúrguer vai ter dois malucos de terno 1,90 na porta assim esperando gravata vermelha gravata é porque agora é vermelho não é mais azul agora ele vai est de gravata e chapéu vermelho chapéu vermelho red hat gravata azul e chapéu vermelho hã um híbrido mas o ponto é o seguinte ó você tem razão Eu concordo com você do ponto de vista de arquitetura que a gente tem que ir para o o orientação eventos né igual o Marcelo tava falando aqui e e você né Eu tenho um evento de negócio que dispara eh o processamento de vários registros E aí eu tenho que tentar trabalhar com esses ditos no melhor no menor nível de granularidade para que eu consiga processar ele e tudo mais tudo bem concordo com você porém todavia no entanto né existem situações adversas que você precisa de alguma coisa que Rode lá um período Você mesmo falou do tal 1% né é 99% como que é 1% é vagabundo 10% é vagabundo então e E aí o o Spring traz né uma implementação lá da própria Java né que é o @ Schedule que é toda uma configuração que você pode fazer para a tua J para o o teu texto do Spring que está rodando na jvm disparar um processo eh e isso usa todos os benefícios que a gente falou aqui do processamento assíncrono né Eh até o o o o tesk Executor você tem também pode usar ele para processar essas essas trads que são eh esquid ladas né eh e aí você vai ter outros problemas né você vai ter a questão de vários se você tá numa arquitetura multic e em Cloud né E você tem vários cont não podde todos os Pods vão subir esse esse processamento o Spring Tem suporte pro Schedule para garantir que só um suba usou isso o shadlock posso ser o chato de novo é É o Framework shedlock tô dando spoiler né você ia falar isso mas o o então assim você tem que tomar cuidado com isso né E se você tiver lá fazendo se seu programinha e tal se ele tiver em vários contêiners ele vai subir eh em todos os contêiners que estiverem ativo e Pior né se você tiver usando uma escalabilidade do dos seus contêiners se naquele momento você tiver sete contêiners vai subir em sete containers diferentes se tiver três vai subir em três Então esse framer que a gente tá falando aqui O O shedlock ele faz Essa gestão né mas ainda assim a gente a gente tá falando né Um pouquinho disso talvez não seja no contêiner que você tem que gerenciar isso você tem que levar isso para a infraestrutura então houveram cenários que a gente precisou disso a gente usou a capacidade do próprio Google lá a gente usou aquele Google tasks isso E aí você bota lá um Chrome ele dispara um um evento ele pode botar uma mensagem numa fila a partir daí o teu o teu pod vai lá e ler isso eu tenho dificuldade de encontrar um caso de uso onde você precise ter um Schedule no contexto da aplicação porque quando a gente tá falando de uma transação atômica não mas cara sabe o que que é você tá trazendo tá trazendo um problema para ser resolvido e talvez por empresas que tenham muito dinheiro não não tem uma infura muito grande agora vou discordar Às vezes o cara tem ozinho lá rodando não mas eu vou te dizer e é uma capacidade que o Spring boot tem ou que que o J tem eu vou te dizer por e vou usar argumentos que vocês mesmos usaram aqui agora não eu eu concordo eu não faria assim ó por exemplo eu tenho lá um ar Schedule Beleza se é um processo atômico eu tenho que rodar um determinado método e tal a 5 horas da ele não precisa ser atômico ele ele precisa disparar um um comportamento ele ele pode inclusive ele ele pode disparar e colocar um monte de mensagem na fila e depois morrer beleza eu posso ter um um gatilho beleza e aí eu posso ter isso externo e disparar um processo esse processo ele pode inclusive escalar com vários Pods e resolver um determinado problema aí OK é o contexto que a gente falou de ter um gatilho externo da infra Agora eu tenho dificuldade de entender dentro de uma aplicação onde eu precise usar o Schedule que eu não consiga resolver com promessas Esse é o ponto Acho que são não são promessas não são promessas é 100% diferente um sked é diferente de promessa o ele tá mais para um um um evento processamento de um evento mas porque em determinado momento Eu precisaria ter um horário e uma coisa fixa que eu não conseguiria resolver com uma promessa não mas não é uma promessa cara uma promessa ela nasce num processamento síncrono síncrono mas ela tem um processamento assíncrono mas a o sked ele ele nasce a partir de um momento um instante de tempo sim mas em que momento como é que eu disparo esse processamento síncrono que vai disparar o processamento assíncrono então esse cara não ó pensa assim ó corta a cerveja pensa assim não pensa assim não cara não é pensa assim é o o o Schedule é cara é um Bet cara no final é um Bet sim mas ele é gatilhado em runtime é isso que eu quero dizer eu tenho esse cara que vem de fora eu entendo é a mesma coisa então mas por que que eu criaria isso em runtime e porque não ten porque eu não tenho uma ferramenta de infra que faça isso pô mas tá errado você deveria ter a ferramenta de infra então pô não tudo bem Você imagina que um processamento tão pequeno dentro do seu esinho ali eu não gosto disso já falou que não gosta também assim como você também não gosta né de pensar em fazer a gente quer a gente gostaria de fazer sempre com porque [ __ ] você tem que manter aplicação ativa para fazer isso não não é só para isso às vezes o cara bota isso junto do Web que tá lá eu já fiz isso lá lá mas tá errado tá errado tá errado eu já comi toco de programador lá na época lá na na na seguradora porque aconteceu isso muito eu via isso P mas o Web você vai na hora que subir esse cara você vai tá roubando recurso do Web vou te dar vou te dar vou te vou te dar um exemplo de usar o sked vem na cabeça aqui agora foi quando como é que vai fazer um Schedule num aplicação que temar Ativo será tem que ser state vou te dar um exemplo vou te dar um exemplo não tá pouco errado não tá errado PR [ __ ] ó vou te dar um exemplo agora vou tomei esse gole aqui de cerveja me veio esse exemplo na cabeça hein vai dar um exemplo que tá errado pensa só não tem como tá certo eu tenho um Cash Central lá no registo Tá bom eu tenho vários container zinhos ao redor Tá bom eu preciso fazer não é eu faria diferente mas eu precisava V tá errado não tem compensar um jeito certo velho não tem o o o skad ele pode ser alguma cois Alô pessoal do Spring por se esqu só ajuda o programador fazer pode ser alguma rotina periódica PR para ajustar aquele sei lá Algum objeto dentro da da bota no kubernetes velho não mas eu eu não gosto eu também não gosto eu não usaria bota no kubernetes então lá lá aconteceu assim como é que tava real mesmo assim tinha aplicação web tinha o contêiner dentro de um cets e o programador precisava de vez em quando lá não sei quanto tempo ir lá na tabela fazer uma lista e processar e jogar na outra tabela o cara não queria eu fiz o desenho pus no desenho Ah mas vou ter que fazer um negócio fora vou dar um tiro de canhão para matar uma formiga sendo que já tá aqui tal é entendeu E era um negócio mesmo menor aí essa hora que você fala cala a boca então É mas assim funciona né funciona e funciona bem com esse risco aí que se o cara vacilar oito contêiners oito BS junto não e e o problema é tipo cai o backend não roda mais Bet é isso é isso não é ruim cara não é não é não é a melhor opção melhor opção é isso que você falou no primeiro acoplamento aí por ex Mas ó Isso aqui é antigo hein vamos lá a gente tá falando do do de uma capacidade que ela vem lá de 2000 pouquinho né você tem lá um processamento eu eu não lembro exatamente o kuber o kuber nasceu quando Puts cara PR você dar essa solução linda aí 2000 e eu ten que saber a data engenheiro de oba pronta data agora 2018 17 18 sei lá lá atrás era diferente ó a mesma especificação que você vai pegar o yemo lá do pod tem um emo para Bet não tem isso aí quando que nasceu isso aí junto com cnet é então eu você tá Spring boot engenheiro de obra pronta a última a última versão do Spring boot é de quando já tinha kubernets ontem então tá errado antes de ontem então tinha que usar o kubernet quando a gente faz ISS ess negócio não tinha trator amor era no cabo de inchada exatamente o cara Arava Arava lá o o o o bom mas pera aí vocês estão falando que não porque o Spring é moderno se que aí agora quando aí quando é moderno é moderno aí agora quando quando é velho É porque era velho falando que isso existe desde lá de trás e cara o nosso objetivo aqui é falar de todas as armas que você tem no cinto de utilidade certo até as erradas do Batman tá lá tá lá Batman entendeu tá você vê aqui o c de idades ó puf a garruchinha a garruchinha ali que tá ali se precisar você passar a mão não tiver nada você tá dormindo puxa a gaveta tem uma garrucha dentro você atira Spring boot é bom até para fazer a gambiarra ó cara que mais temos aí ó temos algum alguns minutos olha cara o assunto de testes é grande é Melhor separado Vamos fazer um pode fazer um só para testes traz o Johnny que o Johnny gosta muito o Johnny falou cinco vezes sobre isso na na quando a gente tá falando do do parte dois e aí tem o Beyond The Filter né Tipo a gente a gente tem um episódio inteiro para falar de o que vem pela frente o que vem pela frente cara então Spring boot nativo na nuvem exatamente gra Native Spring boot quero código nativo Spring boot já roda em cess nativamente ou eu tenho que compilar um docker com Spring boot rodar em lá na w a gente já fez rodar tá a gente já fez rodar dentro de uma function lambda o o o Spring bozinho ali para para inicializar tal lá com framer o serverless Framework lá da aws né Exatamente é isso entra por aquela porta do aws e ele sobe o contexto é só assim no não é uma brast temp uhum né ainda porque a gente fez no modelo antigo ainda melhor rodar um docker né não não não é como servel não como serverless é melhor fazer Java puro ali chava p não mas digo assim ó quero quero fazer uma aplicação Spring boot ah não aí eu consigo rodar ele direto no lambda ou ainda é melhor eu subir docker rodar o docker no lâ conta a história toda conta a história toda você faz uma pergunta a depois vai para C depois volta para B depois vai fazer é para saber a capacidade do convidado se ele consegue perceber se tá qual contexto É isso aí é mas o ponto é o seguinte ó vamos voltar pro início Spring boot e na versão 3 né Então hoje você tá terminando ali a versão do tá indo PR três a versão TR do Spring boot ela é compatível com a versão 6 do Spring e ela já tá e baseada na grau VM Então você consegue ter uma compilação e muito assim muito demorada porque ele compila pra máquina e aí a velocidade de inicialização desses componentes são monstruosas né Então você já consegue ter isso com o Spring boot E aí você ter e uma velocidade assim de de de de milésimos segundos para inicializar né Então tá bom e isso é uma coisa tá o que que eu e o Marcelo nós já fizemos né para testar para brincar tal a gente já usou e a WS seress com Spring boot sem essa capacidade a gente usou e a capacidade Hot eh não era era não era era Swap esqueci o nome da da do ah do própr da própria lâm né da própria lâm porque a gente fica falando assim mas a WS ela tem um uma apresentação que ela fez que ela falou assim mais de 50% das functions que nós temos hoje elas são feitas em Java Então ela criou uma capacidade que é a seguinte você a eh quando você inicializa a a a tua jvm depois que ela tá pronta ela tira uma foto e aí nas próximas vezes que ela for entregar a um contêiner com aquela com aquele código para rodar da sua do seu servel ela já pega a partir dessa foto ela ela já pagou o tempo de inicialização antes da foto entendeu s então Eh isso Isso é uma capacidade daws então a gente usou lá uma um um serverless com com Spring boot desse jeito era bem rápido tá mas aí é código puro que eu subo na em lâmbda para ser interpretado direto no no em lâmbda não é um contêiner que eu estou subindo para rodar em lambida porque o lambida ele consegue processar código e contêiner certo isso no lambda ele tem as linguagens que ele consegue rodar isso lá tem o Java se tem Java você consegue subir Spring isso e esse modelo que você est falando é subindo direto a linguagem para ser interpretar direto no lâ né não é nativo ainda isso E aí a gente fez funcionou tá ficou legal porque por conta dessa capacidade da WS então a gente nem a gente nem chegou ao ponto de pô compila em grau VM tá e beleza Eh respondi a tua pergunta não sim ficou ficou sequenciadas Snap start Snap start Snap start exatamente a a dúvida era essa se eu conseguiria por exemplo rodar no código JAVA direto o Spring direto no serverless ou se eu preciso containerize para para usar que nem por exemplo um fargate ou o próprio lamida executando contêiner né ele levanta um Java pode ser o Java puro ou pode ser o Java com um contexto Spring é onde eu levo o contexto Spring dentro do próprio código JAVA puro ele entra naquela porta de entrada que todo uhum todo lâmbda vai ter não importa a linguagem ali dentro você sobe o contexto do Spring E aí dali para frente é Spring sim tem assinatura padrão do lâm você instancia o Spring lá dentro Beleza fica é muito bom cara a gente usou numa aplicação que é assim é bombardeada bicho eh fica de pezinho lá rapidinho também sabe vale a pena e partir da frio funciona bem não é esse Snap start aí é meio meio isso né É isso que ele ele resolve entendeu po isoir na lâmbda lá na na lâmbda você seta como um Snap start ele tira essa fotografia tem um pedaço do do do do ciclo de vida da lâm que ele já tá na manga já tá já tá pré-compilados vai dali pra frente então você diminui o o tempo de carga né agora uma uma um problema ainda assim é o tamanho da J da do jar né do jar né então assim o tamanho fica grande a a função ela vai precisar de mais memória para inicializar porque o tamanho do jar é grande porque é muito texto Dentro mas esse esse esse caso aí deu deu 2 m né de de memória mas logo na sequência a gente rápido por conta o Val falou isso no outro Episódio por conta da da arquitetura hexagonal a gente tirou o Spring como num passe de mágica não tinha mais Spring aí ficou jáva puro aí ela voou muito bom muito bem acho que para um episódio avançado a gente conseguiu avançar PR caramba aqui para não dar 18 Mais é para não dar 18 mais para caramba aqui nesse Episódio agradecer a presença aqui dos grandes parceiros mestre em jav eu brinco demais com esses caras mas a minha admiração por esses os dois aqui no assunto Java Spring boot é imensa então Obrigado aqui pela pela presença de vocês de novo cara muito bom valeu Valdir Marcelo dá um oi pra galera aí um tchau né Valeu galera Ó o vai ter Episódio quatro né e depois vai ter também o que todo mundo renasce né o isso éis virou a série John weck ou eh o rip porque a gente tá fazendo a tá fazendo magia aqui velho tá fazendo magia is a Obrigado por poder estar aqui de novo Wel e agora com a camisa PPT não PPT não compila oficial nós estamos aqui fardado agora da nova identidade muito bom se você ainda não deixou o like se você ainda não se inscreveu no canal se você ainda não compartilhou o episódio se você ainda não deu cinco estrelinhas aí no aplicativo de Podcast que você está ouvindo a gente essa é a sua última oportunidade senão senão ele vai mandar o Valdir atrás de você isso e e ficar falando de Java você já ouviu a palavra do Java hoje já já viu como Spring boot Legal então se você não fizer isso o Valdir vai puxar o seu pé à noite e falar de lombo Então aproveita a sua última oportunidade Compartilha esse conteúdo valoriza o criador de conteúdo porque dá trabalho fazer essa parada seja o PPT no compilou seja qualquer outro tipo de conteúdo que você consome gratuitamente na internet através de Podcast valoriza a gente que a gente tá aqui para trazer informação para vocês então é isso meus amigos obrigado pela participação de vocês novamente valeu
[Música] [Aplausos] [Música] [Aplausos] valeu
Episódios Relacionados
1h 28minSQL vs NoSQL: Tudo o que você precisa saber | PPT Não Compila Podcast
Valdir Scarin
27 de ago. de 2025
1h 23minQuarkus: Java além da JVM | PPT Não Compila Podcast
Luiz Pais, Valdir Scarin
19 de fev. de 2025
1h 26minEstratégias na Adoção de Plataformas de Desenvolvimento | PPT Não Compila Podcast
Elcio Abrahão, Luis Rogerio de Souza
8 de mai. de 2024
1h 26minApache Kafka: Transformando Ecossistemas de Dados e Desenvolvimento de Software | PPTNC Podcast
Pedro Busko, Romulo Barbosa
13 de mar. de 2024
