☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta Kafka. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Kafka. Mostrar todas as mensagens

sábado, 14 de dezembro de 2024

JSON em COBOL no IBM Z: O Holocron das APIs Modernas

 

Bellacosa Mainframe COBOL com JSON

JSON em COBOL no IBM Z: O Holocron das APIs Modernas

Como um Linguagem Criada em 1959 Aprendeu a Conversar com APIs, Mobile, Open Banking e a Nuvem

Por muitos anos, o universo COBOL parecia limitado a arquivos VSAM, DB2, IMS, CICS, JCLs e relatórios batch executados silenciosamente nos datacenters. Entretanto, a transformação digital trouxe novos desafios e uma nova linguagem passou a dominar a comunicação entre aplicações modernas: JSON (JavaScript Object Notation).

Hoje, smartphones, microsserviços, OpenShift, Open Banking, PIX, aplicações em nuvem e plataformas de inteligência artificial utilizam JSON como principal formato de intercâmbio de informações. E o mais interessante é que o Enterprise COBOL para IBM Z evoluiu para participar naturalmente desse ecossistema.

Com a introdução das instruções JSON PARSE e JSON GENERATE no Enterprise COBOL 6.x, programas COBOL passaram a compreender, produzir e consumir documentos JSON de forma nativa, eficiente e segura, permitindo a integração com APIs REST, IBM MQ, Kafka, z/OS Connect e arquiteturas modernas baseadas em eventos.

Esta série especial Bellacosa Mainframe apresenta uma jornada completa para o jovem Padawan COBOL compreender desde os conceitos básicos até técnicas avançadas utilizadas por especialistas IBM Z.


📖 Capítulo 1 – O Despertar do JSON

Quando o Padawan Descobre que COBOL Pode Falar a Linguagem das APIs

Neste primeiro holocron, exploramos os fundamentos do JSON, sua história, a chegada do suporte nativo ao Enterprise COBOL, diferenças entre JSON e XML, conceitos de UTF-8 e EBCDIC, além dos primeiros exemplos utilizando JSON GENERATE.

➡️ https://eljefemidnightlunch.blogspot.com/2024/07/json-em-cobol-no-ibm-z-o-holocron-das.html


📖 Capítulo 2 – JSON PARSE

Quando o Padawan Aprende a Transformar Texto em Estruturas COBOL

Aqui mergulhamos na instrução JSON PARSE, aprendendo a converter documentos JSON em estruturas COBOL, trabalhar com objetos aninhados, vetores utilizando OCCURS, tratar exceções, validar payloads recebidos e compreender os desafios relacionados à segurança e ao processamento de grandes volumes de dados.

➡️ https://eljefemidnightlunch.blogspot.com/2024/09/json-em-cobol-no-ibm-z-o-holocron-das.html


📖 Capítulo 3 – JSON GENERATE

Quando o Padawan Aprende a Construir APIs REST com COBOL

No terceiro capítulo, estudamos JSON GENERATE, recursos como SUPPRESS, NAME OF, tratamento de campos opcionais, construção de respostas para APIs REST, geração de payloads PIX e Open Banking, além de recomendações de desempenho e proteção contra exposição acidental de informações sensíveis.

➡️ https://eljefemidnightlunch.blogspot.com/2024/10/json-em-cobol-no-ibm-z-o-holocron-das.html


📖 Capítulo 4 – JSON Jedi Master

z/OS Connect, MQ, Kafka, OpenShift, OWASP e as Técnicas Jedi do IBM Z

No capítulo final, elevamos o nível de conhecimento para arquiteturas corporativas modernas. Exploramos o papel do z/OS Connect, integração com IBM MQ, Kafka, OpenShift, APIs de alto desempenho, conceitos da OWASP API Top 10, estratégias de observabilidade, segurança, escalabilidade e as melhores práticas adotadas por equipes especializadas em IBM Z.

➡️ https://eljefemidnightlunch.blogspot.com/2024/11/json-em-cobol-no-ibm-z-o-holocron-das.html


O Conselho Final do Mestre Bellacosa

Durante décadas, disseram aos desenvolvedores COBOL que sua missão terminava em arquivos sequenciais e terminais verdes. O JSON mostrou exatamente o contrário. Ele permitiu que programas escritos há décadas passassem a conversar com smartphones, microsserviços, aplicações em nuvem e plataformas digitais espalhadas por toda a galáxia tecnológica.

COBOL não precisou abandonar sua robustez, estabilidade ou capacidade de processar milhões de transações por segundo. Ele apenas aprendeu um novo idioma.

E talvez esta seja a maior lição deste Holocron:

COBOL não é uma tecnologia do passado.

COBOL é um veterano experiente que aprendeu a falar a língua do futuro.

Que o JSON PARSE esteja com você. E que o JSON GENERATE jamais exponha uma senha em produção. 🚀💙🖥️


Para ir mais longe

🔥☕ Como se Usa JSON em COBOL?

Nos últimos anos, o JSON (JavaScript Object Notation) tornou-se o formato mais utilizado para integração entre aplicações modernas, APIs REST, Mobile, Cloud e Mainframe.

https://eljefemidnightlunch.blogspot.com/2007/02/como-se-usa-json-em-cobol.html

🔥☕ JSON: O “COBOL DOS DADOS MODERNOS”? — A Linguagem Invisível Que Dominou APIs, Nuvem e Até o Mainframe

https://eljefemidnightlunch.blogspot.com/2010/10/json-o-cobol-dos-dados-modernos.html


terça-feira, 26 de novembro de 2024

Do Celular ao Mainframe: A Jornada Secreta de uma Transação Bancária

 

Bellacosa Mainframe do celular ao mainframe como funciona o mainframe após o login no app do mobile

☕ Um Café no Bellacosa Mainframe

Do Celular ao Mainframe: A Jornada Secreta de uma Transação Bancária

O guia do Programador COBOL Padawan para compreender APIs, segurança, mensageria, CICS, Db2 e a ponte invisível entre o aplicativo moderno e o coração do IBM Z

Imagine a seguinte cena.

Você está sentado em uma cafeteria, talvez esperando o início de uma aula sobre COBOL, quando o garçom coloca sobre a mesa uma xícara de café fumegante e a conta. Você abre o aplicativo do banco, aponta a câmera para um QR Code, confirma o valor, informa a senha e toca no botão:

Pagar

Alguns segundos depois, aparece a mensagem:

Transação realizada com sucesso.

Missão cumprida.

O café foi pago, o comerciante recebeu o dinheiro e você provavelmente não pensará mais no assunto.

Mas, para nós, tripulantes curiosos da Frota Estelar do Mainframe, essa pequena operação levanta uma pergunta fascinante:

O que realmente aconteceu entre o toque na tela e a mensagem de sucesso?

A resposta é muito mais interessante do que parece.

O seu pedido atravessou a internet, passou por muralhas digitais, apresentou credenciais, foi analisado por mecanismos de segurança, atravessou gateways, talvez entrou em uma fila de mensagens, foi traduzido de JSON para uma estrutura COBOL, chegou ao z/OS, encontrou uma transação CICS, executou regras de negócio, consultou o Db2, atualizou registros, gerou logs, acionou sistemas antifraude e retornou pelo mesmo caminho.

Tudo isso em poucos segundos — frequentemente em frações de segundo.

O que parece um simples toque na tela é, na verdade, uma missão espacial completa.

Prepare o café, ajuste o comunicador e ocupe sua estação na ponte. Hoje vamos viajar do celular ao mainframe.


1. O aplicativo é apenas a janela da nave

Para o usuário, o aplicativo parece ser o banco inteiro.

Ele mostra saldo, extrato, investimentos, cartões, empréstimos e pagamentos. Entretanto, o aplicativo normalmente não mantém o saldo verdadeiro da conta nem executa sozinho as regras financeiras mais importantes.

Ele é, antes de tudo, uma camada de apresentação.

Sua função é permitir que o usuário:

  • veja informações;

  • informe dados;

  • confirme operações;

  • receba mensagens;

  • interaja com os serviços do banco.

Podemos comparar o aplicativo ao painel da ponte da USS Enterprise.

Quando o capitão toca em um comando, o painel não produz energia, não move os motores de dobra e não calcula sozinho a rota. Ele apenas envia instruções para sistemas muito mais profundos da nave.

Da mesma maneira, quando você toca em “Consultar saldo”, o aplicativo envia uma solicitação para os sistemas centrais.

Um pedido poderia ser representado assim:

{
  "agencia": "1234",
  "conta": "567890",
  "operacao": "CONSULTAR_SALDO"
}

Esse formato é chamado de JSON, abreviação de JavaScript Object Notation.

Ele se tornou muito popular porque é:

  • legível;

  • leve;

  • fácil de transmitir;

  • compatível com praticamente qualquer linguagem;

  • adequado para APIs modernas.

Para um desenvolvedor mobile, JSON é algo natural.

Para um programa COBOL criado há décadas, porém, a realidade pode ser bastante diferente.


2. Antes de viajar, a mensagem entra em um túnel criptografado

A solicitação não deveria viajar pela internet como texto aberto.

Seria desastroso transmitir algo assim:

CONTA=567890
SENHA=123456
VALOR=5000

Qualquer pessoa capaz de interceptar o tráfego poderia ler os dados.

Por isso, aplicativos bancários utilizam conexões protegidas por HTTPS, geralmente com TLS — Transport Layer Security.

O TLS cria um canal criptografado entre o dispositivo e o servidor.

Antes de transmitir os dados principais, cliente e servidor realizam um processo de negociação. Simplificando bastante, eles verificam certificados, escolhem algoritmos criptográficos e estabelecem chaves para proteger a sessão.

Depois disso, quem interceptar os pacotes não verá diretamente os dados da transação. Verá conteúdo criptografado, sem significado imediato.

É como se a mensagem fosse colocada em uma cápsula de transporte protegida por um campo de força.

O TLS oferece três garantias fundamentais:

Confidencialidade: terceiros não devem conseguir ler a mensagem.

Integridade: alterações durante o caminho devem ser detectadas.

Autenticidade: o aplicativo precisa ter confiança de que está falando com o servidor legítimo.

Aqui temos uma primeira lição para o COBOL Padawan:

Segurança não começa quando a solicitação chega ao mainframe. Ela começa antes mesmo de o primeiro pacote deixar o celular.


3. A internet não é uma linha reta

Quando o usuário toca em “Confirmar”, os dados não saltam diretamente para o mainframe.

Eles podem atravessar:

  • a rede Wi-Fi ou móvel;

  • a operadora de telecomunicações;

  • roteadores;

  • provedores;

  • redes de distribuição;

  • balanceadores;

  • zonas de segurança;

  • Data Centers;

  • ambientes de nuvem;

  • redes internas corporativas.

Cada salto acrescenta possibilidades de atraso, falha ou ataque.

É por isso que arquiteturas financeiras são construídas com redundância.

Se um caminho falhar, outro poderá ser utilizado. Se um servidor parar, outro assumirá. Se uma região inteira ficar indisponível, mecanismos de recuperação podem direcionar o tráfego para outro ambiente.

Para o usuário, tudo isso é invisível.

Ele vê apenas uma animação girando na tela.


4. WAF: a muralha da fortaleza

Ao se aproximar da infraestrutura do banco, a requisição pode encontrar um WAF — Web Application Firewall.

O WAF funciona como uma muralha especializada na proteção de aplicações web e APIs.

Um firewall tradicional costuma observar endereços, portas e protocolos. O WAF procura compreender também o conteúdo da requisição.

Ele pode identificar padrões relacionados a:

  • SQL Injection;

  • Cross-Site Scripting;

  • automações maliciosas;

  • exploração de vulnerabilidades;

  • requisições deformadas;

  • bots;

  • tentativas de manipulação de parâmetros;

  • tráfego anormal.

Considere uma entrada esperada:

conta=12345

Agora imagine que um invasor tente enviar:

conta=' OR 1=1 --

Esse tipo de sequência pode estar associado a uma tentativa de SQL Injection.

Em uma aplicação mal construída, o conteúdo poderia ser incorporado indevidamente a um comando SQL. Um WAF pode reconhecer esse padrão e bloquear a requisição antes que ela chegue às camadas internas.

Mas atenção: o WAF não elimina a necessidade de programação segura.

Ele é uma defesa adicional, não uma desculpa para escrever código vulnerável.

No universo da Frota Estelar, poderíamos dizer:

O campo de força protege a nave, mas isso não significa que a tripulação possa deixar todas as portas internas abertas.


5. API Gateway: a central de controle de tráfego

Depois da fronteira de segurança, a solicitação pode chegar a um API Gateway.

O API Gateway funciona como uma recepção altamente inteligente para as APIs.

Ele pode executar tarefas como:

  • validar tokens;

  • autenticar clientes;

  • aplicar limites de requisições;

  • registrar chamadas;

  • escolher o serviço de destino;

  • controlar versões de APIs;

  • transformar cabeçalhos;

  • aplicar políticas;

  • distribuir carga;

  • rejeitar tráfego inválido.

Imagine que o banco possua APIs diferentes:

/api/saldo
/api/pix
/api/cartoes
/api/investimentos
/api/emprestimos

O Gateway examina a requisição e a envia ao serviço correto.

Ele também pode evitar abuso por meio de rate limiting.

Por exemplo, se um dispositivo tentar realizar dez mil consultas em poucos segundos, o Gateway poderá limitar ou bloquear o tráfego.

Outra função importante é a validação de credenciais.

Muitos sistemas usam padrões como:

  • OAuth 2.0;

  • OpenID Connect;

  • tokens JWT;

  • certificados digitais;

  • chaves de API.

O Gateway não substitui todos os controles posteriores, mas atua como um dos primeiros pontos de decisão.

Podemos compará-lo à estação de transporte da Enterprise.

Nem todo mundo pode informar:

“Energize!”

Antes, é necessário confirmar identidade, destino e autorização.


6. O celular fala JSON; o COBOL fala estruturas

Aqui começamos a chegar a uma das partes mais fascinantes da viagem.

O aplicativo moderno costuma enviar dados em JSON:

{
  "cliente": 98765,
  "valor": 250.75,
  "moeda": "BRL"
}

Um programa COBOL pode esperar uma estrutura definida assim:

       01  WS-REQUISICAO.
           05 WS-CLIENTE       PIC 9(05).
           05 WS-VALOR         PIC S9(07)V99 COMP-3.
           05 WS-MOEDA         PIC X(03).

Perceba a diferença.

No JSON, os campos têm nomes, separadores e valores textuais.

No COBOL, a estrutura possui posições, tamanhos e formatos definidos.

O campo WS-CLIENTE ocupa cinco dígitos.

O campo WS-VALOR pode estar armazenado em formato decimal compactado, indicado por COMP-3.

O campo WS-MOEDA possui três caracteres.

Essas definições frequentemente ficam em um Copybook.

Um Copybook é um arquivo reutilizável que contém descrições de dados ou trechos de código.

Exemplo:

       COPY REQPIX.

O compilador inclui o conteúdo do Copybook no programa.

Em ambientes corporativos, Copybooks podem representar:

  • solicitações;

  • respostas;

  • registros de clientes;

  • layouts de arquivos;

  • áreas de comunicação;

  • mensagens;

  • estruturas de banco.

Essa precisão é uma das grandes forças do COBOL.

Cada campo possui tamanho e significado claramente definidos.

Por outro lado, ela cria um desafio de integração: alguém precisa traduzir os dados flexíveis do mundo JSON para o layout rigoroso do mundo COBOL.


7. z/OS Connect: o tradutor da Federação

Uma das tecnologias capazes de construir essa ponte é o z/OS Connect.

Ele permite expor ativos do IBM Z por meio de APIs e integrar APIs com aplicações existentes.

De maneira simplificada, o fluxo pode ser:

Aplicativo
   ↓
API REST
   ↓
JSON
   ↓
z/OS Connect
   ↓
Estrutura COBOL
   ↓
CICS
   ↓
Programa de negócio

Na volta:

Programa COBOL
   ↓
Estrutura de resposta
   ↓
z/OS Connect
   ↓
JSON
   ↓
Aplicativo

O desenvolvedor do aplicativo não precisa saber como um campo COMP-3 é representado internamente.

O programador COBOL não precisa transformar manualmente toda requisição HTTP.

Cada lado trabalha com abstrações adequadas ao seu universo.

Esse é um ponto fundamental da modernização:

Modernizar não significa necessariamente reescrever tudo. Muitas vezes significa tornar um ativo existente acessível por novas interfaces.

Um programa COBOL que processa contas há décadas pode continuar executando sua lógica, enquanto uma API moderna fornece acesso controlado a essa capacidade.

Não é preciso desmontar o núcleo de dobra para instalar uma tela nova na ponte.


8. EBCDIC, UTF-8 e a Torre de Babel digital

Outro detalhe importante é a codificação de caracteres.

Aplicações modernas normalmente utilizam UTF-8.

Muitos ambientes mainframe utilizam EBCDIC em diversas áreas.

Uma letra não é armazenada simplesmente como “uma letra”. Ela é representada por um valor numérico.

Em codificações diferentes, o mesmo valor pode representar caracteres diferentes.

Portanto, a integração precisa tratar corretamente:

  • letras;

  • números;

  • caracteres especiais;

  • acentos;

  • símbolos;

  • espaços;

  • sinais;

  • quebras de linha.

Imagine enviar o nome:

João Gonçalves

Uma conversão incorreta poderia produzir caracteres ilegíveis.

Parece um detalhe pequeno, mas erros de codificação podem causar:

  • campos corrompidos;

  • falhas de validação;

  • rejeição de mensagens;

  • problemas em arquivos;

  • divergência entre sistemas;

  • erros difíceis de reproduzir.

Dica Bellacosa:

Quando uma integração produz “hieróglifos alienígenas”, investigue encoding antes de acusar os Klingons.


9. Comunicação síncrona: esperar pela resposta

Nem toda operação segue o mesmo estilo de comunicação.

Na comunicação síncrona, o cliente envia uma solicitação e espera a resposta.

Exemplo:

Aplicativo → Consultar saldo → Sistema
Aplicativo ← Saldo atual ← Sistema

O usuário está aguardando.

Por isso, o tempo de resposta é importante.

Uma consulta de saldo que demora trinta segundos causa péssima experiência, mesmo que tecnicamente seja concluída.

No fluxo síncrono, uma falha em qualquer ponto pode ser percebida imediatamente pelo usuário:

  • timeout;

  • serviço indisponível;

  • erro de autenticação;

  • falha interna;

  • resposta inválida.

Arquiteturas síncronas são simples de compreender, mas podem criar dependência direta entre os participantes.

Se o sistema de destino não responder, o chamador também ficará esperando.

É aqui que a mensageria oferece outra abordagem.


10. IBM MQ: o correio confiável da galáxia

O IBM MQ permite que aplicações troquem mensagens por meio de filas.

Em vez de exigir que origem e destino estejam disponíveis exatamente no mesmo instante, a aplicação coloca uma mensagem em uma fila.

Exemplo:

Aplicação A
    ↓ PUT
Fila MQ
    ↓ GET
Aplicação B

Se a Aplicação B estiver temporariamente indisponível, a mensagem poderá permanecer na fila até que o processamento seja retomado.

Isso é chamado de desacoplamento.

A origem não precisa conhecer todos os detalhes internos do consumidor.

Ela precisa saber em qual fila colocar a mensagem e qual contrato respeitar.

Em ambientes financeiros, essa confiabilidade é extremamente valiosa.

Imagine uma ordem de pagamento.

Perder a mensagem seria inaceitável.

Processá-la duas vezes também seria perigoso.

O MQ fornece recursos como:

  • persistência;

  • confirmação;

  • unidades de trabalho;

  • filas;

  • canais;

  • recuperação;

  • segurança;

  • entrega controlada.

Entretanto, aqui cabe uma correção importante a uma simplificação muito comum.

Dizer que qualquer sistema de mensageria “garante automaticamente exatamente uma vez” pode ser enganoso.

Na prática, a semântica de entrega depende da configuração, da transação, do desenho da aplicação e do tratamento de erros.

Uma aplicação robusta deve estar preparada para lidar com reprocessamentos.

Por isso existe um conceito essencial chamado idempotência.

Uma operação idempotente pode ser repetida sem produzir efeitos indevidos.

Por exemplo, uma transação pode ter um identificador único:

ID-TRANSACAO = PIX-20240718-0000123456

Antes de processar, o sistema verifica se aquele identificador já foi concluído.

Se já foi, não debita novamente.

Isso ajuda a prevenir duplicidades.

O MQ transporta mensagens com grande confiabilidade, mas a regra de negócio também precisa participar da proteção.


11. Kafka: o diário de bordo dos eventos

Kafka e MQ podem coexistir, mas não são exatamente a mesma coisa.

O Kafka é muito utilizado como plataforma de eventos e streaming.

Uma transação aprovada pode gerar um evento:

{
  "evento": "PIX_REALIZADO",
  "contaOrigem": "12345",
  "valor": 250.75,
  "timestamp": "2024-07-18T18:30:00"
}

Diversos consumidores podem ler esse evento:

  • motor antifraude;

  • sistema de notificações;

  • plataforma analítica;

  • Data Lake;

  • auditoria;

  • monitoramento;

  • campanhas;

  • modelos de inteligência artificial.

Em vez de um sistema ligar diretamente para todos os outros, ele publica o evento.

Cada consumidor reage conforme sua responsabilidade.

É como o diário de bordo da nave.

Um acontecimento é registrado, e diferentes departamentos usam a informação:

  • segurança analisa riscos;

  • engenharia mede impacto;

  • comando acompanha a missão;

  • ciência estuda padrões.

O Kafka é especialmente útil quando muitos consumidores precisam observar o mesmo fluxo de eventos.


12. Finalmente, o IBM Z

Depois de atravessar camadas externas, a solicitação pode chegar ao ambiente IBM Z.

Aqui é importante desfazer um mito:

Mainframe não significa um computador antigo isolado em uma sala escura.

O IBM Z moderno participa de arquiteturas híbridas, APIs, nuvem, inteligência artificial, containers, DevOps e automação.

Sua grande especialidade continua sendo processar cargas críticas com:

  • alta disponibilidade;

  • segurança;

  • escalabilidade;

  • consistência;

  • grande volume de transações;

  • capacidade de recuperação;

  • isolamento de workloads.

O mainframe não está escondido no passado.

Ele está silenciosamente sustentando o presente.


13. z/OS: o comandante da nave

O z/OS é o sistema operacional que coordena o ambiente.

Ele gerencia recursos como:

  • memória;

  • processadores;

  • dispositivos;

  • arquivos;

  • usuários;

  • segurança;

  • tarefas;

  • subsistemas;

  • workloads;

  • comunicação.

Dentro do z/OS podem coexistir diversos componentes:

  • CICS;

  • Db2;

  • IMS;

  • MQ;

  • JES2;

  • RACF;

  • Unix System Services;

  • ferramentas de monitoramento;

  • produtos de terceiros.

Para o iniciante, isso pode parecer intimidador.

Mas pense na Enterprise.

A nave possui engenharia, comando, segurança, comunicações, ciência e medicina. Cada departamento executa uma função específica, mas todos fazem parte da mesma missão.

O z/OS coordena essa tripulação tecnológica.


14. RACF: quem é você e o que pode fazer?

O RACF é um dos sistemas de segurança associados ao ambiente z/OS.

Ele pode participar de decisões como:

  • identificação do usuário;

  • autenticação;

  • acesso a recursos;

  • associação a grupos;

  • proteção de datasets;

  • proteção de transações;

  • controle de comandos;

  • auditoria.

É importante separar dois conceitos:

Autenticação: confirmar quem você é.

Autorização: determinar o que você pode fazer.

Um usuário pode estar corretamente autenticado e ainda assim não possuir autorização para consultar determinado recurso.

No cenário bancário, a autorização não se limita ao usuário humano.

Também pode envolver:

  • identidade da aplicação;

  • certificado;

  • região CICS;

  • conexão;

  • transação;

  • serviço;

  • perfil de segurança.

Esse modelo de camadas reduz a chance de um único erro liberar acesso irrestrito.

Na Frota Estelar, não basta possuir um uniforme. Para acessar o núcleo de dobra, é necessária autorização específica.


15. WLM: nem todas as missões têm a mesma prioridade

O Workload Manager, ou WLM, ajuda o z/OS a administrar recursos conforme objetivos de serviço.

Em momentos de grande carga, diferentes tipos de trabalho competem por CPU, memória, canais e outros recursos.

O sistema precisa decidir quais atividades devem receber prioridade.

Uma possível classificação seria:

  • pagamentos em tempo real;

  • consultas de clientes;

  • processamento de cartões;

  • relatórios internos;

  • tarefas batch;

  • testes;

  • rotinas de menor urgência.

O WLM trabalha com políticas e metas.

O objetivo não é simplesmente “dar tudo para o programa mais importante”, mas equilibrar o ambiente para atender níveis de serviço.

Essa inteligência é uma das razões pelas quais ambientes mainframe conseguem manter cargas críticas mesmo sob pressão intensa.

Imagine um alerta vermelho na Enterprise.

O sistema de suporte à vida terá prioridade sobre a impressora do bar do Ten Forward.

Da mesma forma, uma transação financeira urgente pode receber mais atenção que um relatório administrativo não crítico.


16. CICS: a torre de controle das transações

O CICS é um monitor de processamento de transações.

Ele foi projetado para executar grande quantidade de transações curtas, concorrentes e controladas.

Uma transação CICS pode:

  • receber dados;

  • identificar o programa;

  • executar lógica;

  • acessar Db2;

  • ler ou atualizar VSAM;

  • enviar mensagens MQ;

  • conversar com outros serviços;

  • confirmar ou desfazer alterações;

  • retornar uma resposta.

O CICS administra aspectos que, em uma aplicação isolada, seriam difíceis de implementar com a mesma robustez.

Podemos imaginá-lo como uma torre de controle.

Milhares de “naves” chegam e partem.

A torre precisa:

  • saber quem está chegando;

  • escolher a pista;

  • evitar colisões;

  • controlar recursos;

  • reagir a falhas;

  • manter o tráfego fluindo.

Uma transação CICS pode ter um identificador de quatro caracteres, por exemplo:

CSLD

Esse identificador pode estar associado a um programa:

PGMSALDO

Ao receber a transação, o CICS chama o programa correspondente.


17. COMMAREA, Channels e Containers

O programa precisa receber os dados da solicitação.

Historicamente, muitas aplicações CICS utilizam a COMMAREA.

Exemplo:

       LINKAGE SECTION.

       01  DFHCOMMAREA.
           05 CA-CONTA       PIC X(10).
           05 CA-OPERACAO    PIC X(02).
           05 CA-VALOR       PIC S9(09)V99 COMP-3.
           05 CA-STATUS      PIC X(02).

O programa acessa os dados recebidos por essa área.

A COMMAREA possui limitações de tamanho e exige atenção rigorosa ao layout.

Outra abordagem é utilizar Channels e Containers.

Um Channel pode conter múltiplos Containers. Isso permite organizar dados de maneira mais flexível.

Por exemplo:

CHANNEL: CH-PAGAMENTO

CONTAINER: CT-CABECALHO
CONTAINER: CT-CLIENTE
CONTAINER: CT-TRANSACAO
CONTAINER: CT-RESPOSTA

Para integrações modernas e estruturas maiores, Channels e Containers podem oferecer vantagens importantes.

Mas a COMMAREA continua sendo parte essencial da história e da realidade de muitas aplicações.


18. O programa COBOL entra em cena

Agora chegamos ao coração da regra de negócio.

O programa COBOL poderá:

  1. validar os dados recebidos;

  2. confirmar o tipo de operação;

  3. consultar informações;

  4. verificar limites;

  5. calcular valores;

  6. atualizar bancos ou arquivos;

  7. gerar respostas;

  8. tratar erros.

Um fluxo simplificado poderia ser:

       PROCEDURE DIVISION USING DFHCOMMAREA.

           PERFORM VALIDAR-REQUISICAO

           IF CA-STATUS = '00'
               PERFORM CONSULTAR-CONTA
           END-IF

           IF CA-STATUS = '00'
               PERFORM PROCESSAR-OPERACAO
           END-IF

           PERFORM MONTAR-RESPOSTA

           EXEC CICS RETURN END-EXEC.

O código real será mais complexo, mas essa estrutura revela uma característica poderosa do COBOL: a lógica pode ser organizada para se aproximar da linguagem do negócio.

       VALIDAR-CLIENTE.
       VERIFICAR-SALDO.
       CALCULAR-LIMITE.
       REGISTRAR-PAGAMENTO.
       MONTAR-RESPOSTA.

Para um iniciante, isso é valioso.

COBOL foi criado para permitir que programas de negócio fossem compreendidos com maior clareza.


19. Db2: onde os dados ganham consistência

O programa pode acessar o Db2 for z/OS.

Uma consulta simplificada seria:

           EXEC SQL
               SELECT SALDO_ATUAL
                 INTO :WS-SALDO
                 FROM CONTAS
                WHERE AGENCIA = :WS-AGENCIA
                  AND CONTA   = :WS-CONTA
           END-EXEC.

Depois do comando SQL, o programa deve verificar o resultado.

           EVALUATE SQLCODE
               WHEN 0
                   MOVE '00' TO WS-STATUS
               WHEN 100
                   MOVE '01' TO WS-STATUS
               WHEN OTHER
                   MOVE '99' TO WS-STATUS
           END-EVALUATE.

O SQLCODE informa o resultado da operação.

Alguns exemplos gerais:

0      Sucesso
+100   Nenhuma linha encontrada
Negativo Erro

Ignorar o SQLCODE é uma das maneiras mais rápidas de transformar uma missão simples em um episódio de desastre espacial.

Dica Bellacosa:

Depois de cada comando SQL, verifique o retorno. O silêncio do programa não significa sucesso; às vezes significa que o problema ainda não encontrou você.


20. ACID: as leis da física transacional

Uma operação financeira precisa manter consistência.

Considere uma transferência:

  1. debitar a conta A;

  2. creditar a conta B;

  3. registrar o histórico;

  4. gerar auditoria.

O sistema não pode debitar A e falhar antes de creditar B.

Essas operações devem fazer parte de uma unidade lógica.

As propriedades ACID ajudam a explicar o comportamento esperado.

Atomicidade

Ou tudo acontece, ou nada acontece.

Consistência

A transação leva o banco de um estado válido para outro estado válido.

Isolamento

Transações concorrentes não devem interferir de maneira incorreta umas nas outras.

Durabilidade

Após a confirmação, o resultado precisa sobreviver a falhas.

No CICS e no Db2, os conceitos de commit e rollback são fundamentais.

Quando tudo ocorre corretamente:

COMMIT

Quando algo falha:

ROLLBACK

O rollback desfaz alterações ainda não confirmadas dentro da unidade de trabalho.

É como uma viagem temporal controlada.

A missão deu errado? O sistema retorna ao último ponto consistente.

Infelizmente, sem a participação de Q.


21. O caminho de volta

Depois que o programa COBOL conclui a operação, ele monta uma resposta.

Exemplo:

       01  WS-RESPOSTA.
           05 WS-CODIGO       PIC X(02).
           05 WS-MENSAGEM     PIC X(60).
           05 WS-SALDO        PIC S9(09)V99 COMP-3.

Essa estrutura retorna ao CICS.

Depois poderá passar por uma camada de integração, que a converte para JSON:

{
  "codigo": "00",
  "mensagem": "Transacao realizada com sucesso",
  "saldo": 1750.25
}

A resposta percorre novamente:

COBOL
  ↓
CICS
  ↓
z/OS Connect ou serviço de integração
  ↓
API Gateway
  ↓
Internet protegida por TLS
  ↓
Aplicativo

Então aparece a mensagem na tela.

O usuário vê apenas:

Sucesso.

Nós vemos toda uma arquitetura trabalhando em conjunto.


22. O que acontece nos bastidores e quase ninguém vê

A imagem principal normalmente mostra os componentes mais conhecidos, mas uma arquitetura real pode envolver muito mais.

Balanceamento de carga

Distribui as requisições entre diversas instâncias.

Cache

Evita consultas repetitivas quando os dados permitem armazenamento temporário.

HSM

Protege chaves criptográficas em hardware especializado.

Antifraude

Analisa comportamento, dispositivo, localização, valor, horário e histórico.

Observabilidade

Registra métricas, logs e traces para acompanhar a jornada da solicitação.

SIEM

Correlaciona eventos de segurança e procura comportamentos suspeitos.

Auditoria

Mantém evidências sobre quem fez o quê, quando e a partir de onde.

Alta disponibilidade

Permite continuidade mesmo quando componentes falham.

Recuperação de desastre

Prepara o ambiente para eventos graves, incluindo perda de um Data Center.

A verdadeira arquitetura bancária é muito maior que uma linha entre celular e COBOL.

Ela se parece mais com uma frota completa.


23. Um exemplo completo: consulta de saldo

Vamos organizar o fluxo passo a passo.

Passo 1 — O usuário toca em “Saldo”

O aplicativo cria uma solicitação.

{
  "conta": "567890",
  "operacao": "SALDO"
}

Passo 2 — TLS protege a comunicação

Os dados seguem criptografados.

Passo 3 — O WAF analisa o tráfego

Requisições suspeitas podem ser bloqueadas.

Passo 4 — O API Gateway valida o acesso

O token é verificado, políticas são aplicadas e a API correta é selecionada.

Passo 5 — A integração traduz os dados

JSON é transformado na estrutura esperada pelo sistema central.

Passo 6 — A solicitação chega ao CICS

O CICS identifica a transação e chama o programa COBOL.

Passo 7 — O programa valida a conta

Campos obrigatórios, formato e regras básicas são analisados.

Passo 8 — O COBOL consulta o Db2

O saldo é recuperado.

Passo 9 — O retorno é tratado

O programa verifica SQLCODE, monta o status e prepara a resposta.

Passo 10 — A integração converte para JSON

A estrutura COBOL é traduzida.

Passo 11 — O aplicativo recebe o resultado

A tela exibe o saldo.

A consulta aparentemente simples mobilizou múltiplos componentes.


24. Outro exemplo: uma transferência PIX

Uma transferência é mais sensível que uma consulta.

O fluxo pode incluir:

  • autenticação reforçada;

  • validação de dispositivo;

  • checagem de limite;

  • análise antifraude;

  • validação do destinatário;

  • verificação de saldo;

  • débito;

  • crédito;

  • registro contábil;

  • geração de comprovante;

  • notificação;

  • auditoria;

  • publicação de eventos.

Em alguns casos, partes são síncronas e outras assíncronas.

O usuário precisa saber imediatamente se a operação foi aceita.

Entretanto, tarefas secundárias podem ocorrer depois, como:

  • alimentar o Data Lake;

  • atualizar relatórios;

  • enviar campanhas;

  • executar análises históricas.

Essa combinação reduz o tempo percebido pelo usuário sem sacrificar controles importantes.


25. Onde cada tecnologia realmente se encaixa

Um iniciante pode cair na armadilha de tentar escolher “a melhor tecnologia”.

Mas a pergunta correta é:

Qual problema cada tecnologia resolve?

O WAF protege aplicações expostas.

O API Gateway administra APIs.

O z/OS Connect ajuda a integrar APIs e ativos do IBM Z.

O MQ transporta mensagens com confiabilidade e desacoplamento.

O Kafka distribui eventos para múltiplos consumidores.

O RACF controla identidades e acessos no z/OS.

O WLM gerencia prioridades e objetivos de serviço.

O CICS executa transações.

O COBOL implementa regras de negócio.

O Db2 armazena e protege dados relacionais.

Eles não são necessariamente concorrentes.

São membros de uma tripulação.

O erro arquitetural acontece quando uma ferramenta é usada fora de sua missão.

Não peça ao tricorder para operar os motores de dobra.


26. Dicas para o Programador COBOL Padawan

Aprenda primeiro o fluxo, depois os produtos

Antes de decorar comandos, compreenda:

Entrada → Validação → Processamento → Persistência → Resposta

Domine estruturas de dados

Entenda profundamente:

  • PIC X;

  • PIC 9;

  • sinal;

  • casas decimais;

  • COMP;

  • COMP-3;

  • redefinições;

  • níveis;

  • Copybooks.

A integração depende do contrato de dados.

Trate códigos de retorno

Verifique:

  • SQLCODE;

  • EIBRESP;

  • EIBRESP2;

  • códigos MQ;

  • status HTTP;

  • códigos de aplicação.

Não confunda erro técnico com erro de negócio

Erro técnico:

Db2 indisponível

Erro de negócio:

Saldo insuficiente

O tratamento deve ser diferente.

Pense em reprocessamento

Pergunte:

O que acontece se a mesma mensagem chegar novamente?

Evite mensagens vagas

Em vez de:

ERRO

Prefira códigos e mensagens que permitam diagnóstico.

TRX104 - LIMITE DIARIO EXCEDIDO

Nunca registre dados sensíveis sem necessidade

Logs não devem expor:

  • senhas;

  • tokens;

  • números completos de cartões;

  • chaves;

  • informações pessoais desnecessárias.

Conheça o caminho completo

Mesmo sendo programador COBOL, compreenda API, JSON, HTTP, mensageria e segurança.

Você não precisa dominar tudo imediatamente.

Mas precisa saber conversar com as outras equipes.


27. Curiosidades para levar ao Ten Forward

O COBOL nasceu antes do primeiro episódio de Star Trek

COBOL começou a ser desenvolvido em 1959.

Star Trek estreou em 1966.

Ou seja, quando a Enterprise iniciou sua missão televisiva, o COBOL já estava em operação.

JSON é muito mais jovem

JSON ganhou popularidade décadas depois do COBOL.

Mesmo assim, hoje os dois formatos trabalham juntos diariamente.

O código antigo pode sustentar a experiência mais moderna

Um aplicativo com biometria, animações e inteligência artificial pode depender de uma regra escrita originalmente muitos anos antes.

A interface muda.

A regra central continua valiosa.

Nem toda lentidão está no mainframe

Quando uma transação está lenta, o problema pode estar:

  • no celular;

  • na operadora;

  • no DNS;

  • no WAF;

  • no Gateway;

  • na rede;

  • no serviço de integração;

  • no banco;

  • em uma fila;

  • em um consumidor externo.

Diagnosticar exige observabilidade de ponta a ponta.


28. Easter eggs da ponte de comando

Em muitos ambientes de desenvolvimento, nomes de projetos, filas, servidores e transações escondem referências culturais.

Você poderá encontrar nomes como:

KIRK
SPOCK
SCOTTY
ENTERPRISE
VULCAN
NCC1701

Mas há uma regra informal importante:

O nome divertido pode existir no ambiente de testes. Em produção, a clareza operacional deve vencer a criatividade descontrolada.

Uma fila chamada:

Q.PIX.PROCESSAMENTO

é mais fácil de compreender durante um incidente do que:

Q.SPOCK.MIND.MELD

Embora, admitamos, a segunda seja muito mais divertida.

Outro easter egg conceitual aparece na própria arquitetura.

O z/OS Connect funciona como o comunicador universal.

O CICS atua como a torre de controle.

O RACF é a segurança da Frota.

O WLM é o oficial que define prioridades.

O Db2 é a memória histórica.

O MQ é o serviço de transporte.

O COBOL é o veterano que conhece todas as regras da missão.

E o programador?

O programador é o tripulante que precisa garantir que todos consigam trabalhar juntos.


29. Por que aprender isso em 2024?

Porque o mercado não precisa apenas de pessoas que saibam escrever uma tela ou um programa isolado.

Ele precisa de profissionais que compreendam sistemas.

Um desenvolvedor mobile pode criar uma excelente interface, mas precisa entender limites, autenticação, falhas e contratos.

Um desenvolvedor de APIs precisa compreender transações, idempotência, segurança e disponibilidade.

Um programador COBOL precisa entender JSON, REST, eventos e integração.

Um especialista de banco precisa conhecer concorrência, commit, rollback e performance.

Quanto mais você compreende a jornada completa, maior é sua capacidade de:

  • diagnosticar incidentes;

  • projetar integrações;

  • conversar com outras equipes;

  • evitar erros;

  • modernizar com segurança;

  • tomar decisões arquiteturais.

O profissional raro não é aquele que sabe tudo.

É aquele que entende como as partes se conectam.


30. Plano de estudo para atravessar essa ponte

Etapa 1 — Fundamentos web

Estude:

  • HTTP;

  • HTTPS;

  • métodos GET, POST, PUT e DELETE;

  • códigos de status;

  • headers;

  • JSON.

Etapa 2 — APIs

Aprenda:

  • REST;

  • contratos;

  • autenticação;

  • versionamento;

  • tratamento de erros;

  • OpenAPI.

Etapa 3 — COBOL estruturado

Domine:

  • divisão de dados;

  • PIC;

  • Copybooks;

  • PERFORM;

  • EVALUATE;

  • tratamento de retorno;

  • subprogramas.

Etapa 4 — CICS

Explore:

  • transações;

  • programas;

  • COMMAREA;

  • Channels e Containers;

  • LINK;

  • XCTL;

  • RETURN;

  • EIBRESP.

Etapa 5 — Db2

Pratique:

  • SQL embutido;

  • cursores;

  • SQLCODE;

  • commit;

  • rollback;

  • locks;

  • índices.

Etapa 6 — Mensageria

Conheça:

  • filas;

  • produtores;

  • consumidores;

  • mensagens persistentes;

  • unidades de trabalho;

  • dead-letter queues;

  • idempotência.

Etapa 7 — Integração IBM Z

Estude:

  • z/OS Connect;

  • APIs para CICS;

  • transformação JSON;

  • contratos de dados;

  • segurança.

Etapa 8 — Observabilidade

Aprenda a seguir uma transação do início ao fim usando:

  • logs;

  • métricas;

  • traces;

  • identificadores de correlação.


Conclusão — O mainframe nunca esteve longe do seu celular

Quando você consulta o saldo, paga uma conta ou realiza uma transferência, não está usando apenas um aplicativo.

Está acionando uma cadeia sofisticada de tecnologias.

O celular oferece a experiência.

O TLS protege a viagem.

O WAF vigia a fronteira.

O API Gateway organiza o tráfego.

O z/OS Connect traduz os idiomas.

O MQ transporta mensagens confiáveis.

O Kafka espalha eventos.

O RACF protege os recursos.

O WLM administra prioridades.

O CICS coordena as transações.

O COBOL executa as regras.

O Db2 preserva os dados.

Cada componente cumpre uma missão.

E essa é talvez a maior lição para o Programador COBOL Padawan:

o mainframe não é uma ilha.

Ele é parte de um universo conectado.

Aprender COBOL continua sendo importante, mas o profissional moderno precisa enxergar além da Procedure Division. Precisa entender de onde os dados chegam, como são protegidos, como são traduzidos, como são processados e como retornam ao usuário.

A próxima vez que você tocar em “Confirmar” no aplicativo do banco, observe aqueles poucos segundos de espera.

Por trás da tela, uma frota inteira estará trabalhando.

Mensagens atravessarão redes.

Sistemas confirmarão identidades.

Filas protegerão transações.

Programas COBOL executarão regras consolidadas por décadas.

Bancos de dados preservarão a consistência.

E, em algum lugar de um Data Center, um mainframe continuará cumprindo silenciosamente sua missão:

processar com segurança aquilo que o mundo moderno não pode se permitir perder.

Vida longa ao COBOL.

Vida longa ao mainframe.

E que suas transações retornem sempre com SQLCODE = 0.


sábado, 9 de novembro de 2024

JSON em COBOL no IBM Z: O Holocron das APIs Modernas – JSON Jedi Master - Parte IV

 

Bellacosa Mainframe e o json no cobol parte iv

JSON em COBOL no IBM Z: O Holocron das APIs Modernas

Parte 4 – JSON Jedi Master

z/OS Connect, MQ, Kafka, OpenShift, APIs de Alto Desempenho, Segurança OWASP e as Técnicas Jedi do IBM Z

Por Bellacosa Mainframe


"O Padawan aprende JSON PARSE. O Cavaleiro domina JSON GENERATE. O Mestre compreende que JSON é apenas a linguagem utilizada para conectar mundos inteiros."

Mestre Bellacosa Sysprog Jedi


Introdução

Chegamos ao último holocron.

Na Parte 1 aprendemos:

  • JSON

  • JSON GENERATE

  • UTF8

  • APIs

Na Parte 2:

  • JSON PARSE

  • Arrays

  • OCCURS

  • Segurança

Na Parte 3:

  • JSON GENERATE avançado

  • SUPPRESS

  • NAME OF

  • APIs REST

Agora chegamos ao nível do Mestre.

O momento em que COBOL deixa de apenas processar JSON.

E passa a ser um participante ativo de arquiteturas modernas.


O grande segredo

Muitos ainda imaginam.

COBOL

Batch

Relatório

Fim.

Mas o IBM Z moderno é muito diferente.

Hoje podemos encontrar:

COBOL

JSON

API

Mobile

Cloud

Kafka

OpenShift

IA

Aplicações Web


O papel do JSON

JSON tornou-se.

O idioma universal.


Imagine.

Banco.

Aplicativo.

PIX.

Open Finance.

Cartão.

Seguro.

Marketplace.

IoT.


Praticamente todos utilizam.

JSON.


z/OS Connect

Talvez seja a tecnologia mais importante.

Para o COBOL moderno.


O que é?

Uma ponte.

Entre.

IBM Z.

E.

REST APIs.


Visualmente.

Smartphone

↓

REST

↓

z/OS Connect

↓

COBOL

↓

DB2

Exemplo

Usuário.

Consulta saldo.

Aplicativo.

HTTPS

z/OS Connect

JSON

COBOL

DB2

JSON

Aplicativo


Tudo transparente.


COBOL não vê HTTP

Na maioria dos casos.

Não.


Ele apenas recebe.

Estrutura.

COBOL.

Já preenchida.


Exemplo.

01 WS-CONTA.


05 AGENCIA.


05 CONTA.



JSON PARSE.

Feito.

Automaticamente.


MQ

Outro caso.

Muito comum.


Mensagem.

Chega.

MQ.


Payload.

JSON.


COBOL.

Processa.


Exemplo.

{

"tipo":"pix",

"valor":100

}

COBOL.

Recebe.


Executa.

Negócio.


Responde.


JSON GENERATE.


MQPUT.


Fim.


Kafka

Sim.

Também.


Arquitetura.

COBOL

↓

MQ

↓

Kafka Bridge

↓

Kafka

↓

Analytics

Muito utilizado.


Open Finance.


Fraudes.


IA.


Big Data.


OpenShift

Outro mundo.

Interessante.


Microsserviços.

Containers.

Kubernetes.


COBOL.

Participa.


Arquitetura.

OpenShift

↓

REST

↓

zOS Connect

↓

COBOL

↓

IMS

DB2

Muito elegante.


APIs síncronas

Cliente.

Espera.

Resposta.


Exemplo.

Saldo.


API.

Responde.

200 ms.


APIs assíncronas

MQ.

Kafka.

Evento.


Mais modernas.


GraphQL

Também possível.


Embora.

Menos comum.


Segurança

Aqui começa.

O lado sombrio.


OWASP.

Existe.

Também.

Para APIs.


OWASP API Top 10

Excelente leitura.


Problemas.

Mais comuns.


Excesso.

Dados.


Exposição.

Sensível.


Autorização.

Fraca.


Payload.

Gigante.


DoS.


Exemplo ruim

COBOL.

01 CLIENTE.


05 CPF.


05 SENHA.


05 TOKEN.

JSON GENERATE.


API.


Exposta.


Desastre.


Melhor

Criar DTO.


Exemplo.

01 API-CLIENTE.


05 NOME.


05 LIMITE.

Muito melhor.


JWT

Muito utilizado.


JSON Web Token.


Aplicação.

Recebe.


Valida.


Autoriza.


COBOL.

Pode.

Consumir.


Ou.

Delegar.


TLS

Obrigatório.

Hoje.


HTTPS.

Sempre.


Nunca.

HTTP.


Rate Limit

Muito importante.


Evita.

DoS.


Exemplo.

Chamadas.

Por minuto.


Logs

Essenciais.


Exemplo.

2026-06-25


PIX


100 reais


OK

Muito útil.


Auditoria.


Performance

JSON.

Tem custo.


Parser.

CPU.


Serializer.

CPU.


Mas.

IBM Z.

É extremamente eficiente.


Benchmarks.

Mostram.

Milhares.

TPS.


Sem dificuldades.


JSON gigantesco

Cuidado.


Exemplo.

50 MB.


Parser.

Vai sofrer.


CPU.

Memória.


Melhor.

Paginar.


Streaming

Excelente opção.


Processar.

Em partes.


Mais eficiente.


Cache

Pode ajudar.


JSON.

Já montado.


Evita.

JSON GENERATE.

Toda vez.


Curiosidade

Muitos bancos.

Geram.

Milhões.

JSON.

Por hora.


E.

Grande parte.

Nasce.

Em COBOL.


Curiosidade 2

Usuário.

Abre.

App.


Consulta.

Saldo.


Recebe.

JSON.


Origem.

Programa COBOL.

Escrito.


Executando.

Num.

IBM z17.


Curiosidade 3

Muitos.

Open Banking.

Brasileiros.

Passam.

Por.

COBOL.

Sem.

Que.

Usuário.

Perceba.


Bellacosa Best Practices

Regra 1

Nunca.

Gerar.

JSON.

Com STRING.


Regra 2

JSON GENERATE.

Sempre.


Regra 3

JSON PARSE.

Sempre.


Regra 4

Versione.

APIs.


Exemplo.

v1

v2

v3


Regra 5

OpenAPI.

Swagger.

Documente.


Regra 6

Nunca.

Expor.

Campos internos.


Regra 7

Teste.

UTF8.


Regra 8

Monitore.

SMF.

RMF.

Logs.


Regra 9

Valide.

Payloads.


Regra 10

Use.

OWASP.

API Top 10.


Quando usar JSON?

Excelente.

REST.

Open Banking.

PIX.

Cloud.

Kafka.

MQ.

OpenShift.

Mobile.

Marketplace.

IoT.

Microsserviços.


Quando evitar?

Batch.

VSAM.

Arquivos internos.

Processamento.

Fechado.


O Conselho Final do Mestre Bellacosa

Durante muito tempo, disseram ao desenvolvedor COBOL que seu universo terminava em arquivos sequenciais, JCLs, relatórios impressos e terminais verdes.

JSON mostrou que isso nunca foi verdade.

JSON permitiu que programas escritos décadas atrás passassem a conversar com smartphones, aplicativos financeiros, plataformas Open Banking, clusters OpenShift, sistemas Kafka e serviços espalhados por diversas nuvens.

Talvez essa seja a maior beleza do IBM Z moderno.

Ele não obriga ninguém a abandonar o COBOL.

Ele apenas entrega novas ferramentas.

E diz:

Continue usando seus níveis 01, 05, 10 e OCCURS.

Continue confiando na robustez do Enterprise COBOL.

Continue processando milhões de transações por segundo.

Eu apenas ensinarei seu programa a falar o idioma utilizado pela galáxia digital.

E talvez essa seja a verdadeira lição do Holocron JSON.

JSON não substituiu COBOL.

JSON apenas permitiu que COBOL expandisse sua voz para além dos corredores do datacenter, alcançando praticamente qualquer sistema capaz de compreender uma simples mensagem cercada por chaves e aspas.


Fim do Holocron Bellacosa Mainframe

JSON em COBOL no IBM Z – Parte 1 a Parte 4 concluídas

"Que o JSON PARSE esteja com você. E que o JSON GENERATE nunca produza um campo SENHA por engano." 🚀💙🖥️


quarta-feira, 5 de junho de 2024

CSI Netflix: A Arquitetura de Microserviços Investigada por um Programador COBOL

 

Bellacosa Mainframe investiga a arquitetura de microservicos da netflix

☕ Um Café no Bellacosa Mainframe

CSI Netflix: A Arquitetura de Microserviços Investigada por um Programador COBOL

Quando um Simples Clique no Botão “Assistir” Abre uma Cena do Crime Distribuída Entre APIs, Filas, Bancos, Caches, Eventos e Milhares de Servidores

Às 02h17 da madrugada, a cidade de Nova York parecia executar seu eterno processamento batch.

As avenidas continuavam recebendo transações. Os semáforos alternavam estados como flags de controle. Táxis percorriam rotas imprevisíveis, enquanto milhões de janelas iluminadas lembravam terminais conectados a um sistema gigantesco cuja documentação havia sido perdida décadas atrás.

No laboratório do CSI New York, uma nova ocorrência acabava de chegar.

Não havia sangue.

Não havia arma.

Não havia sequer uma vítima humana.

O relatório dizia apenas:

“O usuário pressionou o botão Assistir, mas o vídeo demorou três segundos para começar.”

Para uma pessoa comum, três segundos não seriam um crime.

Para uma plataforma global de streaming, três segundos poderiam representar abandono, perda de audiência, quebra de experiência, sobrecarga em algum serviço ou indício de uma falha distribuída prestes a contaminar milhões de sessões.

Sobre a mesa de análise estava um diagrama com o título:

Microservice Architecture at Netflix

O investigador observou a sequência de componentes:

  • cliente;

  • balanceador de carga;

  • API Gateway;

  • microserviços;

  • cache;

  • banco de dados;

  • pipeline de eventos;

  • Kafka;

  • Spark;

  • Elasticsearch;

  • Amazon S3;

  • Hadoop;

  • sistema de notificações.

Ao lado dele, um programador COBOL iniciante segurava uma caneca de café e tentava encontrar a PROCEDURE DIVISION.

Não havia.

Também não havia JCL.

Nenhum EXEC CICS.

Nenhum CALL explícito mostrando quem chamava quem.

Mesmo assim, o sistema funcionava.

Ou pelo menos deveria funcionar.

O investigador apontou para o diagrama e declarou:

“Em uma arquitetura distribuída, todo componente é uma testemunha. O problema é que algumas testemunhas mentem, outras desaparecem e várias mudam de endereço durante o interrogatório.”

Era hora de reconstruir a ocorrência.


1. A primeira evidência: o clique não é a transação completa

Quando um usuário abre a Netflix em uma televisão, celular, navegador, tablet ou console e pressiona o botão Assistir, parece que apenas um vídeo está sendo solicitado.

Por trás da interface, porém, diversas perguntas precisam ser respondidas:

  • O usuário está autenticado?

  • A assinatura continua ativa?

  • Qual perfil está sendo utilizado?

  • O conteúdo está disponível naquele país?

  • A classificação etária permite a reprodução?

  • Qual idioma deve ser selecionado?

  • Há legenda adequada?

  • O dispositivo suporta HDR?

  • Qual resolução é recomendada?

  • A conexão permite 4K?

  • De onde o vídeo será entregue?

  • Em que ponto o usuário parou?

  • A reprodução deve ser registrada no histórico?

  • Esse evento deve influenciar recomendações futuras?

Um único clique inicia uma cadeia de decisões.

No universo COBOL, poderíamos imaginar um programa monolítico:

PERFORM VALIDAR-USUARIO
PERFORM VALIDAR-ASSINATURA
PERFORM CONSULTAR-PERFIL
PERFORM CONSULTAR-CATALOGO
PERFORM VALIDAR-REGIAO
PERFORM LOCALIZAR-CONTEUDO
PERFORM REGISTRAR-REPRODUCAO
PERFORM INICIAR-STREAMING

Em uma arquitetura de microserviços, essas responsabilidades podem estar espalhadas por diversos programas independentes, executados em máquinas diferentes, atualizados por equipes distintas e comunicando-se por rede.

A operação deixa de ser um grande PERFORM local e passa a ser uma investigação distribuída.

Essa distinção é fundamental.

Quando um parágrafo COBOL chama outro dentro do mesmo programa, o custo costuma ser pequeno e previsível. Quando um serviço chama outro pela rede, surgem novos suspeitos:

  • latência;

  • perda de pacotes;

  • indisponibilidade;

  • timeout;

  • autenticação;

  • serialização;

  • incompatibilidade de versões;

  • congestionamento;

  • repetição de requisições;

  • respostas parciais.

A rede não é apenas um cabo entre dois sistemas.

A rede é uma variável de negócio.


2. O cliente: onde a ocorrência começa

O primeiro componente da arquitetura é o cliente.

Ele pode ser:

  • navegador web;

  • aplicativo Android ou iOS;

  • Smart TV;

  • videogame;

  • receptor multimídia;

  • tablet;

  • dispositivo antigo com poucos recursos.

Um erro comum do iniciante é imaginar que todos os clientes possuem capacidade semelhante.

Não possuem.

Uma Smart TV de entrada fabricada anos atrás pode ter pouca memória, processador limitado e sistema operacional desatualizado. Um smartphone moderno pode realizar tarefas muito mais sofisticadas. Um console de videogame possui características diferentes de um navegador.

O backend não deve simplesmente responder:

{
  "video": "filme.mp4"
}

Ele precisa considerar as características do dispositivo, da sessão e da rede.

Uma resposta mais realista pode incluir:

{
  "titleId": "8732451",
  "profile": "adulto",
  "audio": "pt-BR",
  "subtitle": "pt-BR",
  "resolution": "1080p",
  "hdr": false,
  "resumePosition": 1842,
  "streamingProfile": "adaptive"
}

O cliente é a primeira testemunha, mas nem sempre é confiável.

Ele pode estar:

  • com relógio incorreto;

  • usando uma versão antiga;

  • operando em uma rede instável;

  • repetindo uma requisição;

  • enviando dados incompletos;

  • tentando acessar uma API descontinuada.

Por isso, o backend nunca deve confiar cegamente em tudo que recebe.

No mainframe, essa ideia já existe há décadas: validar campos, proteger limites, conferir códigos, verificar autorização e tratar entradas como potencialmente problemáticas.

A tecnologia muda. A prudência permanece.


3. Elastic Load Balancer: o policial controlando a multidão

Depois que a requisição deixa o cliente, ela normalmente passa por um balanceador de carga.

No diagrama aparece o AWS Elastic Load Balancer, frequentemente abreviado como ELB.

Sua função é distribuir requisições entre várias instâncias de uma aplicação.

Imagine três servidores:

Servidor A
Servidor B
Servidor C

Sem balanceamento, todas as chamadas poderiam cair no Servidor A:

A: 100%
B:   0%
C:   0%

O resultado seria previsível:

Servidor A sobrecarregado
Servidor B ocioso
Servidor C ocioso
Usuários irritados
Equipe de plantão acordada

Com balanceamento:

A: 34%
B: 33%
C: 33%

O balanceador também realiza verificações de saúde.

Se o Servidor B deixa de responder:

A: saudável
B: fora de serviço
C: saudável

O tráfego é direcionado apenas para A e C.

No mundo IBM Z, o programador COBOL pode comparar esse comportamento, de forma conceitual, com mecanismos de distribuição e gerenciamento de carga encontrados em ambientes como:

  • WLM;

  • CICSplex;

  • Sysplex;

  • roteamento entre regiões CICS;

  • múltiplas instâncias de aplicações;

  • balanceamento de workloads.

Não são tecnologias idênticas, mas enfrentam uma pergunta semelhante:

“Para onde esta unidade de trabalho deve ser enviada?”

Curiosidade da perícia

O balanceador não precisa compreender toda a regra de negócio. Ele não precisa saber se o usuário está assistindo a um documentário ou a um anime.

Ele precisa saber coisas como:

  • qual servidor está saudável;

  • qual rota deve receber a chamada;

  • se a conexão deve ser encerrada;

  • se há capacidade disponível;

  • se a comunicação é segura.

Ele é o policial na entrada do prédio.

Não resolve o caso, mas impede que todas as testemunhas entrem pela mesma porta ao mesmo tempo.


4. API Gateway: a recepção blindada

Depois do balanceador, encontramos o API Gateway.

Ele funciona como um ponto central de entrada para as APIs.

Sem Gateway, o cliente poderia precisar conhecer dezenas de serviços:

login.netflix.exemplo
catalogo.netflix.exemplo
perfil.netflix.exemplo
pagamento.netflix.exemplo
recomendacao.netflix.exemplo
historico.netflix.exemplo

Isso criaria forte acoplamento entre o aplicativo e a estrutura interna.

Com um Gateway, o cliente acessa uma entrada controlada:

api.netflix.exemplo

O Gateway analisa a rota:

GET /profiles
GET /catalog
GET /recommendations
POST /playback/start

E encaminha cada requisição ao serviço correspondente.

Além do roteamento, o Gateway pode cuidar de:

  • autenticação;

  • autorização;

  • controle de taxa;

  • logs;

  • métricas;

  • transformação de mensagens;

  • compressão;

  • versionamento;

  • validação de tokens;

  • proteção contra abuso.

Exemplo de rate limiting

Um cliente normal pode fazer algumas requisições por segundo.

Um robô defeituoso pode tentar:

100.000 requisições por segundo

O Gateway pode interromper o abuso:

HTTP/1.1 429 Too Many Requests

Isso protege os serviços internos.

Em uma analogia mainframe, o Gateway reúne funções que podem lembrar, em diferentes níveis, componentes como:

  • front-end transacional;

  • camada de segurança;

  • validação RACF;

  • roteamento;

  • controle de acesso;

  • filtros;

  • monitoramento;

  • limites operacionais.

Ele não substitui o RACF nem é um CICS. A comparação serve apenas para ajudar o iniciante a localizar mentalmente a função.

Dica para o padawan COBOL

Nunca confunda “ponto único de entrada” com “ponto único de falha”.

Se existe apenas uma instância do Gateway e ela morre, toda a plataforma fica inacessível.

Por isso, o Gateway também deve ser:

  • replicado;

  • balanceado;

  • monitorado;

  • escalável;

  • tolerante a falhas.

Em sistemas críticos, até o porteiro precisa de substituto.


5. Microserviços: desmontando o monólito

Chegamos ao coração da arquitetura.

Um monólito reúne muitas funções dentro de uma única aplicação.

Poderíamos ter:

NETFLIX-APP
 ├── Login
 ├── Perfis
 ├── Catálogo
 ├── Busca
 ├── Pagamentos
 ├── Histórico
 ├── Recomendações
 ├── Legendas
 └── Streaming

No começo, esse modelo pode ser simples.

Uma única aplicação.

Um único pacote.

Um único processo de implantação.

Mas, conforme o sistema cresce, o monólito pode se tornar pesado:

  • milhões de linhas;

  • dependências difíceis;

  • testes demorados;

  • deploys arriscados;

  • equipes bloqueando umas às outras;

  • necessidade de escalar tudo, mesmo quando apenas uma função está sobrecarregada.

Os microserviços quebram o sistema em unidades menores:

Serviço de Login
Serviço de Perfil
Serviço de Catálogo
Serviço de Busca
Serviço de Recomendação
Serviço de Cobrança
Serviço de Reprodução
Serviço de Histórico

Cada serviço pode possuir:

  • código próprio;

  • ciclo de vida próprio;

  • equipe responsável;

  • banco ou armazenamento específico;

  • métricas;

  • versionamento;

  • capacidade de escala independente.

Se o serviço de recomendações está sobrecarregado, ele pode receber mais instâncias sem que o serviço de cobrança também precise crescer.

A grande armadilha

Microserviços não eliminam complexidade.

Eles redistribuem a complexidade.

O monólito concentra problemas dentro do programa.

Os microserviços espalham problemas por:

  • rede;

  • contratos de API;

  • autenticação;

  • logs;

  • filas;

  • bancos;

  • versões;

  • observabilidade;

  • deploys;

  • tolerância a falhas.

É como desmontar um grande arquivo sequencial em centenas de datasets.

Você ganha flexibilidade.

Também ganha centenas de nomes, catálogos, permissões, políticas e pontos de falha para administrar.

A arquitetura de microserviços não deve ser adotada porque está na moda. Ela faz sentido quando o domínio, a escala, a organização e a necessidade de independência justificam o custo operacional.

Evidência número 5-A

Um monólito bem projetado é melhor do que uma coleção de microserviços mal projetados.

Esse detalhe costuma desaparecer das apresentações corporativas.


6. Service Discovery: procurando suspeitos que mudam de endereço

Em um ambiente distribuído, os serviços nascem e morrem constantemente.

Uma instância do serviço de catálogo pode estar em:

10.20.14.8:8080

Após um novo deploy, outra instância surge em:

10.20.19.42:8080

Mais tarde, o auto scaling cria novas cópias:

10.20.21.10:8080
10.20.21.11:8080
10.20.21.12:8080

Como os demais serviços descobrem esses endereços?

Não é recomendável gravá-los no código:

MOVE '10.20.14.8' TO WS-ENDERECO-SERVICO.

Esse seria o equivalente distribuído de colocar o nome físico de um dataset em 300 programas COBOL.

A descoberta de serviços mantém um registro atualizado.

Cada serviço informa:

Nome: recommendation-service
Estado: saudável
Endereço: 10.20.21.10
Porta: 8080
Versão: 4.7

Na história da Netflix, o Eureka tornou-se uma referência conhecida para esse tipo de registro e descoberta.

Quando um serviço precisa localizar outro, consulta o registro ou utiliza informações mantidas em cache.

O paralelo com o mainframe

No mainframe, o programador raramente precisa conhecer o endereço físico exato de cada recurso de hardware. Há camadas de abstração, catálogos, subsistemas, definições e mecanismos de roteamento.

O Service Discovery segue uma lógica semelhante:

“Chame o serviço pelo nome lógico; deixe a infraestrutura descobrir onde ele está.”


7. Cache: a impressão digital da performance

O cache é uma das peças mais importantes de sistemas de alta escala.

Imagine que milhões de pessoas abram a mesma série popular.

Sem cache, cada requisição poderia consultar o banco:

SELECT *
  FROM TITULOS
 WHERE ID_TITULO = 8732451;

Multiplique isso por milhões.

O banco acabaria interrogado até confessar crimes que não cometeu.

Com cache, o resultado mais acessado fica temporariamente em memória:

Chave: TITULO:8732451
Valor: metadados do conteúdo
Tempo de vida: 10 minutos

A primeira requisição consulta o banco.

As próximas utilizam a memória.

Como a memória é muito mais rápida, a latência cai e o banco é protegido.

O que pode ficar em cache?

  • informações de perfil;

  • metadados de filmes;

  • títulos populares;

  • configurações;

  • sessões;

  • autorizações temporárias;

  • resultados de busca;

  • recomendações;

  • preferências;

  • disponibilidade regional.

O problema da evidência antiga

Cache também cria riscos.

Imagine que o usuário altere o nome do perfil:

Antes: Vagner
Depois: Conan do Mainframe

O banco foi atualizado, mas o cache continua contendo o valor antigo.

Durante algum tempo, o sistema pode mostrar:

Vagner

Isso é uma inconsistência temporária.

As principais estratégias incluem:

  • expiração por tempo;

  • invalidação após alteração;

  • atualização do cache;

  • cache-aside;

  • write-through;

  • write-behind.

Cache-aside, passo a passo

  1. A aplicação procura a informação no cache.

  2. Se encontrar, retorna imediatamente.

  3. Se não encontrar, consulta o banco.

  4. Armazena o resultado no cache.

  5. Retorna a resposta.

Pseudocódigo:

DADO = CACHE.GET(CHAVE)

SE DADO NÃO EXISTE
    DADO = BANCO.SELECT(CHAVE)
    CACHE.PUT(CHAVE, DADO)
FIM-SE

Para o programador COBOL, a lógica lembra o uso de tabelas em memória, áreas compartilhadas, buffers e recursos temporários para evitar acessos repetidos a dispositivos mais lentos.


8. Banco de dados: o cofre das evidências persistentes

O banco guarda informações que não podem desaparecer quando um processo termina.

Entre elas:

  • usuários;

  • perfis;

  • assinaturas;

  • histórico;

  • preferências;

  • metadados;

  • direitos de exibição;

  • dados financeiros;

  • configurações.

Uma arquitetura de larga escala raramente utiliza apenas um banco universal para tudo.

Diferentes necessidades podem exigir diferentes soluções:

  • dados relacionais;

  • chave-valor;

  • documentos;

  • séries temporais;

  • grafos;

  • pesquisa textual;

  • armazenamento de objetos.

Esse princípio é chamado, em muitos contextos, de persistência poliglota.

Não significa usar dezenas de bancos por entusiasmo tecnológico. Significa escolher o mecanismo adequado para cada tipo de problema.

O alerta do laboratório

Cada banco adicional aumenta:

  • conhecimento necessário;

  • manutenção;

  • monitoramento;

  • backup;

  • recuperação;

  • segurança;

  • custos;

  • complexidade operacional.

No mainframe, o ambiente costuma valorizar padronização e governança forte. Em plataformas distribuídas, a liberdade tecnológica precisa ser equilibrada por disciplina arquitetural.

Caso contrário, a empresa termina com:

37 bancos
14 formatos
9 sistemas de mensageria
0 pessoas que entendem o conjunto completo

Esse é o tipo de cena que nem o CSI deseja encontrar.


9. Kafka e arquitetura orientada a eventos

Quando o usuário pressiona Play, vários sistemas podem precisar saber que a reprodução começou.

Uma abordagem síncrona seria:

Serviço de Reprodução
    chama Histórico
    chama Métricas
    chama Recomendações
    chama Notificações
    chama Auditoria
    chama Analytics

O problema aparece quando um desses serviços está lento ou indisponível.

A reprodução poderia ficar presa esperando um sistema de analytics responder.

Em uma arquitetura orientada a eventos, o serviço publica uma ocorrência:

{
  "eventType": "PLAYBACK_STARTED",
  "userId": "U92837",
  "profileId": "P4",
  "titleId": "8732451",
  "timestamp": "2026-07-26T02:17:31Z"
}

O evento é enviado para um sistema de mensageria ou streaming como o Kafka.

Diversos consumidores podem receber a informação:

Consumidor de Histórico
Consumidor de Recomendações
Consumidor de Métricas
Consumidor de Auditoria
Consumidor de Notificações

O produtor não precisa conversar diretamente com todos.

Isso reduz acoplamento.

Analogia com MQ

Para um programador COBOL, Kafka pode lembrar alguns princípios de mensageria conhecidos no IBM MQ:

  • produtor;

  • consumidor;

  • desacoplamento;

  • comunicação assíncrona;

  • persistência;

  • reprocessamento;

  • filas ou tópicos;

  • confirmação;

  • tratamento de falhas.

Mas Kafka não é simplesmente “um MQ moderno”.

O Kafka trabalha de maneira muito associada a logs distribuídos, partições, offsets, retenção e processamento de fluxos.

No Kafka, mensagens podem permanecer disponíveis por um período e ser relidas.

Isso permite reconstruir estados, reprocessar eventos e alimentar diferentes consumidores.

O offset como marcador de página

Cada consumidor acompanha até onde leu.

Imagine:

Offset 1001
Offset 1002
Offset 1003
Offset 1004

Se o consumidor parar após o 1003, poderá reiniciar a partir daquele ponto.

É como um checkpoint.

Ou, para o veterano do batch:

“O restart point da investigação.”


10. Stream Processing: investigando enquanto o crime acontece

O processamento em lote analisa fatos acumulados.

O stream processing analisa eventos enquanto eles chegam.

Exemplos:

Usuário iniciou episódio
Usuário pausou
Usuário retrocedeu
Usuário abandonou
Usuário terminou
Usuário iniciou o próximo episódio

Um pipeline em tempo real pode detectar comportamentos:

  • aumento repentino de audiência;

  • falhas em determinada região;

  • vídeos travando em um modelo específico de TV;

  • abandono acima do normal;

  • tentativa de fraude;

  • mudança de interesse;

  • tendência viral.

O sistema não precisa aguardar o batch da madrugada.

Pode reagir imediatamente.

Exemplo operacional

Se milhares de usuários começam a receber erro de reprodução em uma região:

PLAYBACK_ERROR aumentou 800%
REGIÃO = Sudeste
DISPOSITIVO = Smart TV modelo X
VERSÃO = 12.4

O pipeline pode gerar um alerta.

A equipe descobre que uma atualização específica introduziu o defeito.

No CSI New York, isso seria o equivalente a cruzar:

  • horário;

  • localização;

  • tipo de vítima;

  • arma;

  • padrão de ocorrência.

Na observabilidade, cruzamos:

  • timestamp;

  • região;

  • versão;

  • dispositivo;

  • endpoint;

  • código de erro;

  • duração;

  • dependência.

O método científico continua o mesmo.


11. Elasticsearch: a busca no catálogo de evidências

Quando o usuário digita uma palavra, o sistema precisa encontrar rapidamente títulos relacionados.

Uma consulta relacional simples com LIKE pode funcionar em bases pequenas:

SELECT TITULO
  FROM CATALOGO
 WHERE TITULO LIKE '%CONAN%';

Em grandes catálogos, com múltiplos idiomas, erros de digitação, sinônimos e relevância, é útil empregar um mecanismo especializado em pesquisa textual.

O Elasticsearch cria índices que facilitam buscas como:

  • palavras parciais;

  • termos semelhantes;

  • filtros;

  • relevância;

  • categorias;

  • idiomas;

  • combinações de campos.

Se o usuário digitar:

filme barbaro espada

O sistema pode retornar obras relacionadas mesmo que a frase completa não apareça em nenhum título.

Curiosidade forense

Um mecanismo de busca não apenas pergunta:

“Existe correspondência?”

Ele também pergunta:

“Qual correspondência é mais relevante?”

Essa ordenação pode considerar:

  • popularidade;

  • idioma;

  • histórico;

  • região;

  • perfil;

  • proximidade textual;

  • tendências.

Buscar não é apenas localizar.

É classificar evidências.


12. Spark, Hadoop e o laboratório de processamento pesado

Enquanto o streaming analisa dados em movimento, tecnologias de processamento distribuído podem analisar grandes volumes históricos.

O Apache Spark pode ser utilizado em tarefas como:

  • transformação de dados;

  • limpeza;

  • agregação;

  • análise;

  • treinamento de modelos;

  • consolidação de métricas;

  • processamento em larga escala.

Imagine bilhões de eventos de reprodução.

Uma análise pode perguntar:

“Quantos usuários abandonaram episódios entre os minutos 12 e 15 durante os últimos 90 dias?”

Outro estudo:

“Quais tipos de conteúdo são assistidos após documentários científicos?”

Essas perguntas podem exigir processamento de enormes conjuntos de dados.

No universo mainframe, o conceito lembra grandes workloads batch:

ENTRADA MASSIVA
      ↓
CLASSIFICAÇÃO
      ↓
AGREGAÇÃO
      ↓
CÁLCULO
      ↓
SAÍDA ANALÍTICA

A diferença está na forma como o processamento é distribuído entre diversos nós.

O programador COBOL não deve subestimar o batch

Existe uma narrativa equivocada segundo a qual batch é tecnologia ultrapassada.

Não é.

Spark, Hadoop e diversos pipelines modernos executam, em essência, formas sofisticadas de processamento em lote e paralelismo distribuído.

O batch não morreu.

Ele trocou o JCL por YAML, JSON, Python e interfaces web, mas continua acordando de madrugada para processar milhões de registros.

Esse é um dos easter eggs do mundo moderno.


13. Amazon S3 e armazenamento de objetos

O Amazon S3 é um serviço de armazenamento de objetos.

Ele pode armazenar:

  • arquivos;

  • imagens;

  • dados de processamento;

  • logs;

  • backups;

  • artefatos;

  • conteúdo multimídia;

  • resultados analíticos.

É importante não imaginar um “disco C:” gigantesco.

O S3 organiza dados como objetos identificados por chaves.

Exemplo conceitual:

bucket: catalog-assets
key: posters/8732451/pt-BR/main.jpg

O objeto possui:

  • conteúdo;

  • identificador;

  • metadados;

  • permissões;

  • políticas;

  • versionamento opcional.

Para o programador mainframe, podemos comparar conceitualmente o uso de diferentes classes de armazenamento, datasets, políticas de retenção e catálogos. Novamente, a implementação é distinta, mas o princípio de organizar, proteger e recuperar grandes volumes permanece familiar.


14. A entrega do vídeo e a CDN

Um dos pontos mais importantes é separar o backend de controle da entrega efetiva do conteúdo.

O backend decide:

  • quem pode assistir;

  • qual conteúdo;

  • qual perfil;

  • qual qualidade;

  • qual licença;

  • qual localização.

Mas enviar o vídeo para milhões de pessoas exige infraestrutura especializada.

A Netflix desenvolveu a Open Connect, sua própria rede de distribuição de conteúdo.

Servidores podem ser posicionados próximos aos provedores de internet, reduzindo a distância entre o conteúdo e o usuário.

Em vez de cada reprodução atravessar metade do planeta:

Usuário no Brasil
       ↓
Servidor distante
       ↓
Alta latência

O conteúdo pode ser entregue a partir de um ponto mais próximo:

Usuário
   ↓
Provedor local
   ↓
Servidor Open Connect

Isso reduz:

  • latência;

  • congestionamento;

  • custo de trânsito;

  • risco de interrupções;

  • tempo de inicialização.

Analogia da locadora

Imagine uma locadora central em Nova York responsável por atender o mundo inteiro.

Seria impossível entregar cada filme rapidamente.

Uma CDN funciona como uma rede de filiais que mantém cópias dos títulos mais procurados próximas aos clientes.

Quando surge uma estreia popular, o conteúdo pode ser posicionado previamente.

O arquivo chega antes do espectador.

A vítima ainda nem entrou na cena, mas a perícia já preparou o laboratório.


15. Tolerância a falhas: todos são suspeitos

Em ambientes tradicionais, muitas equipes tentam impedir qualquer falha.

Em arquiteturas distribuídas, parte-se de uma premissa diferente:

“Algum componente falhará.”

A pergunta deixa de ser:

“Como garantir que nada falhe?”

E passa a ser:

“Como continuar operando quando algo falhar?”

Isso exige padrões como:

  • timeout;

  • retry controlado;

  • circuit breaker;

  • fallback;

  • redundância;

  • isolamento;

  • filas;

  • replicação;

  • degradação graciosa.

Timeout

Uma chamada não pode esperar para sempre.

Serviço A chama Serviço B
Tempo máximo: 500 ms

Se B não responder, A precisa tomar uma decisão.

Retry

A pode tentar novamente.

Mas retries indiscriminados são perigosos.

Se um serviço já está sobrecarregado, milhares de tentativas extras podem piorar a situação.

É o equivalente a uma multidão tentando abrir a mesma porta emperrada.

Circuit Breaker

O circuit breaker interrompe temporariamente chamadas para um serviço com falhas.

Estados conceituais:

FECHADO
Chamadas permitidas

ABERTO
Chamadas bloqueadas

SEMIABERTO
Algumas chamadas de teste

Isso evita que toda a plataforma continue pressionando um componente doente.

Fallback

Se o serviço de recomendações estiver indisponível, a tela inicial não precisa ficar totalmente vazia.

Pode exibir:

Títulos populares
Continuar assistindo
Novidades

O sistema perde personalização, mas continua funcional.

Isso é degradação graciosa.

Uma falha parcial não precisa se transformar em blackout total.


16. Chaos Monkey: soltando o suspeito dentro do laboratório

Uma das iniciativas mais famosas associadas à engenharia da Netflix foi a prática de testar resiliência por meio de falhas provocadas.

O Chaos Monkey tornou-se símbolo dessa filosofia.

A ideia é desconfortável:

desligar componentes propositalmente para descobrir se o sistema suporta a perda.

Parece loucura.

Mas existe lógica.

Se a arquitetura afirma tolerar a perda de uma instância, é melhor comprovar isso de maneira controlada do que descobrir durante uma estreia global.

É semelhante a:

  • simular disaster recovery;

  • testar restauração de backup;

  • executar exercícios de contingência;

  • remover um nó de um cluster;

  • validar failover;

  • testar um plano de continuidade.

Easter egg CSI

O Chaos Monkey é como um investigador que entra na sala de evidências, apaga uma luz, remove uma câmera e pergunta:

“Vocês ainda conseguem resolver o caso?”

Se a resposta for não, o sistema não era resiliente.

Apenas parecia resiliente enquanto tudo funcionava.


17. Observabilidade: logs não bastam

Em um monólito, um log pode mostrar quase toda a sequência.

Em microserviços, uma única transação atravessa muitos componentes.

Precisamos de três pilares:

  • logs;

  • métricas;

  • traces.

Logs

Mostram eventos detalhados:

2026-07-26 02:17:31
PLAYBACK REQUEST RECEIVED
USER=U92837
TITLE=8732451

Métricas

Mostram comportamentos agregados:

requisições por segundo
latência média
percentil 95
taxa de erro
uso de CPU
memória
fila acumulada

Traces distribuídos

Acompanham uma requisição através de vários serviços.

Exemplo:

TRACE-ID: ABC-92871

Gateway           12 ms
Profile Service   18 ms
Catalog Service   25 ms
Rights Service    40 ms
Playback Service  85 ms

Agora sabemos onde o tempo foi gasto.

Sem trace, cada equipe diria:

“Meu serviço está normal.”

E o usuário continuaria esperando.

A correlação é a impressão digital

Todas as chamadas relacionadas à mesma transação devem carregar um identificador de correlação.

CORRELATION-ID = ABC-92871

Esse código funciona como o número do caso no CSI.

Sem ele, a equipe possui milhares de fragmentos, mas não consegue provar quais pertencem à mesma ocorrência.


18. Segurança: ninguém entra na cena sem credencial

A arquitetura precisa proteger:

  • contas;

  • dados pessoais;

  • pagamentos;

  • conteúdo;

  • licenças;

  • APIs;

  • infraestrutura;

  • segredos;

  • chaves;

  • tokens.

A autenticação responde:

“Quem é você?”

A autorização responde:

“O que você pode fazer?”

Um usuário autenticado pode assistir a determinados conteúdos, mas não pode:

  • alterar o catálogo;

  • consultar dados de outros assinantes;

  • chamar APIs administrativas;

  • acessar segredos;

  • modificar regras de distribuição.

No mundo mainframe, essa mentalidade é profundamente familiar.

O RACF, por exemplo, trabalha com identidades, recursos, perfis e permissões.

Em ambientes distribuídos, a segurança pode envolver:

  • IAM;

  • tokens;

  • OAuth;

  • certificados;

  • TLS;

  • roles;

  • políticas;

  • secrets managers;

  • controle de rede;

  • auditoria.

A regra central permanece:

conceder apenas o acesso necessário.

O nome moderno é “princípio do menor privilégio”.

O mainframe já conhecia essa disciplina antes de ela virar slide de conferência.


19. Passo a passo de uma reprodução

Vamos reconstruir o caso completo.

Passo 1 — O usuário abre o aplicativo

O cliente carrega configurações e estabelece uma conexão segura.

Passo 2 — A requisição chega ao balanceador

O tráfego é direcionado para uma instância saudável do Gateway.

Passo 3 — O Gateway valida a chamada

Ele verifica token, rota, limite e versão da API.

Passo 4 — O perfil é consultado

O serviço de perfil identifica preferências, idioma e classificação.

Passo 5 — O catálogo é analisado

O sistema verifica se o título existe e está disponível naquela região.

Passo 6 — Direitos são validados

Nem todo conteúdo pode ser exibido em todos os países ou períodos.

Passo 7 — A sessão de reprodução é criada

O backend define parâmetros de streaming, dispositivo e qualidade.

Passo 8 — O conteúdo é localizado

O sistema identifica o ponto de distribuição adequado.

Passo 9 — O cliente inicia a reprodução

O vídeo começa a ser entregue adaptativamente.

Passo 10 — Eventos são publicados

PLAYBACK_STARTED

Passo 11 — Consumidores processam o evento

Histórico, analytics, recomendações e monitoramento reagem.

Passo 12 — Métricas são acompanhadas

A plataforma mede travamentos, bitrate, buffering e abandono.

Passo 13 — A qualidade é ajustada

Se a conexão piorar, a resolução pode cair.

Se melhorar, pode subir novamente.

Passo 14 — A sessão termina

O ponto de parada é salvo e um evento final pode ser publicado.

Tudo isso nasce de um botão.


20. O que o programador COBOL deve estudar primeiro

Não tente aprender toda a arquitetura de uma vez.

Siga uma sequência.

1. HTTP e APIs REST

Aprenda:

  • GET;

  • POST;

  • PUT;

  • DELETE;

  • headers;

  • status codes;

  • JSON;

  • autenticação.

2. Comunicação síncrona e assíncrona

Entenda a diferença entre:

esperar a resposta

e:

publicar mensagem e continuar

3. Filas e eventos

Compare conceitos do MQ com Kafka, sem assumir que são idênticos.

4. Cache

Estude:

  • hit;

  • miss;

  • TTL;

  • invalidação;

  • consistência.

5. Escalabilidade

Aprenda a diferença entre:

  • escala vertical;

  • escala horizontal.

Escala vertical:

máquina maior

Escala horizontal:

mais máquinas

6. Observabilidade

Aprenda a interpretar:

  • logs;

  • métricas;

  • traces;

  • dashboards;

  • alertas.

7. Resiliência

Estude:

  • timeout;

  • retry;

  • circuit breaker;

  • fallback;

  • bulkhead.

8. Containers e orquestração

Depois dos fundamentos, avance para Docker e Kubernetes.

Não comece pelo Kubernetes sem entender a aplicação.

Isso seria como estudar JES2 antes de compreender o que é um JOB.


21. Lições que o mundo distribuído pode aprender com o mainframe

A indústria gosta de apresentar microserviços como uma revolução completa.

Mas vários princípios fundamentais já existiam em ambientes corporativos muito antes:

  • processamento transacional;

  • controle de carga;

  • alta disponibilidade;

  • segurança centralizada;

  • recuperação;

  • auditoria;

  • mensageria;

  • monitoramento;

  • isolamento;

  • governança;

  • capacidade de processamento massivo.

O mainframe ensina disciplina.

O mundo distribuído ensina flexibilidade e descentralização.

As melhores arquiteturas aprendem com ambos.

Um profissional COBOL não deve olhar para a Netflix e pensar:

“Tudo que aprendi ficou obsoleto.”

Deve pensar:

“Muitos problemas são conhecidos. O que mudou foi a forma de distribuí-los e tratá-los.”

Um ABEND em um programa batch costuma deixar evidências concentradas:

  • código;

  • dump;

  • joblog;

  • step;

  • dataset;

  • horário.

Uma falha distribuída pode deixar fragmentos em:

  • 15 serviços;

  • 8 logs;

  • 3 regiões;

  • 2 filas;

  • 1 cache;

  • milhares de traces.

A habilidade de investigação torna-se ainda mais importante.


22. Curiosidades encontradas na sala de evidências

Curiosidade 1 — Microserviço não significa programa minúsculo

O tamanho deve refletir uma responsabilidade coerente.

Dividir demais produz “nano-serviços” que aumentam o tráfego e a complexidade.

Curiosidade 2 — Nem tudo precisa ser em tempo real

Muitos relatórios, consolidações e treinamentos de modelos podem ser batch.

Curiosidade 3 — O banco não deve ser tratado como fila

Usar uma tabela para simular mensageria pode funcionar em pequena escala, mas costuma criar bloqueios, consultas repetitivas e problemas operacionais.

Curiosidade 4 — Retry pode duplicar uma transação

Se o cliente envia uma cobrança, recebe timeout e tenta novamente, a primeira tentativa pode ter sido concluída.

Por isso, operações importantes precisam considerar idempotência.

Curiosidade 5 — Idempotência é o antídoto contra o duplo disparo

Uma mesma requisição repetida deve produzir um resultado controlado.

Exemplo:

IDEMPOTENCY-KEY: PAY-20260726-92871

Se a requisição for recebida novamente, o sistema reconhece que já a processou.

Curiosidade 6 — “Eventual consistency” não significa desorganização

Significa que diferentes partes podem levar algum tempo para convergir ao mesmo estado.

Mas esse comportamento precisa ser conhecido, medido e aceito pelo negócio.

Curiosidade 7 — Um sistema pode estar funcionando e ainda assim estar doente

A CPU pode estar normal, mas a latência aumentando.

Os servidores podem estar ativos, mas os caches com baixa taxa de acerto.

As APIs podem responder, mas os eventos podem estar acumulando.

Saúde não é apenas estar ligado.


Conclusão — O caso nunca foi apenas sobre streaming

No final da madrugada, o laboratório havia reconstruído o caminho da requisição.

O atraso não estava no vídeo.

Também não estava no banco.

A investigação encontrou uma cadeia inesperada:

  1. o cliente iniciou a chamada;

  2. o Gateway encaminhou corretamente;

  3. o serviço de perfil respondeu;

  4. o serviço de recomendação chamou uma dependência lenta;

  5. a dependência não possuía timeout adequado;

  6. threads começaram a se acumular;

  7. o balanceador continuou enviando tráfego;

  8. a latência contaminou outras chamadas;

  9. o sistema não caiu;

  10. mas ficou progressivamente mais lento.

O culpado não era um servidor quebrado.

Era uma espera sem limite.

O investigador fechou o relatório.

O programador COBOL olhou novamente para o diagrama.

Agora ele já não via apenas caixas coloridas e setas.

Via:

  • unidades de trabalho;

  • pontos de sincronização;

  • recursos compartilhados;

  • filas;

  • gargalos;

  • contratos;

  • estados;

  • dependências;

  • riscos;

  • evidências.

A arquitetura da Netflix não é importante apenas porque suporta vídeos.

Ela é importante porque demonstra como sistemas modernos podem ser construídos para operar em escala gigantesca, aceitando que máquinas falham, redes atrasam, serviços desaparecem e usuários continuam exigindo respostas imediatas.

Para o programador COBOL iniciante, a maior lição não é aprender nomes sofisticados.

Não é decorar Kafka, Spark, Elasticsearch ou API Gateway.

A verdadeira lição é compreender o fluxo.

Todo sistema recebe algo, valida, processa, consulta, decide, registra e responde.

O mainframe faz isso.

Os microserviços fazem isso.

A diferença está na distribuição das responsabilidades e na quantidade de fronteiras que a transação precisa atravessar.

No mainframe, muitas vezes entramos em um prédio fortificado.

Na arquitetura distribuída, atravessamos uma cidade inteira.

E em uma cidade com milhares de serviços, milhões de mensagens e bilhões de eventos, toda chamada deixa uma impressão digital.

Basta saber onde procurar.

No monitor do laboratório, uma nova ocorrência apareceu:

CASE NY-2026-0726

EVENT:
PLAYBACK_STARTED

STATUS:
PROCESSING

CORRELATION-ID:
BELLACOSA-MAINFRAME-001

O investigador pegou a caneca de café.

O programador abriu o terminal.

Em algum ponto da arquitetura, outra evidência acabava de ser produzida.

E o caso estava apenas começando.

BellacosaFlix Mainframe Developer Collection

Bootcamp DIO · Projeto Front-end

LusoFlix sem Mistérios para Programadores Web

Uma investigação completa sobre HTML, CSS e JavaScript, mostrando como um exercício inspirado na Netflix se transformou em um portal audiovisual de viagens, histórias, castelos e memórias de Portugal.

O que você encontrará nesta investigação

Os principais elementos técnicos analisados no projeto LusoFlix, organizados como uma coleção de episódios para estudantes de desenvolvimento web.

Estrutura

HTML como DATA DIVISION

Elementos semânticos, títulos, navegação, seções, artigos, links, imagens e a organização lógica da página.

Interface

CSS e identidade visual

Variáveis CSS, Flexbox, responsividade, gradientes, cores escuras, botões e aparência inspirada em streaming.

Interatividade

JavaScript e carrosséis

Scripts, bibliotecas externas, navegação horizontal, eventos e recursos capazes de tornar a página dinâmica.

Conteúdo

Memórias de Portugal

Lisboa, Setúbal, castelos, monumentos, igrejas, gastronomia, praias, rios, turismo e vídeos do YouTube.

Artigo completo incorporado

Leia o conteúdo dentro desta página ou utilize o botão de acesso direto caso o navegador bloqueie a incorporação.

Bootcamp DIO Projeto LusoFlix: Programadores Front-end em HTML, CSS e JavaScript

Blogspot

LusoFlix: desenvolvimento web com identidade própria

O LusoFlix nasceu como um projeto de desenvolvimento front-end realizado durante um Bootcamp da DIO. A proposta inicial era recriar uma interface inspirada na página principal da Netflix utilizando HTML, CSS e JavaScript.

Entretanto, o projeto ultrapassou a condição de simples clone. Em vez de reproduzir apenas uma coleção genérica de filmes e séries, o desenvolvedor criou um catálogo audiovisual dedicado a Portugal, reunindo vídeos sobre cidades, turismo, monumentos, história, castelos, praias, igrejas, gastronomia e experiências de viagem.

HTML semântico e organização do conteúdo

O HTML fornece a estrutura lógica da aplicação. Elementos como cabeçalho, navegação, seções, títulos, parágrafos, imagens, botões e links ajudam o navegador a compreender a hierarquia do conteúdo.

Uma estrutura semântica também favorece leitores de tela, tecnologias assistivas e mecanismos de busca, porque descreve a função de cada parte da página de maneira mais clara.

CSS, responsividade e experiência visual

O CSS é responsável pelo visual escuro, pelos destaques vermelhos, pela organização horizontal dos elementos, pelos espaçamentos e pelo comportamento responsivo. Recursos como Flexbox, variáveis CSS, gradientes, transições e media queries permitem adaptar a experiência a computadores, tablets e smartphones.

JavaScript e comportamento dinâmico

O JavaScript permite adicionar interatividade ao projeto. Carrosséis, eventos de clique, filtros, pesquisas, janelas modais e carregamento dinâmico de informações são exemplos de funcionalidades que podem ampliar uma página de catálogo.

Publicação e aprendizagem prática

O projeto demonstra como um exercício acadêmico pode se transformar em um produto pessoal. Ao associar programação, conteúdo autoral e memórias de viagem, o desenvolvedor deixa de apenas reproduzir uma interface e começa a construir uma experiência com identidade própria.

Leia a investigação completa no artigo Bootcamp DIO Projeto LusoFlix: Programadores Front-end em HTML, CSS e JavaScript .

  • LusoFlix
  • HTML5
  • CSS3
  • JavaScript
  • Bootcamp DIO
  • Desenvolvimento Front-end
  • Clone Netflix
  • GitHub Pages
  • Web Design
  • Portugal
  • Programação Web
  • Bellacosa Mainframe
☕ Um Café no Bellacosa Mainframe
HTML, CSS, JavaScript, desenvolvimento front-end, educação tecnológica e memórias de Portugal.
Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...