Pular para o conteúdo
Cesar Schutz

Cesar Schutz

Publico aqui o que ando estudando — lançamento do Java, código, arquitetura, IA, o que me despertar interesse. Quando o estudo rende algo que vale guardar, vira artigo.

Arquitetura são as decisões que você gostaria de acertar logo no início de um projeto, mas que você não tem necessariamente mais chance de acertar do que qualquer outra.

Ralph Johnson

Ver o livro

Em destaque

Arquitetura de Software40 min de leitura

CronJob ou endpoint + fila — onde rodar o batch de uma API Spring Boot no Kubernetes

Uma API Spring Boot no Kubernetes precisa de uma rotina agendada: CronJob com a mesma imagem e o perfil batch, ou endpoint que enfileira no SQS para a própria API consumir? Onze critérios comparados.

Ler artigo: CronJob ou endpoint + fila — onde rodar o batch de uma API Spring Boot no Kubernetes

Artigos recentes

26 artigos publicados

  1. Atualizações do Java46 min de leitura

    Java 29 (próxima LTS) — o que o Java 26 e o 27 já trouxeram

    O caminho do Java 25 até a próxima LTS, o Java 29 (prevista para setembro de 2027): as JEPs do Java 26 e do 27, o que ainda está em preview, exemplos de código e o que conferir na migração.

    #LTS#JVM#Concorrência#Criptografia

  2. Dados19 min de leitura

    Bloqueio otimista e pessimista — como funcionam e quando usar cada um

    Como impedir que gravações simultâneas se atropelem: coluna de versão ou trava da linha. SQL testado no PostgreSQL, Spring Data JPA, NOWAIT e SKIP LOCKED, deadlock, isolamento e o UPDATE condicional.

    #Banco de Dados#Concorrência#Spring#Trade-offs

  3. Desenvolvimento de Software24 min de leitura

    Virtual threads no Java 21 — pinning e CLOSE_WAIT

    Por que um serviço Java 21 com virtual threads congela sem erro no log: pinning por synchronized (resolvido no Java 24, JEP 491) e CLOSE_WAIT como rastro. Thread dump, JFR, bulkhead e circuit breaker.

    #Virtual Threads#Concorrência#JVM

  4. Arquitetura de Software10 min de leitura

    Efeito externo sem registro local — a cobrança passou e o banco não gravou

    A captura no adquirente passa e a gravação no seu banco falha: grave a intenção antes de causar o efeito. Escrita dupla, outbox e relay com SQL testado, conciliação, CDC, event sourcing e 2PC.

    #Pagamentos#Mensageria#Banco de Dados

  5. Arquitetura de Software11 min de leitura

    Chave de idempotência — como impedir a cobrança duplicada no retry

    Por que consultar antes de gravar não impede que um retry cobre o cliente duas vezes, e como resolver com chave de idempotência, restrição única e resposta guardada. Com SQL testado no PostgreSQL.

    #Pagamentos#Idempotência#Banco de Dados

  6. Arquitetura de Software31 min de leitura

    Arquitetura de ledger — partidas dobradas, saldos e conciliação

    O que 12 artigos ensinam sobre ledgers de grau financeiro: registro append-only, double-entry garantido pelo banco, saldos materializados, idempotência e conciliação como entregável de engenharia — com exemplos em Java.

    #Pagamentos#Banco de Dados#Idempotência

  7. Arquitetura de Software7 min de leitura

    SNS MessageAttributes e Filter Policy — filtrando mensagens antes do SQS

    Como fazer o SNS entregar a cada fila SQS só as mensagens que interessam: atributos de mensagem, filter policy na assinatura, filtro por atributo ou pelo corpo, operadores, limites e cuidados.

    #AWS#Mensageria

  8. SRE7 min de leitura

    W3C Trace Context — correlacionando logs entre microsserviços com o traceparent

    O padrão W3C que leva o mesmo ID de rastreamento por todos os serviços de uma operação: o traceparent e o tracestate, valores inválidos, a granularidade certa e o ID atravessando o outbox.

    #Logs#Microsserviços#Mensageria

  9. Desenvolvimento de Software14 min de leitura

    AOP no Spring — JDK Dynamic Proxy, CGLIB e aspects customizados

    Como o Spring aplica log, transação e métricas fora da regra de negócio: conceitos de AOP, JDK Dynamic Proxy ou CGLIB (e por que o Boot prefere CGLIB), a self-invocation e aspects próprios.

    #Spring#AOP

  10. Desenvolvimento de Software7 min de leitura

    AopUtils.getTargetClass() — desembrulhando os proxies do Spring

    Com o bean envolto em proxy, bean.getClass() devolve a classe do proxy e a leitura de anotações falha. Como AopUtils.getTargetClass() recupera a classe real e quando usar ultimateTargetClass().

    #Spring#AOP

  11. Desenvolvimento de Software9 min de leitura

    AtomicBoolean — o sinalizador thread-safe da parada graciosa

    Por que um boolean comum pode não ser visto por outra thread, quando volatile basta, por que preferir AtomicBoolean e como ligar o SIGTERM a um job sem encerrar a JVM no meio de um lote.

    #Concorrência#Kubernetes#JVM

  12. Desenvolvimento de Software8 min de leitura

    Gradle — quando usar implementation, api, compileOnly e as demais configurações

    Cada configuração de dependência do Gradle alimenta um classpath: compilação, execução, processadores de anotação ou testes. Guia para bibliotecas e starters Spring Boot, com o papel do platform (BOM).

    #Gradle#Spring

  • Atualizações do Java46 min de leitura

    Java 29 (próxima LTS) — o que o Java 26 e o 27 já trouxeram

    O caminho do Java 25 até a próxima LTS, o Java 29 (prevista para setembro de 2027): as JEPs do Java 26 e do 27, o que ainda está em preview, exemplos de código e o que conferir na migração.

    #LTS#JVM#Concorrência#Criptografia

  • Dados19 min de leitura

    Bloqueio otimista e pessimista — como funcionam e quando usar cada um

    Como impedir que gravações simultâneas se atropelem: coluna de versão ou trava da linha. SQL testado no PostgreSQL, Spring Data JPA, NOWAIT e SKIP LOCKED, deadlock, isolamento e o UPDATE condicional.

    #Banco de Dados#Concorrência#Spring#Trade-offs

  • Desenvolvimento de Software24 min de leitura

    Virtual threads no Java 21 — pinning e CLOSE_WAIT

    Por que um serviço Java 21 com virtual threads congela sem erro no log: pinning por synchronized (resolvido no Java 24, JEP 491) e CLOSE_WAIT como rastro. Thread dump, JFR, bulkhead e circuit breaker.

    #Virtual Threads#Concorrência#JVM

  • Arquitetura de Software10 min de leitura

    Efeito externo sem registro local — a cobrança passou e o banco não gravou

    A captura no adquirente passa e a gravação no seu banco falha: grave a intenção antes de causar o efeito. Escrita dupla, outbox e relay com SQL testado, conciliação, CDC, event sourcing e 2PC.

    #Pagamentos#Mensageria#Banco de Dados

  • Arquitetura de Software11 min de leitura

    Chave de idempotência — como impedir a cobrança duplicada no retry

    Por que consultar antes de gravar não impede que um retry cobre o cliente duas vezes, e como resolver com chave de idempotência, restrição única e resposta guardada. Com SQL testado no PostgreSQL.

    #Pagamentos#Idempotência#Banco de Dados

  • Arquitetura de Software31 min de leitura

    Arquitetura de ledger — partidas dobradas, saldos e conciliação

    O que 12 artigos ensinam sobre ledgers de grau financeiro: registro append-only, double-entry garantido pelo banco, saldos materializados, idempotência e conciliação como entregável de engenharia — com exemplos em Java.

    #Pagamentos#Banco de Dados#Idempotência

  • Arquitetura de Software7 min de leitura

    SNS MessageAttributes e Filter Policy — filtrando mensagens antes do SQS

    Como fazer o SNS entregar a cada fila SQS só as mensagens que interessam: atributos de mensagem, filter policy na assinatura, filtro por atributo ou pelo corpo, operadores, limites e cuidados.

    #AWS#Mensageria

  • SRE7 min de leitura

    W3C Trace Context — correlacionando logs entre microsserviços com o traceparent

    O padrão W3C que leva o mesmo ID de rastreamento por todos os serviços de uma operação: o traceparent e o tracestate, valores inválidos, a granularidade certa e o ID atravessando o outbox.

    #Logs#Microsserviços#Mensageria

  • Desenvolvimento de Software14 min de leitura

    AOP no Spring — JDK Dynamic Proxy, CGLIB e aspects customizados

    Como o Spring aplica log, transação e métricas fora da regra de negócio: conceitos de AOP, JDK Dynamic Proxy ou CGLIB (e por que o Boot prefere CGLIB), a self-invocation e aspects próprios.

    #Spring#AOP

  • Desenvolvimento de Software7 min de leitura

    AopUtils.getTargetClass() — desembrulhando os proxies do Spring

    Com o bean envolto em proxy, bean.getClass() devolve a classe do proxy e a leitura de anotações falha. Como AopUtils.getTargetClass() recupera a classe real e quando usar ultimateTargetClass().

    #Spring#AOP

  • Desenvolvimento de Software9 min de leitura

    AtomicBoolean — o sinalizador thread-safe da parada graciosa

    Por que um boolean comum pode não ser visto por outra thread, quando volatile basta, por que preferir AtomicBoolean e como ligar o SIGTERM a um job sem encerrar a JVM no meio de um lote.

    #Concorrência#Kubernetes#JVM

  • Desenvolvimento de Software8 min de leitura

    Gradle — quando usar implementation, api, compileOnly e as demais configurações

    Cada configuração de dependência do Gradle alimenta um classpath: compilação, execução, processadores de anotação ou testes. Guia para bibliotecas e starters Spring Boot, com o papel do platform (BOM).

    #Gradle#Spring