☕ 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

quinta-feira, 6 de junho de 2024

Sherlock Holmes, COBOL e o Mistério da API que Entrou no CICS sem Conhecer COMMAREA

 

Bellacosa Mainframe e o zos connect

☕ Um Café no Bellacosa Mainframe

Sherlock Holmes, COBOL e o Mistério da API que Entrou no CICS sem Conhecer COMMAREA

🔎 z/OS Connect, REST, JSON, OpenAPI, CICS, IMS, Db2, segurança, modernização e o curioso caso em que Watson jurava que o legado precisava morrer — até Holmes encontrar uma porta chamada API

Londres, 221B Baker Street.

Chovia.

Naturalmente chovia.

Toda boa investigação envolvendo sistemas legados começa com chuva, café frio e alguém dizendo:

— Holmes, temos um problema grave.

Sherlock Holmes não levantou os olhos do terminal 3270.

— Grave, Watson?

— Gravíssimo. A diretoria descobriu APIs.

Holmes parou.

A sala ficou em silêncio.

Até o JES2 pareceu diminuir o número de mensagens no console.

Watson continuou:

— Agora querem modernizar tudo.

— Naturalmente.

— Disseram que temos de substituir o COBOL.

Holmes finalmente virou a cadeira.

— E qual é o problema do sistema atual?

Watson consultou as anotações.

— Processa milhões de transações por dia, roda há vinte anos, tem disponibilidade excelente, regras de negócio consolidadas, integração com CICS e Db2 e praticamente ninguém sabe exatamente tudo que ele faz.

Holmes acendeu imaginariamente seu cachimbo.

— Então, Watson, já temos nosso primeiro suspeito.

— O COBOL?

— Não. A palavra modernização.

E assim começa nossa investigação.

Porque uma das coisas mais interessantes sobre o IBM z/OS Connect é justamente esta: ele nos obriga a separar duas coisas que muita apresentação corporativa insiste em colocar dentro da mesma mala.

Modernizar não é necessariamente reescrever.

Às vezes o sistema já está fazendo exatamente aquilo que deveria fazer.

O problema é apenas que ninguém do lado de fora consegue conversar com ele usando as interfaces modernas que o restante da empresa adotou.

E é aí que entra o z/OS Connect.



O cadáver não estava morto

Vamos começar pelo mistério clássico.

Você possui um programa COBOL.

Algo parecido com isto:

IDENTIFICATION DIVISION.
PROGRAM-ID. CONSULTA-SALDO.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-CONTA       PIC 9(08).
01 WS-SALDO       PIC S9(11)V99 COMP-3.
01 WS-LIMITE      PIC S9(11)V99 COMP-3.
01 WS-STATUS      PIC X(01).

PROCEDURE DIVISION.

    PERFORM CONSULTAR-CONTA
    PERFORM CALCULAR-LIMITE
    PERFORM RETORNAR-DADOS
    GOBACK.

O programa funciona.

Ele talvez seja executado dentro do CICS.

Talvez consulte Db2.

Talvez utilize uma COMMAREA.

Talvez faça parte de uma transação que existe desde uma época em que telefone celular parecia um tijolo usado para ligar para Gordon Gekko.

Durante anos, o acesso era feito por uma aplicação 3270.

Algo como:

USUÁRIO
   |
   v
TERMINAL 3270
   |
   v
CICS
   |
   v
COBOL
   |
   v
Db2

Perfeito.

Até que chegou o aplicativo mobile.

O novo desenvolvedor pergunta:

— Qual endpoint devo chamar para consultar saldo?

O COBOLzeiro responde:

— Endpoint?

— Sim. Algo como:

GET /accounts/123456/balance

— Rapaz, eu tenho uma COMMAREA.

E os dois se observam como arqueólogos de civilizações diferentes.

É exatamente esse tipo de fronteira tecnológica que o z/OS Connect ajuda a resolver.


A primeira pista: o que é z/OS Connect?

Em termos simples, o IBM z/OS Connect permite conectar recursos do z/OS ao universo de APIs.

Isso significa criar uma ponte entre tecnologias como:

COBOL
CICS
IMS
Db2
z/OS

e o universo:

HTTP
REST
JSON
OpenAPI
OAuth
JWT
Cloud
Mobile
Web
Kubernetes

Visualmente:

Aplicação Web
     |
Aplicação Mobile
     |
Microsserviço
     |
Sistema Cloud
     |
     v
 REST / JSON
     |
     v
+----------------+
| z/OS Connect   |
+----------------+
     |
     +------ CICS
     |
     +------ IMS
     |
     +------ aplicações z/OS
     |
     v
   COBOL
     |
     v
    Db2

Para Sherlock Holmes, isso seria a primeira evidência importante.

O COBOL não desapareceu.

Apenas ganhou um intérprete na porta.


Watson comete o primeiro erro: “Então z/OS Connect é um API Gateway?”

Não exatamente.

Esse é um daqueles erros suficientemente próximos da verdade para parecer corretos.

O z/OS Connect possui funções relacionadas a APIs, segurança e integração, mas sua função mais importante deve ser entendida como:

ligar APIs ao mundo z/OS.

Em uma arquitetura corporativa real, pode existir algo assim:

Internet
   |
   v
API Gateway corporativo
   |
   v
z/OS Connect
   |
   v
CICS
   |
   v
COBOL

O API Gateway pode cuidar de coisas como:

  • exposição externa;

  • políticas corporativas;

  • rate limiting;

  • analytics;

  • controle de consumidores;

  • roteamento;

  • autenticação de borda.

Enquanto o z/OS Connect trabalha próximo dos recursos do IBM Z.

Holmes provavelmente diria:

“Não confunda o mordomo com a porta da mansão, Watson. Ambos controlam quem entra, mas desempenham funções diferentes.”


API Provider: quando o mainframe oferece um serviço

Agora entramos em uma das funções mais importantes.

Imagine um CICS contendo transações como:

INQC  Consulta Cliente
INQS  Consulta Saldo
BLKC  Bloqueia Cartão
LIMC  Consulta Limite

No mundo antigo, uma aplicação talvez precisasse conhecer detalhes específicos do backend.

No mundo das APIs, podemos criar algo mais amigável:

GET /clientes/{id}

GET /contas/{id}/saldo

POST /cartoes/{id}/bloqueio

GET /cartoes/{id}/limite

Uma aplicação mobile poderia executar:

GET /contas/778899/saldo

E receber:

{
  "conta": "778899",
  "saldo": 28453.72,
  "moeda": "BRL"
}

Por trás disso:

Mobile
  |
  | HTTPS
  v
z/OS Connect
  |
  v
CICS
  |
  v
COBOL
  |
  v
Db2

A parte fascinante é esta:

o aplicativo não precisa saber que existe CICS.

E o COBOL não precisa saber que existe smartphone.

Cada lado trabalha dentro de seu próprio universo tecnológico.

Esse desacoplamento é uma das grandes virtudes da arquitetura.


Uma COMMAREA entra em Baker Street

Watson recebe uma estrutura COBOL:

01 DFHCOMMAREA.

   05 CA-ACCOUNT     PIC 9(08).
   05 CA-CUSTOMER    PIC X(40).
   05 CA-BALANCE     PIC S9(11)V99 COMP-3.
   05 CA-LIMIT       PIC S9(11)V99 COMP-3.
   05 CA-STATUS      PIC X(01).

Do outro lado chega:

{
  "account": "12345678"
}

Watson pergunta:

— Holmes, como esse JSON vai entrar nessa estrutura?

Holmes aponta para o quadro.

É justamente aqui que entra o conceito de mapeamento e transformação de dados.

Porque os dois mundos possuem representações diferentes.

JSON entende coisas como:

string
number
boolean
array
object
null

COBOL possui:

PIC X
PIC 9
COMP
COMP-3
OCCURS
REDEFINES
SIGN

Imagine:

05 BALANCE PIC S9(11)V99 COMP-3.

Isso não é simplesmente “um número”.

Existe representação interna.

Existe sinal.

Existe escala decimal.

Existe formato binário ou decimal compactado dependendo da declaração.

Portanto, converter:

{
  "balance": 1500.75
}

para uma estrutura COBOL envolve entender tipos e representação.

Não é magia.

É integração.


Easter egg nº 1: COMP-3 continua assustando quem vem da web

Um desenvolvedor JavaScript olha:

PIC S9(09)V99 COMP-3

e talvez pense:

“Por que o número está vestido de hieróglifo?”

O programador COBOL olha:

const value = data?.customer?.accounts?.[0]?.balance ?? 0;

e pensa exatamente a mesma coisa.

Cada geração cria sua própria magia negra.


OpenAPI: a ficha policial da API

Sherlock Holmes gostava de arquivos.

Dossiês.

Registros.

Descrições precisas.

OpenAPI provavelmente seria uma de suas tecnologias favoritas.

OpenAPI é uma especificação para descrever APIs HTTP.

Por exemplo:

paths:

  /accounts/{accountId}/balance:

    get:

      summary: Returns account balance

      parameters:

        - name: accountId
          in: path
          required: true

      responses:

        '200':
          description: Account found

        '404':
          description: Account not found

Esse arquivo pode descrever:

  • endpoints;

  • parâmetros;

  • métodos HTTP;

  • request;

  • response;

  • códigos de retorno;

  • schemas;

  • tipos de dados.

Para um programador COBOL iniciante, podemos fazer uma analogia.

Uma copybook define:

estrutura de dados

OpenAPI define:

estrutura da conversa.

A copybook responde:

“Como os dados estão organizados?”

OpenAPI responde:

“Como alguém chama esse serviço e o que ele recebe de volta?”

Não são equivalentes.

Mas ambos cumprem a função importantíssima de estabelecer contratos.


API-first: Holmes começa pela pergunta correta

Durante muitos anos, projetos de integração começavam assim:

Temos o programa ABC123. Como transformamos isso em uma API?

Funciona.

Mas arquiteturas modernas cada vez mais preferem começar de outra maneira:

Qual serviço o negócio precisa?

Imagine que precisamos oferecer consulta de saldo.

Primeiro definimos:

GET /accounts/{id}/balance

Depois definimos o retorno:

{
   "account": "123456",
   "availableBalance": 1800.42,
   "currency": "BRL"
}

Só depois perguntamos:

Quem implementará isso?

Talvez:

CICS + COBOL

Talvez:

IMS

Talvez:

Db2

Talvez daqui a dez anos:

outra implementação.

O consumidor não precisa necessariamente saber.

Este é o poder de um contrato bem definido.


O grande mistério: modernização sem reescrita

Aqui chegamos ao coração do caso.

Considere um programa COBOL com:

25 anos de produção

4.000 regras de negócio

dezenas de integrações

tratamentos de exceção

rotinas fiscais

regras contábeis

auditoria

segurança

controle transacional

Alguém entra em uma reunião e diz:

— Precisamos reescrever porque é legado.

Holmes pergunta:

— O sistema está errado?

— Não.

— Está lento?

— Não.

— É instável?

— Não.

— Não suporta o volume?

— Suporta.

— Então por que reescrever?

— Porque não é moderno.

Silêncio.

Esse é exatamente o ponto no qual tecnologias como z/OS Connect ficam interessantes.

Talvez você não precise substituir:

COBOL

Talvez precise substituir:

a maneira como os consumidores acessam o COBOL.

Veja a diferença:

ANTES

3270
 |
 v
CICS
 |
 v
COBOL

Depois:

Mobile
Web
Cloud
Parceiro
Kubernetes
    |
    v
REST API
    |
    v
z/OS Connect
    |
    v
CICS
    |
    v
COBOL

A lógica continua funcionando.

A interface muda.

Isso é modernização por integração.


Mas Holmes encontra pegadas indo na direção contrária

Até agora falamos de aplicações externas chamando o mainframe.

Mas existe outro cenário.

O próprio z/OS pode precisar chamar APIs externas.

Imagine um programa COBOL processando uma transação de cartão.

Ele precisa consultar um sistema antifraude baseado em IA rodando em cloud.

Fluxo:

CICS
 |
 v
COBOL
 |
 v
Integração API
 |
 v
Serviço antifraude
 |
 v
Cloud

Pergunta:

Mainframe pode consumir APIs modernas?

Sim.

Isso quebra uma imagem antiga do mainframe como uma fortaleza completamente isolada.

Na realidade, ambientes modernos são híbridos.

Algo como:

                CLOUD

         +------------------+
         | Fraud Detection  |
         +--------+---------+
                  ^
                  |
                REST
                  |
                  |
+----------------------------------+
|              IBM Z               |
|                                  |
|     COBOL ---- z/OS Connect      |
|       |                          |
|      CICS                        |
|       |                          |
|      Db2                         |
+----------------------------------+

Isso permite ao legado participar de ecossistemas modernos sem abandonar tudo aquilo que já faz bem.


Um pequeno caso para Watson investigar

Imagine uma transferência bancária.

O fluxo COBOL tradicional:

1. Validar conta de origem
2. Validar conta destino
3. Verificar saldo
4. Verificar limite
5. Executar débito
6. Executar crédito
7. Registrar auditoria

Agora surge uma nova regra:

Consultar sistema externo antifraude.

O programa pode enviar dados como:

{
  "customer": "823718",
  "amount": 12500.00,
  "destination": "998812",
  "channel": "MOBILE"
}

e receber:

{
  "riskScore": 87,
  "decision": "REVIEW"
}

O COBOL pode então continuar seu processamento.

Note o fenômeno.

O sistema não foi substituído.

Ele foi enriquecido por integração.


Segurança: Moriarty encontra a API

Toda vez que você cria uma nova interface, cria também uma nova superfície de ataque.

Moriarty ficaria muito interessado.

Imagine esta API:

POST /payments

Excelente.

Agora imagine que qualquer pessoa possa chamá-la.

Péssimo.

Logo entram conceitos como:

TLS
OAuth
JWT
autenticação
autorização
identidade
RACF
logging
auditoria
políticas

Uma arquitetura simplificada:

Aplicação
   |
   | token
   v
API Gateway
   |
   v
z/OS Connect
   |
   v
Segurança z/OS
   |
   v
CICS
   |
   v
COBOL

A pergunta crítica deixa de ser apenas:

“A API funciona?”

e passa a incluir:

“Quem chamou?”

“Com qual identidade?”

“Qual recurso tentou acessar?”

“Estava autorizado?”

“O que foi executado?”

“Existe trilha de auditoria?”

Para quem já conhece RACF, a filosofia não é estranha.

RACF sempre quis saber:

USER
RESOURCE
ACCESS

APIs simplesmente ampliam esse problema para um novo universo.


Easter egg nº 2: Sherlock provavelmente seria sysprog

Holmes observa detalhes insignificantes para inferir causas complexas.

Um sysprog vê:

IEC141I

e começa a reconstruir mentalmente meia hora de atividade no sistema.

Watson vê apenas:

“Deu erro.”

Holmes vê:

dataset, volume, catalog, disposition, job, step, allocation, contexto.

A diferença entre novato e veterano frequentemente não é conhecer mais comandos.

É reconhecer padrões.

Sherlock Holmes seria absolutamente perigoso com acesso ao SDSF.


A armadilha do “REST em tudo”

Agora vem um dos pontos mais importantes.

APIs são ferramentas.

Não religião.

Imagine um batch processando:

10.000.000 registros

localmente.

Alguém decide modernizar:

Cada registro chamará uma REST API.

Então você substitui:

10 milhões de operações locais

por:

10 milhões de chamadas HTTP.

Agora adicionamos:

rede
TLS
serialização
desserialização
timeouts
retries
latência
conexões
rate limits
monitoramento distribuído

Watson exclama:

— Mas ficou moderno!

Holmes responde:

— E quarenta vezes mais lento.

Nem toda chamada deve virar API.

Existem cenários em que:

CALL
LINK
MQ
batch
arquivo
Db2

continuam sendo alternativas perfeitamente adequadas.

Arquitetura madura não pergunta:

“Qual tecnologia está na moda?”

Ela pergunta:

“Qual mecanismo resolve melhor este problema?”


Granularidade: o caso das 47 APIs

Imagine um aplicativo bancário mostrando a página inicial.

Ele precisa de:

nome
saldo
limite
cartões
investimentos
últimas transações
empréstimos
mensagens

O arquiteto mais empolgado cria:

GET /customer
GET /balance
GET /limit
GET /cards
GET /investments
GET /transaction1
GET /transaction2
GET /transaction3
GET /loan
GET /messages

A tela abre.

E dispara uma pequena invasão contra o próprio mainframe.

Mobile
 |
 |--> API
 |--> API
 |--> API
 |--> API
 |--> API
 |--> API
 |--> API
 |--> API
 |
 v
z/OS

Isso pode gerar problemas de:

  • volume;

  • latência;

  • CPU;

  • conexão;

  • dependências;

  • falhas parciais;

  • escalabilidade.

Holmes diria:

“O fato de haver quarenta pegadas não significa que quarenta pessoas passaram pela sala. Talvez Watson tenha caminhado em círculos.”

Em APIs também.

Precisamos analisar granularidade.

Talvez a tela precise de uma API agregadora:

GET /customer-home

que retorne várias informações em uma chamada.

Não existe resposta universal.

Existe engenharia.


Observabilidade: onde estão escondidos os 4 segundos?

No velho ambiente:

CICS
 |
COBOL
 |
Db2

Se algo demorava, você analisava:

CICS statistics
SMF
RMF
Db2
CPU
I/O
locks
waits

Agora temos:

Smartphone
    |
Internet
    |
API Gateway
    |
z/OS Connect
    |
CICS
    |
COBOL
    |
Db2

Usuário reclama:

“Consulta demorou quatro segundos.”

Watson aponta para COBOL.

Holmes pergunta:

— Por quê?

— Porque é legado.

— Evidência?

— Nenhuma.

Então começa a investigação.

Talvez:

Mobile             150 ms
Internet           420 ms
Gateway             30 ms
z/OS Connect        40 ms
CICS                 4 ms
COBOL                7 ms
Db2                  5 ms
serviço externo   3100 ms

Resultado:

COBOL estava inocente.

Esse tipo de ambiente exige observabilidade ponta a ponta.

Você precisa conseguir seguir a transação desde a origem até o backend.


Kubernetes entra pela janela

Agora podemos ligar z/OS Connect ao mundo cloud-native.

Imagine:

+--------------------------------+
| Kubernetes                     |
|                                |
| Pod                            |
|   Spring Boot                  |
|                                |
+-------------+------------------+
              |
              | REST
              v
        z/OS Connect
              |
              v
            CICS
              |
              v
            COBOL
              |
              v
             Db2

Isso não é contradição.

É arquitetura híbrida.

Durante anos venderam uma falsa escolha:

MAINFRAME OU CLOUD

Na prática, muitas organizações operam:

MAINFRAME E CLOUD.

Cada plataforma resolve determinado conjunto de problemas.

Kubernetes pode executar:

frontends
microsserviços
APIs
workers
integrações
serviços stateless

IBM Z pode continuar executando:

core banking
pagamentos
contabilidade
CICS
IMS
Db2
batch crítico
regras centrais

APIs conectam os dois universos.


O mistério dos microsserviços

Watson encontra uma API REST.

— Holmes! Descobri um microsserviço!

Holmes olha para o backend:

REST
 |
 v
z/OS Connect
 |
 v
Programa COBOL de 400 mil linhas

— Não, Watson.

REST não significa automaticamente microsserviço.

Um monólito pode expor APIs.

Um microsserviço pode nem sequer usar REST.

Arquitetura de microsserviços envolve características como:

  • autonomia;

  • limites funcionais;

  • implantação independente;

  • ownership;

  • domínio;

  • resiliência;

  • governança distribuída.

Colocar:

/api

na frente de uma aplicação não transforma automaticamente sua arquitetura.

E isso nem sempre é problema.

Monólitos bem estruturados podem ser excelentes.

A pergunta deveria ser:

O sistema atende adequadamente os requisitos?

Não:

Ele parece suficientemente moderno numa apresentação?


Passo a passo mental para estudar z/OS Connect

Agora vamos montar o nosso roteiro de investigador.

Sempre que você olhar uma arquitetura, comece identificando cinco personagens.

1. Quem chama?

Pode ser:

Mobile
Web
Java
Python
Node.js
Kubernetes
Parceiro
SaaS
COBOL

Esse é o consumer.


2. Qual é a API?

Pergunte:

Qual endpoint?
Qual método?
Qual request?
Qual response?
Qual autenticação?

Exemplo:

GET /accounts/{id}/balance

3. Quem executa a regra real?

Pode ser:

CICS
IMS
COBOL
Db2
outra aplicação z/OS

Esse é o backend.


4. Como os dados são transformados?

Exemplo:

JSON
 |
 v
accountId = "123456"
 |
 v
estrutura COBOL
 |
 v
PIC 9(06)

E no retorno:

COMP-3
 |
 v
transformação
 |
 v
JSON number

5. Como a identidade atravessa o caminho?

Pergunte:

Quem é o usuário?
Qual token?
Qual credencial?
Como chega ao z/OS?
Qual autorização existe?

6. Como diagnostico problemas?

Pergunte:

Onde vejo logs?
Como correlaciono chamadas?
Como meço latência?
Como encontro falhas?
Como identifico backend lento?

Se você consegue responder essas seis perguntas, já deixou de apenas “usar uma ferramenta”.

Começou a entender arquitetura.


Exemplo completo: o caso da conta desaparecida

Recebemos uma chamada:

GET /accounts/123456/balance

O consumidor espera:

{
  "balance": 4200.75
}

Fluxo:

Mobile
 |
 v
API Gateway
 |
 v
z/OS Connect
 |
 v
CICS transaction
 |
 v
COBOL
 |
 v
Db2

COBOL executa:

EXEC SQL
   SELECT BALANCE
     INTO :WS-BALANCE
     FROM ACCOUNT
    WHERE ACCOUNT_ID = :WS-ACCOUNT-ID
END-EXEC.

Agora imagine:

SQLCODE = +100

Não encontrado.

No velho mundo, talvez você apresentasse:

ACCOUNT NOT FOUND

No mundo HTTP, podemos mapear semanticamente para:

HTTP 404

com:

{
  "error": "ACCOUNT_NOT_FOUND"
}

Observe novamente a tradução de paradigmas.

Db2 fala:

SQLCODE +100

CICS/COBOL entende sua lógica.

HTTP fala:

404

O consumidor moderno entende JSON.

O papel da arquitetura é fazer esses mundos conversarem sem destruir as características de cada um.


Curiosidade: interfaces mudam muito mais rápido que regras de negócio

Isso explica por que sistemas legados permanecem durante décadas.

Imagine uma regra:

SE SALDO + LIMITE >= VALOR
   AUTORIZAR TRANSAÇÃO

Ela pode existir desde 1995.

Enquanto a interface já passou por:

terminal
cliente-servidor
web
SOAP
mobile
REST
app
cloud

A regra mudou pouco.

A interface mudou seis vezes.

Isso explica uma ideia importantíssima em arquitetura:

isole aquilo que muda daquilo que permanece.

z/OS Connect ajuda justamente a separar:

regra central

de:

forma de acesso.

O antipadrão mais perigoso: API arqueológica

Imagine simplesmente pegar todas as transações antigas e expô-las diretamente:

TRN1 -> /trn1
TRN2 -> /trn2
TRN3 -> /trn3
TRN4 -> /trn4

Tecnicamente funciona.

Arquiteturalmente talvez seja um desastre.

Uma API deveria representar conceitos compreensíveis para consumidores.

Prefira coisas como:

/accounts
/customers
/payments
/cards

em vez de simplesmente publicar detalhes internos do CICS.

Porque se a API refletir profundamente a implementação interna, você cria acoplamento.

E então a suposta modernização apenas colocou JSON sobre a arquitetura antiga.

Holmes chamaria isso de:

o velho suspeito usando bigode falso.


Performance não desaparece porque usamos JSON

Outro erro comum é imaginar que APIs tornam performance um problema “do middleware”.

Não.

Cada request possui custo.

Podemos imaginar:

tempo total =
rede
+ TLS
+ gateway
+ processamento z/OS Connect
+ chamada CICS
+ execução COBOL
+ Db2
+ serialização
+ retorno

Se sua aplicação gerar:

20 requests

para cada usuário, e houver:

100.000 usuários simultâneos

a matemática rapidamente fica interessante.

Portanto, pense sempre em:

TPS
latência
concorrência
payload
CPU
conexões
timeouts
retries

O famoso velho mainframe continua cobrando aluguel por ciclo de CPU. 😄


Retry: o pequeno detalhe que pode duplicar dinheiro

Imagine:

POST /payments

O cliente envia uma transferência.

O backend processa.

Mas a resposta HTTP se perde.

O consumidor pensa:

Não funcionou.

Então faz retry.

Se o design não for cuidadoso, você pode executar a transferência duas vezes.

Por isso APIs transacionais precisam pensar em conceitos como:

idempotência
transaction IDs
correlation IDs
controle de duplicidade

Exemplo:

X-Transaction-ID: ABC123XYZ

O backend pode registrar:

ABC123XYZ já processada.

Isso é um excelente exemplo de como integração aparentemente simples toca profundamente em engenharia transacional.

O programador CICS veterano provavelmente sorrirá:

“Vocês acabaram de redescobrir problemas que resolvemos há quarenta anos.”

Sim.

Cloud-native frequentemente descobre que o velho mainframe já conhecia alguns monstros.

Apenas lhes dava outros nomes.


Easter egg nº 3: “Elementary, my dear Watson”

A frase mais associada a Sherlock Holmes:

“Elementary, my dear Watson.”

Curiosamente não aparece exatamente dessa forma nos contos originais de Arthur Conan Doyle.

É uma construção popularizada posteriormente.

Isso combina perfeitamente com tecnologia.

Várias “verdades históricas” de TI também se repetem até parecerem fatos:

Mainframe vai acabar.

COBOL vai desaparecer.

Batch é ultrapassado.

Tudo será cloud.

Tudo será microsserviço.

Décadas passam.

O mainframe continua processando.

COBOL continua executando.

Batch continua fechando o dia.

E alguém coloca Kubernetes na frente de tudo.


z/OS Connect como tradutor entre gerações

Talvez esta seja a melhor forma de compreender a tecnologia.

Imagine três gerações.

Geração 1

3270
CICS
COBOL
VSAM
Db2

Geração 2

Java
Web
SOAP
Application Servers

Geração 3

REST
JSON
OpenAPI
Cloud
Kubernetes
Mobile

Uma empresa raramente substitui uma geração inteira pela seguinte.

Ela acumula camadas.

Logo temos:

Mobile
   |
Cloud
   |
REST
   |
z/OS Connect
   |
CICS
   |
COBOL
   |
Db2

E isso não é necessariamente feio.

Pode ser exatamente a arquitetura apropriada.


A grande lição para o programador COBOL iniciante

Se você está começando agora em COBOL, existe uma tentação perigosa.

Pensar:

Preciso aprender apenas COBOL.

Não.

Aprenda COBOL profundamente.

Mas aprenda também o mundo ao redor.

Entenda:

HTTP
REST
JSON
OpenAPI
APIs
TLS
OAuth
JWT
CICS
Db2
MQ
Git
CI/CD
containers
Kubernetes

Você não precisa se transformar em especialista em tudo.

Mas precisa entender como essas peças se encaixam.

Porque o profissional COBOL mais valioso não será necessariamente aquele que memoriza mais verbos da linguagem.

Será aquele que consegue olhar:

React
 |
API
 |
z/OS Connect
 |
CICS
 |
COBOL
 |
Db2

e compreender a transação inteira.

Esse profissional consegue conversar com:

dev web
arquiteto
sysprog
DBA
segurança
cloud
CICS admin
negócio

Ele se torna uma ponte humana entre tecnologias.

E pontes são valiosas quando existem dois mundos que precisam conversar.


O último diálogo em Baker Street

Watson fecha o notebook.

— Então conseguimos transformar nosso sistema COBOL em um sistema moderno?

Holmes balança a cabeça.

— Não exatamente.

— Não?

— O sistema já era moderno para o problema que resolvia.

Watson franze a testa.

Holmes continua:

— Apenas ensinamos o resto do mundo a conversar com ele.

No monitor aparece:

GET /accounts/123456/balance

A chamada atravessa HTTPS.

Passa pela camada de APIs.

Chega ao z/OS Connect.

Entra no CICS.

Executa COBOL.

Consulta Db2.

Volta.

{
  "balance": 7250.00
}

O smartphone exibe:

Saldo disponível: R$ 7.250,00

Em algum lugar abaixo de milhares de camadas de software, um programa COBOL executa:

MOVE WS-SALDO TO CA-SALDO.

Ninguém no celular sabe.

Ninguém precisa saber.

Holmes sorri.

— Elementary, Watson.

— O quê?

— Modernização não significa demolir a mansão.

Holmes aponta para a tela.

— Às vezes basta instalar uma porta nova.

E talvez essa seja a melhor definição informal de z/OS Connect para quem vem do mundo COBOL:

uma porta moderna instalada em uma casa que continua sendo extraordinariamente boa em guardar as coisas mais valiosas da empresa.

No mundo do Bellacosa Mainframe, Watson finalmente aprende a regra:

LEGADO + API != LEGADO DISFARÇADO

LEGADO + BOA ARQUITETURA
        =
CAPACIDADE REUTILIZADA

E quando algum consultor aparecer dizendo:

“Precisamos reescrever tudo.”

Não discuta.

Pegue a lupa.

Pergunte:

Qual é o problema real?

É a regra?

É a plataforma?

É a interface?

É a integração?

É performance?

É custo?

É competência?

Ou alguém simplesmente confundiu
idade com obsolescência?

Sherlock Holmes aprovaria.

O velho sysprog também.

E o COBOL?

O COBOL continuará rodando enquanto todos terminam a reunião.

☕🔎🖥️

🎭 Os Estereótipos do Japão em Anime — Espelhos Culturais de uma Sociedade Silenciosa

 

Bellacosa Mainframe e os personagens estereotipados dos animes

🎭 Os Estereótipos do Japão em Anime — Espelhos Culturais de uma Sociedade Silenciosa

Por Bellacosa Mainframe — Cultura, Código e Consciência


🏯 1. O Estudante Dedicado — O Peso da Perfeição

Símbolo de: esforço, disciplina, expectativa social
Personagens:

  • Shinji Ikari (Evangelion)

  • Light Yagami (Death Note)

  • Deku (My Hero Academia)

  • Hinata Hyuga (Naruto)

O Japão vê o sucesso acadêmico como a primeira prova de valor social.
Esses personagens vivem sob a lógica do ganbaru (esforçar-se até o limite), carregando a culpa de falhar e o medo de decepcionar.

Por trás do sorriso estudioso, há insônia, solidão e autoexigência.
É o reflexo da juventude japonesa que aprende cedo que nota baixa é pecado social.

🧩 Curiosidade: o Japão tem uma das maiores taxas de suicídio juvenil entre países desenvolvidos — muitos casos ligados à pressão escolar.


💼 2. O Salaryman — O Samurai Corporativo

Símbolo de: lealdade, sacrifício e obediência
Personagens:

  • Gendou Ikari (Evangelion)

  • Retsuko e seus colegas (Aggretsuko)

  • Tanaka (Tanaka-kun wa Itsumo Kedaruge)

O salaryman é o herdeiro moderno do bushido, o código dos samurais — mas agora sua espada é um crachá.
Ele trabalha, bebe e dorme para a empresa.
Nos animes, é retratado como figura ausente, fria ou submissa ao sistema — símbolo do colapso da individualidade.

💬 Bellacosa insight: o salaryman é o “mainframe humano” — confiável, mas incapaz de se desligar.


🎓 3. A Colegial Idealizada — Pureza e Repressão

Símbolo de: inocência, conformismo, beleza idealizada
Personagens:

  • Asuka Langley Soryu (Evangelion)

  • Mikasa Ackerman (Attack on Titan)

  • Sailor Moon (Bishoujo Senshi Sailor Moon)

O uniforme colegial (seifuku) virou ícone mundial.
Mas por trás da estética fofa há um controle cultural sobre a feminilidade.
A colegial é vista como símbolo de pureza, mas ao mesmo tempo fetichizada pela sociedade adulta.

🪞 É o paradoxo do Japão moderno: um país que venera a juventude e teme a mulher madura.


👓 4. O Gênio Solitário — A Inteligência como Escudo

Símbolo de: isolamento, superioridade, incapacidade emocional
Personagens:

  • L (Death Note)

  • Shouko Nishimiya (A Silent Voice)

  • Armin Arlert (Attack on Titan)

No Japão, ser inteligente é virtude — mas exibir emoção é fraqueza.
Esses personagens mostram o preço da genialidade: solidão e desconexão emocional.
Eles vivem o honne e o tatemae em sua forma extrema: por dentro gritam, por fora calculam.

💡 Bellacosa insight: a mente brilhante no Japão é admirada, mas raramente compreendida.


🕶️ 5. O Delinquente com Coração — Rebeldia com Código

Símbolo de: resistência ao sistema, masculinidade alternativa
Personagens:

  • Yusuke Urameshi (Yu Yu Hakusho)

  • Onizuka (Great Teacher Onizuka)

  • Hanagaki Takemichi (Tokyo Revengers)

O yankii (delinquente escolar) é o anti-salaryman: caótico, emocional, espontâneo.
Ele desafia regras, mas tem seu próprio código de honra.
Em um país que prega obediência, ele representa o espírito livre que o Japão tenta conter.

💥 Curiosidade: o movimento bosozoku (gangues de motoqueiros dos anos 80–90) inspirou diretamente esses personagens.


🧘 6. A Menina Misteriosa — O Silêncio como Linguagem

Símbolo de: introspecção, trauma, repressão emocional
Personagens:

  • Rei Ayanami (Evangelion)

  • Homura Akemi (Madoka Magica)

  • Yuki Nagato (The Melancholy of Haruhi Suzumiya)

Ela fala pouco, mas sente muito.
O Japão admira o autocontrole e o silêncio — e essas personagens refletem a beleza da contenção emocional.
São metáforas da alma japonesa: calmas por fora, em tempestade por dentro.

🧩 Bellacosa insight: o silêncio japonês não é vazio — é a forma mais elegante de dizer “não posso dizer”.


🍶 7. O Sensei — A Autoridade Benevolente (ou Tóxica)

Símbolo de: hierarquia, respeito e poder emocional
Personagens:

  • Jiraiya (Naruto)

  • Koro-sensei (Assassination Classroom)

  • Gojo Satoru (Jujutsu Kaisen)

O sensei é o guia, o modelo — mas também pode ser o vilão.
Representa o respeito quase sagrado à autoridade no Japão, mas também o perigo do poder não questionado.
Nos animes modernos, o sensei é humano: falha, erra e às vezes carrega o peso de um sistema ultrapassado.

💬 Bellacosa insight: o verdadeiro sensei é o que ensina a pensar, não o que exige obediência.


🎮 8. O NEET / Hikikomori — A Fuga do Mundo

Símbolo de: desilusão, alienação social, resistência passiva
Personagens:

  • Satou Tatsuhiro (Welcome to the NHK)

  • Kazuma Satou (KonoSuba)

  • Subaru Natsuki (Re:Zero)

São os “filhos do colapso econômico”.
Desistem da vida corporativa e se isolam do mundo real —
mas o anime lhes dá mundos alternativos, onde podem existir sem culpa.

Bellacosa insight: o isekai é a fuga digital do hikikomori — o sonho de viver onde o fracasso é ressignificado como aventura.


🌸 Conclusão Bellacosa — O Japão e Suas Máscaras

Os estereótipos dos animes não são caricaturas — são interfaces sociais.
Cada personagem é uma máscara cultural (tatemae) que esconde um grito silencioso (honne).

Por isso, o anime emociona: porque sob o brilho dos olhos gigantes, o Japão confessa o que nunca diria em voz alta.

“Trabalhamos demais, amamos pouco, obedecemos muito.
Mas ainda sonhamos.”

E talvez seja esse o segredo do sucesso global do anime:
ele traduz para o mundo o que o Japão sente, mas não fala.

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...