Translate

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

domingo, 15 de março de 2026

🔥 z/OS NÃO É CPU: O Poder Invisível Que Realmente Move o Mainframe (E Quase Ninguém Explica)

 

Bellacosa Mainframe apresenta o misterio do Storage Mainframe

🔥 z/OS NÃO É CPU: O Poder Invisível Que Realmente Move o Mainframe (E Quase Ninguém Explica)

⚠️ Se você acha que mainframe é “uma CPU gigante processando COBOL”… prepare-se para um pequeno choque de realidade.


🧙‍♂️ Padawan, aproxime-se…

Todo iniciante em mainframe passa por um momento de revelação.

No começo, você pensa:

“Quanto mais CPU, mais rápido.”

Depois vem o primeiro relatório de performance…

E aparece um número misterioso:

IOSQ = 37 ms

Ou pior:

DEVICE BUSY
PEND TIME ALTO

E então alguém experiente murmura:

“Isso não é CPU… é I/O.”

Bem-vindo ao lado invisível da Força.


🏛️ A Grande Mentira do Mundo Distribuído

No universo x86, a narrativa dominante é:

Performance = CPU + RAM

IBM Z como funciona a Performance


No IBM Z, a equação real é:

Performance = Addressability + I/O Architecture + Workload Management

CPU muitas vezes é só o maestro.

Quem toca a sinfonia são:

  • IOS

  • Channel Subsystem

  • Storage

  • Dispatching

  • Memory Architecture

  • PAV / HyperPAV

  • WLM / IRD


🧬 O Segredo Nº1: O mainframe NÃO espera I/O

Em sistemas comuns:

Fluxo de uso de memoria no X86


Programa → lê disco → espera → continua

Fluxo de uso da memoria no Mainframe


No z/OS:

Programa → delega I/O → CPU faz outra coisa

Quem assume o trabalho pesado?

👉 SAP — System Assist Processor
👉 Channel Subsystem
👉 Control Units
👉 Storage microcode

A CPU volta só quando o dado está pronto.

Isso é computação de alta eficiência em escala industrial.


🚀 Dispatching: O Coração Pulsante

Durante o IPL e ao longo da execução, o sistema escolhe quem roda a cada instante.

Unidades de trabalho:

  • TCB — Task Control Block (tarefas “normais”)

  • SRB — Service Request Block (tarefas super rápidas do kernel)

O dispatcher faz algo extraordinário:

troca contexto
aloca CPU
preserva estado
mantém isolamento

Tudo em microssegundos.

Curiosidade histórica:

O z/OS herdou conceitos do MVS dos anos 70 — e ainda assim continua décadas à frente em escalabilidade.


🧠 Addressability: O Poder que Quase Ninguém Entende

Padawan, aqui está o verdadeiro tesouro.

Cada programa roda em um Address Space isolado.

Mas o sistema permite acessar outros espaços de forma controlada.

Isso é feito por:

  • Cross-memory services

  • Program Call (PC)

  • Access Registers

  • ALESERV

  • Linkage Stack


🌀 Program Call: Visitando Outro Universo

Um programa pode executar código em outro address space sem copiar dados.

É como:

“Ir à casa do vizinho, usar o videogame dele e voltar.”

Com segurança de nível militar.


🧩 Linkage Stack: O Guardião do Retorno

Toda chamada salva automaticamente:

  • PSW

  • Registradores

  • Estado de execução

Sem precisar de save areas manuais.

Simplesmente elegante.


🔐 Access Registers: Chaves Dimensionais

Permitem que um programa acesse múltiplos espaços simultaneamente.

Não é apenas virtual memory.

É multi-universo controlado por hardware.


📦 Data Spaces e Hiperspaces: Memória Além da Memória

Antes do addressing de 64 bits, engenheiros criaram:

  • Data Spaces — áreas enormes de dados

  • Hiperspaces — armazenamento ultrarrápido fora do espaço principal

Hoje ainda aparecem em código legado.

E funcionam absurdamente bem.


⚡ O Verdadeiro Monstro: O I/O Supervisor (IOS)

IBM Mainframe I/OS Supervisor


O IOS é o general das operações de entrada/saída.

Fluxo típico:

Aplicação

IOS

ORB criado

SSCH (Start Subchannel)

Channel Subsystem

Control Unit

Device

🧱 ORB, CCW e SCHIB — A Trindade do I/O

ORB — Operation Request Block

Define o pedido de I/O.

CCW — Channel Command Word

Comandos que o dispositivo executará.

SCHIB — Subchannel Information Block

Informações de caminhos e status.


🛣️ Dynamic Path Selection: GPS do Storage

O sistema escolhe automaticamente o melhor caminho até o device.

Se um estiver congestionado:

usa outro

Sem intervenção humana.


🔥 PAV e HyperPAV: Quando um Disco Não Basta

Antigamente:

1 volume → 1 operação por vez

Hoje:

👉 PAV cria aliases para paralelismo
👉 HyperPAV usa pool dinâmico
👉 SuperPAV ultrapassa limites de control unit

Resultado:

múltiplos I/Os simultâneos

🐹 IOSQ Alto: O Hamster Está Cansado

IOSQ = tempo esperando na fila do dispositivo.

Se alto:

  • contenção de volume

  • falta de aliases

  • workload concentrado

  • gargalo de storage

É o equivalente mainframe de:

“CPU está idle, mas tudo continua lento.”


⚡ zHPF: Menos Conversa, Mais Trabalho

Arquitetura clássica:

vários CCWs
várias interações

zHPF:

Transport Mode
TCW único
menos overhead

Ideal para workloads com milhões de pequenos I/Os.


🌌 zHyperLink: Hiperespaço do Storage

Conexão direta ultrarrápida com DS8000.

Latência:

FICON → centenas de microssegundos
zHyperLink → dezenas

Projetado especialmente para DB2.


🧠 IRD: O Maestro Invisível

O Intelligent Resource Director move recursos entre LPARs automaticamente:

  • CPU weights

  • Channel paths

  • Prioridades

Tudo baseado nas metas do WLM.

Sem reboot. Sem intervenção.


🧪 Easter Egg para Padawans Observadores

Se você olhar um dump real de SOC4 e conseguir identificar:

  • registrador base incorreto

  • endereço inválido

  • PSW no momento da falha

Parabéns.

Você já começou a ver a Matrix do z/OS.


🏁 Moral da História

O IBM Z não é poderoso por causa da CPU.

Ele é poderoso porque:

👉 Nunca para
👉 Nunca desperdiça ciclos
👉 Paraleliza tudo
👉 Isola tudo
👉 Gerencia recursos como um organismo vivo


💬 Frase para guardar na memória

O mainframe não é um computador rápido — é um sistema que evita ser lento.


🔮 Próximo Nível

Quando você realmente entender:

  • Addressability

  • Cross-memory

  • IOS

  • Channel Subsystem

  • Storage architecture

Você perceberá algo assustador:

O z/OS não executa programas… ele orquestra universos isolados cooperando.

https://www.linkedin.com/pulse/zos-n%C3%A3o-%C3%A9-cpu-o-poder-invis%C3%ADvel-que-realmente-move-e-quase-bellacosa 

 





sexta-feira, 7 de junho de 2024

CICS REST: O Policial Cibernético das APIs Corporativas

 

Bellacosa Mainframe e o cics rest uma improvavel uniao a ser investigada

☕ Um Café no Bellacosa Mainframe

CICS REST: O Policial Cibernético das APIs Corporativas

Quando um Programador COBOL Descobre que o CICS Pode Patrulhar HTTP, Interrogar JSON e Entregar a COMMAREA Viva ou Morta

Detroit, futuro próximo.

A cidade está mergulhada no caos digital. Aplicativos móveis exigem respostas em milissegundos. Microsserviços atravessam nuvens públicas e privadas. APIs aparecem em cada esquina. Contêineres fogem pelas avenidas do Kubernetes. Mensagens JSON circulam sem documento, sem copybook e, às vezes, sem qualquer respeito pelo contrato de dados.

No subsolo de uma grande corporação financeira, porém, existe uma máquina que nunca dorme.

Ela não usa capa.
Não pilota um Batmóvel.
Não fala em promessas vazias de transformação digital.

Ela executa transações.

Seu nome é CICS Transaction Server.

Durante décadas, ele patrulhou os corredores do processamento corporativo, protegendo contas bancárias, seguradoras, companhias aéreas, governos, cartões de crédito, estoques e sistemas industriais. Agora, diante da invasão das APIs REST, recebeu uma nova diretiva:

Servir o público, proteger a lógica de negócio e fazer o JSON obedecer ao copybook.

Bem-vindo, jovem programador COBOL, ao distrito mais movimentado do IBM Z.

Hoje veremos como um programa COBOL tradicional, acostumado a receber dados por COMMAREA ou CHANNEL, pode ser exposto como uma API REST moderna sem precisar ser completamente reescrito.

Prepare o café. Ajuste o terminal 3270. Verifique o CEMT. O suspeito está chegando pela porta TCP/IP.


Diretiva Primária: compreender o problema

Antes de falarmos sobre recursos CICS, precisamos entender o conflito central.

Um programa COBOL tradicional não conhece naturalmente conceitos como:

  • URL;

  • HTTP;

  • HTTPS;

  • JSON;

  • cabeçalhos;

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

  • códigos de status como 200, 400, 404 e 500;

  • autenticação por token;

  • chamadas originadas por aplicativos móveis.

O programa COBOL normalmente conhece estruturas fixas de dados.

Por exemplo:

01  WS-CLIENTE-REQUEST.
    05 WS-AGENCIA          PIC 9(4).
    05 WS-CONTA            PIC 9(8).
    05 WS-DIGITO           PIC X.

Ele espera receber bytes em posições previamente definidas.

A agência ocupa quatro posições.
A conta ocupa oito.
O dígito ocupa uma.

Não há chaves, aspas, vírgulas nem nomes de propriedades circulando em tempo de execução.

Já uma aplicação web moderna envia algo parecido com:

{
  "agencia": 1234,
  "conta": 87654321,
  "digito": "9"
}

Para um desenvolvedor JavaScript, isso parece natural.

Para um programa COBOL antigo, esse JSON é praticamente um criminoso não identificado entrando na delegacia sem documento.

Alguém precisa fazer a identificação, separar cada campo, validar formatos, converter números e entregar os dados exatamente na posição esperada.

Esse alguém é o CICS.


A unidade especial de tradução do CICS

O CICS atua como uma camada intermediária inteligente entre o cliente REST e a aplicação tradicional.

O fluxo básico é:

Cliente externo
      ↓
HTTP ou HTTPS
      ↓
TCPIPSERVICE
      ↓
URIMAP
      ↓
PIPELINE
      ↓
JSON Handler
      ↓
COMMAREA ou CHANNEL
      ↓
Programa COBOL

Na resposta, o caminho é invertido:

Programa COBOL
      ↓
COMMAREA ou CHANNEL
      ↓
JSON Handler
      ↓
JSON
      ↓
Resposta HTTP
      ↓
Cliente externo

O ponto fundamental é este:

O programa COBOL não precisa compreender o documento JSON original.

Ele recebe uma estrutura de dados tradicional, preparada pelo CICS.

Assim, a lógica de negócio pode continuar fazendo aquilo que sempre fez:

  • consultar Db2;

  • ler VSAM;

  • calcular juros;

  • validar saldo;

  • verificar limites;

  • emitir autorizações;

  • atualizar cadastros;

  • registrar auditoria;

  • controlar uma unidade lógica de trabalho.

O CICS cuida do protocolo moderno.
O COBOL cuida do negócio.

Essa separação de responsabilidades é uma das maiores virtudes da arquitetura.


Cena 1: o cliente externo chega à cidade

No topo do fluxo temos o consumidor da API.

Ele pode ser:

  • um aplicativo Android;

  • um aplicativo iOS;

  • um portal web;

  • um sistema Java;

  • um serviço Python;

  • um microsserviço no OpenShift;

  • uma aplicação hospedada em AWS, Azure ou IBM Cloud;

  • uma plataforma de integração;

  • o IBM API Connect;

  • outro sistema mainframe;

  • uma ferramenta de testes como Postman ou curl.

O cliente pode enviar uma requisição como:

POST /api/v1/transferencias
Content-Type: application/json

Corpo:

{
  "contaOrigem": 10012345,
  "contaDestino": 20098765,
  "valor": 250.75
}

Do ponto de vista do cliente, ele está chamando uma API REST comum.

Ele não precisa saber:

  • em qual LPAR o CICS está;

  • se o programa foi escrito em COBOL;

  • se os dados estão em Db2 ou VSAM;

  • se a transação utiliza COMMAREA;

  • se existe um programa com 30 anos de produção;

  • se o serviço participa de uma unidade de trabalho protegida por syncpoint.

Essa transparência é valiosa.

Para a aplicação moderna, o mainframe aparece como um provedor de serviços corporativos.


Cena 2: TCPIPSERVICE, o portão blindado

O primeiro recurso CICS relevante é o TCPIPSERVICE.

Pense nele como o portão de entrada do distrito.

Ele define onde o CICS escutará conexões TCP/IP.

Entre suas responsabilidades estão:

  • porta de escuta;

  • protocolo utilizado;

  • suporte a HTTP ou HTTPS;

  • configuração de SSL/TLS;

  • associação com parâmetros de segurança;

  • controle da entrada de conexões.

Exemplo conceitual:

Porta: 8443
Protocolo: HTTP
SSL: habilitado
Status: aberto

Quando o cliente chama:

https://api.empresa.com:8443/api/v1/saldo

a conexão chega ao TCPIPSERVICE correspondente.

Sem TCPIPSERVICE ativo, ninguém entra.

É como tentar apresentar uma denúncia em uma delegacia cujo portão está fechado.

Dica Bellacosa

Quando um serviço não responde, não comece imediatamente alterando o COBOL.

Verifique primeiro:

  1. O TCPIPSERVICE está instalado?

  2. Está habilitado?

  3. Está escutando na porta correta?

  4. Existe firewall bloqueando?

  5. O certificado TLS é válido?

  6. O host e a porta da chamada estão corretos?

Muitos “erros do programa” são, na verdade, problemas anteriores ao programa.

O suspeito sequer chegou à sala de interrogatório.


Cena 3: URIMAP, o reconhecimento facial das URLs

Depois que a requisição entra no CICS, é necessário descobrir qual serviço deve tratá-la.

Essa é uma das funções do URIMAP.

O URIMAP relaciona um padrão de URI a um recurso ou fluxo CICS.

Por exemplo:

/api/v1/clientes/*

ou:

/api/v1/saldos/*

Ele funciona como uma tabela de encaminhamento.

Quando chega:

GET /api/v1/clientes/12345

o CICS verifica qual URIMAP corresponde àquele endereço.

Em termos conceituais:

URI recebida
      ↓
Comparação com URIMAPs
      ↓
Seleção do pipeline ou serviço

O URIMAP também pode ajudar a separar versões:

/api/v1/clientes
/api/v2/clientes

Isso é importante porque APIs evoluem.

Talvez a versão 1 retorne:

{
  "nome": "MURPHY"
}

e a versão 2 retorne:

{
  "nomeCompleto": "ALEX MURPHY",
  "status": "ATIVO"
}

Manter versões evita que uma mudança destrua consumidores antigos.

Curiosidade investigativa

Em arquiteturas web como Spring Boot, rotas podem ser definidas com anotações:

@GetMapping("/clientes/{id}")

No CICS, o conceito de roteamento aparece por meio de recursos como URIMAP, pipelines e handlers.

A tecnologia muda.
A necessidade arquitetural permanece.

Alguém sempre precisa decidir quem atende cada endereço.


Cena 4: PIPELINE, a linha de processamento

O PIPELINE é a linha de montagem que conduz a mensagem pelos componentes necessários.

Imagine uma esteira industrial da Omni Consumer Products, mas sem o protótipo ED-209 disparando contra os programadores durante a reunião.

A requisição passa por estágios:

HTTP
  ↓
Identificação do serviço
  ↓
Tratamento da mensagem
  ↓
Conversão do JSON
  ↓
Chamada da aplicação
  ↓
Conversão da resposta

O pipeline não é apenas uma “seta” no desenho.

Ele representa a infraestrutura que organiza o processamento da mensagem.

Dependendo da configuração, podem existir etapas relacionadas a:

  • transformação de dados;

  • validação;

  • segurança;

  • tratamento de cabeçalhos;

  • seleção de handlers;

  • geração da resposta;

  • registro de erros.

É importante não confundir o pipeline com o programa de negócio.

O pipeline é a rota operacional.
O programa COBOL é o policial que executa a investigação.


Cena 5: o JSON Handler interroga a mensagem

O cliente envia:

{
  "codigoCliente": 4711,
  "valor": 850.25,
  "moeda": "BRL"
}

O programa COBOL espera:

01  WS-REQUEST.
    05 WS-CODIGO-CLIENTE   PIC 9(8).
    05 WS-VALOR            PIC S9(9)V99 COMP-3.
    05 WS-MOEDA            PIC X(3).

Essas representações não são iguais.

O JSON representa números e textos de forma lógica.

O COBOL pode representar números em:

  • display;

  • binário;

  • packed decimal;

  • COMP;

  • COMP-3;

  • campos com sinal;

  • casas decimais implícitas.

O JSON Handler realiza a tradução entre esses formatos.

Exemplo:

"valor": 850.25

pode ser convertido para um campo:

PIC S9(9)V99 COMP-3

O programa recebe o valor na forma adequada para o processamento COBOL.

Na resposta ocorre o contrário.

Se o programa devolver:

WS-SALDO PIC S9(9)V99 COMP-3 VALUE 150075

considerando as casas decimais implícitas, o handler poderá produzir:

{
  "saldo": 1500.75
}

A conversão exige regras.

Essas regras são geradas a partir da definição das estruturas.

E aqui entram os assistentes do CICS.


DFHLS2JS e DFHJS2LS: a reconstrução cibernética dos dados

Dois nomes aparecem frequentemente quando estudamos JSON no CICS:

  • DFHLS2JS

  • DFHJS2LS

À primeira vista, parecem números de série de unidades mecanizadas da polícia de Detroit.

Mas são utilitários fundamentais.

DFHLS2JS

O nome pode ser lido como:

Language Structure to JSON

Ou seja:

Estrutura de linguagem
        ↓
Definição JSON

Você fornece uma estrutura COBOL, PL/I ou outra linguagem suportada.

O utilitário gera artefatos que permitem mapear aquela estrutura para JSON.

Por exemplo, a partir de:

01  CLIENTE-RESPONSE.
    05 CLIENTE-ID          PIC 9(8).
    05 CLIENTE-NOME        PIC X(40).
    05 CLIENTE-SALDO       PIC S9(9)V99 COMP-3.

pode ser criada uma representação lógica equivalente a:

{
  "clienteId": 12345678,
  "clienteNome": "ALEX MURPHY",
  "clienteSaldo": 4900.50
}

DFHJS2LS

O sentido principal é:

JSON to Language Structure

Ele parte de uma definição JSON e gera estruturas ou mapeamentos adequados para a linguagem.

Isso é útil quando o contrato JSON já existe e a aplicação CICS precisa se adaptar a ele.

Portanto, existem dois caminhos de desenvolvimento.

Caminho bottom-up

Você já possui o programa COBOL e o copybook.

Parte da estrutura existente e gera a interface JSON.

Copybook COBOL
       ↓
DFHLS2JS
       ↓
Artefatos JSON e binding

Caminho top-down

Você já possui o contrato JSON ou o desenho da API.

Parte do contrato e gera uma estrutura de linguagem correspondente.

Definição JSON
       ↓
DFHJS2LS
       ↓
Estrutura COBOL e binding

A escolha depende de onde está a fonte da verdade.

Em sistemas legados, muitas vezes o copybook existente é o ponto de partida.

Em projetos API-first, o contrato JSON pode ser definido antes da implementação.


O arquivo de binding: a memória operacional

O web service binding file contém informações de mapeamento necessárias para que o CICS converta a mensagem.

Ele funciona como uma espécie de memória operacional da reconstrução.

Diz ao CICS, em essência:

  • qual campo JSON corresponde a qual campo COBOL;

  • como tratar tipos;

  • como converter representações;

  • como montar a estrutura de entrada;

  • como transformar a estrutura de saída.

Esse arquivo costuma ser armazenado no zFS, o sistema de arquivos UNIX do z/OS.

O CICS acessa os artefatos durante o processamento.

Atenção

O binding não é simplesmente documentação.

Ele participa efetivamente da execução.

Se houver inconsistência entre:

  • o copybook utilizado na geração;

  • o programa compilado;

  • o binding implantado;

o resultado pode ser desastroso.

Campos podem ser interpretados com tamanhos errados.
Valores podem chegar deslocados.
Conversões podem falhar.
O programa pode receber dados aparentemente válidos, mas incorretos.

Essa é uma ocorrência particularmente perigosa porque nem sempre provoca ABEND imediato.

Às vezes, o dado errado passa pela porta usando um crachá aparentemente válido.


COMMAREA ou CHANNEL: escolha seu compartimento

Depois da conversão, o CICS precisa entregar os dados à aplicação.

Dois modelos são comuns:

  • COMMAREA;

  • CHANNEL e CONTAINER.

COMMAREA

A COMMAREA é o método clássico.

Ela consiste em uma área contínua de memória passada entre programas ou transações.

Exemplo conceitual:

01 DFHCOMMAREA.
   05 CA-FUNCAO          PIC X.
   05 CA-CLIENTE         PIC 9(8).
   05 CA-STATUS          PIC X(2).

Vantagens:

  • simples;

  • conhecida por praticamente todos os programadores CICS;

  • amplamente utilizada;

  • adequada para estruturas pequenas e estáveis.

Limitações:

  • tamanho limitado;

  • uma única área linear;

  • maior dificuldade para mensagens complexas;

  • mudanças podem afetar offsets e compatibilidade.

A COMMAREA tradicional possui um limite próximo de 32 KB, associado ao tamanho permitido no modelo clássico de comunicação.

CHANNEL e CONTAINER

O CHANNEL organiza múltiplos containers.

Exemplo:

CHANNEL: API-CHANNEL

CONTAINER: REQUEST
CONTAINER: RESPONSE
CONTAINER: METADATA
CONTAINER: ERROR-INFO

Vantagens:

  • melhor organização;

  • suporte a volumes maiores;

  • separação lógica dos dados;

  • flexibilidade;

  • menor dependência de uma única estrutura monolítica.

Para novos desenhos, CHANNEL e CONTAINER costumam oferecer uma arquitetura mais limpa.

Contudo, não significa que toda COMMAREA deva ser imediatamente substituída.

A regra Bellacosa é:

Não modernize destruindo o que funciona. Modernize criando fronteiras melhores.

Se o programa existente funciona corretamente com COMMAREA, uma camada de exposição pode preservar essa interface.

Se uma nova aplicação estiver sendo criada, CHANNEL e CONTAINER merecem forte consideração.


Cena 6: o programa COBOL entra em ação

Após a conversão, o CICS chama o programa de aplicação.

Ele pode receber:

01  REQUEST-DATA.
    05 REQUEST-CONTA      PIC 9(8).
    05 REQUEST-VALOR      PIC S9(9)V99 COMP-3.

O programa executa sua lógica:

IF REQUEST-VALOR <= SALDO-DISPONIVEL
    MOVE '00' TO RESPONSE-CODE
    SUBTRACT REQUEST-VALOR
        FROM SALDO-ATUAL
ELSE
    MOVE '51' TO RESPONSE-CODE
END-IF

Observe que não há nenhuma instrução para interpretar JSON.

Não existe:

PARSE JSON MANUALMENTE

O código se concentra no domínio do negócio.

Esse é o objetivo.

Contudo, algumas versões modernas do Enterprise COBOL também oferecem recursos próprios para processamento JSON. Isso pode ser útil em certos cenários, mas não elimina necessariamente o valor da infraestrutura CICS de pipelines, assistentes e bindings.

Existem duas filosofias:

Conversão na infraestrutura

CICS converte
Programa recebe estrutura pronta

Conversão na aplicação

Programa recebe JSON
Programa executa JSON PARSE

Para exposição padronizada de serviços CICS, a conversão na infraestrutura costuma reduzir acoplamento e manter o programa focado no negócio.


Cena 7: a resposta sai patrulhando a rede

O programa preenche a estrutura de saída:

01  RESPONSE-DATA.
    05 RESPONSE-CODE      PIC X(2).
    05 RESPONSE-MESSAGE   PIC X(60).
    05 RESPONSE-BALANCE   PIC S9(9)V99 COMP-3.

Exemplo:

RESPONSE-CODE    = 00
RESPONSE-MESSAGE = TRANSFERENCIA APROVADA
RESPONSE-BALANCE = 3250.25

O JSON Handler converte para:

{
  "codigo": "00",
  "mensagem": "TRANSFERENCIA APROVADA",
  "saldo": 3250.25
}

O CICS então envia uma resposta HTTP.

Exemplo:

HTTP/1.1 200 OK
Content-Type: application/json

O cliente recebe a resposta sem saber quantas camadas corporativas participaram do processamento.

Mas aqui existe uma decisão importante:

Um código de negócio não é automaticamente um código HTTP.

Por exemplo:

Código 51 = saldo insuficiente

Isso não significa necessariamente:

HTTP 500

Saldo insuficiente é uma resposta válida da regra de negócio. O serviço funcionou corretamente.

Dependendo do contrato da API, pode ser retornado:

HTTP 422 Unprocessable Content

ou até:

HTTP 200 OK

com:

{
  "aprovado": false,
  "motivo": "SALDO_INSUFICIENTE"
}

A escolha depende do padrão arquitetural da organização.

Regra prática

  • Erro de formato enviado pelo cliente: 400 Bad Request;

  • credencial ausente ou inválida: 401 Unauthorized;

  • acesso proibido: 403 Forbidden;

  • recurso inexistente: 404 Not Found;

  • conflito de estado: 409 Conflict;

  • regra de negócio não processável: frequentemente 422;

  • falha inesperada no servidor: 500 Internal Server Error;

  • serviço temporariamente indisponível: 503 Service Unavailable.

Não transforme todo problema de negócio em erro técnico.

O ED-209 não precisa disparar porque o cliente digitou um código inválido.


Passo a passo de uma modernização controlada

Agora vamos construir um roteiro prático.

Passo 1: escolha uma operação pequena

Não comece expondo o fechamento contábil completo da empresa.

Escolha uma função simples e bem conhecida:

  • consultar cliente;

  • consultar saldo;

  • obter status;

  • listar produtos;

  • validar cadastro.

Operações de consulta são bons primeiros candidatos porque apresentam menor risco transacional.


Passo 2: localize o programa e sua interface

Descubra:

  • nome do programa;

  • transação associada;

  • copybook de entrada;

  • copybook de saída;

  • uso de COMMAREA ou CHANNEL;

  • tamanho dos dados;

  • chamadas a Db2, VSAM, MQ ou outros programas;

  • códigos de retorno;

  • requisitos de segurança.

Documente o contrato atual antes de criar o novo.

Modernização sem inventário é patrulhamento sem mapa.


Passo 3: higienize o copybook

Verifique:

  • campos redefinidos;

  • REDEFINES;

  • OCCURS DEPENDING ON;

  • campos binários;

  • packed decimal;

  • sinais;

  • campos filler;

  • nomes duplicados;

  • estruturas condicionais;

  • caracteres especiais;

  • campos de comprimento variável.

Nem toda estrutura COBOL antiga foi criada pensando em exposição externa.

Pode ser melhor criar um copybook de API separado.

Exemplo:

01 API-SALDO-REQUEST.
   05 API-CONTA          PIC 9(8).

01 API-SALDO-RESPONSE.
   05 API-CODIGO         PIC X(2).
   05 API-SALDO          PIC S9(9)V99 COMP-3.

Essa estrutura pode chamar internamente o programa legado.

Assim, você cria uma fachada estável.


Passo 4: defina o contrato REST

Decida:

GET /api/v1/contas/{conta}/saldo

Resposta:

{
  "conta": 12345678,
  "saldo": 1750.40,
  "moeda": "BRL"
}

Defina também:

  • campos obrigatórios;

  • tamanhos máximos;

  • valores permitidos;

  • formato de datas;

  • precisão decimal;

  • códigos HTTP;

  • mensagens de erro;

  • versão da API.

O copybook não deve ser publicado cegamente como contrato externo.

Um nome interno como:

WS-X9-COD-CLI-BASE

não é um bom nome de propriedade JSON.

Prefira algo compreensível:

"codigoCliente"

Passo 5: gere os artefatos

Use o assistente apropriado:

  • DFHLS2JS para partir da estrutura de linguagem;

  • DFHJS2LS para partir do JSON.

A geração pode produzir:

  • schemas;

  • bindings;

  • estruturas;

  • metadados de conversão;

  • arquivos de configuração.

Em muitos ambientes, o CICS Explorer facilita esse processo.

Um wizard pode criar um CICS Bundle a partir de um programa existente.

Isso reduz a necessidade de preparar manualmente todos os recursos e jobs.

Mas atenção:

Wizard não substitui entendimento.

Ele automatiza passos.
Não decide por você se o contrato da API é bom.


Passo 6: configure os recursos CICS

Você precisará garantir que os elementos estejam corretamente definidos e instalados:

  • TCPIPSERVICE;

  • URIMAP;

  • PIPELINE;

  • WEBSERVICE ou recursos relacionados;

  • diretórios no zFS;

  • bundle;

  • programa;

  • transação, quando aplicável;

  • segurança.

Use o CICS Explorer, definições CSD, bundles ou o método adotado pela organização.


Passo 7: teste com ferramentas externas

Teste primeiro fora da aplicação final.

Exemplo com curl:

curl -X POST \
  https://host.exemplo.com/api/v1/saldos \
  -H "Content-Type: application/json" \
  -d '{"conta":12345678}'

Valide:

  • status HTTP;

  • conteúdo da resposta;

  • headers;

  • tempo de resposta;

  • comportamento com dados inválidos;

  • campos ausentes;

  • números fora da faixa;

  • caracteres especiais;

  • falha do programa;

  • indisponibilidade de banco de dados.

Não teste apenas o caminho feliz.

Todo criminoso digital parece inocente quando recebe apenas dados perfeitos.


CICS como REST Requester: o policial também faz chamadas

Até agora vimos o CICS como service provider.

Ou seja:

Cliente externo chama o CICS

Mas o CICS também pode atuar como solicitante:

Programa CICS chama serviço externo

Imagine um programa COBOL que precise consultar:

  • cotação de moeda;

  • serviço antifraude;

  • validação de endereço;

  • geolocalização;

  • serviço de identidade;

  • API de parceiros;

  • serviço de nuvem;

  • motor de inteligência artificial corporativo.

O fluxo pode ser:

Programa COBOL
      ↓
CICS
      ↓
HTTP
      ↓
API externa
      ↓
Resposta JSON
      ↓
Conversão
      ↓
Estrutura COBOL

O CICS pode usar comandos e recursos de cliente HTTP para construir e enviar requisições.

Em cenários específicos, o programa pode trabalhar com:

  • EXEC CICS WEB OPEN;

  • EXEC CICS WEB CONVERSE;

  • EXEC CICS WEB SEND;

  • EXEC CICS WEB RECEIVE;

  • URIMAP do tipo cliente;

  • conexões TLS;

  • tratamento de headers.

A implementação exata depende da versão do CICS, da arquitetura e da estratégia adotada.

É importante entender que o lado requester não é simplesmente o diagrama provider virado ao contrário.

Os conceitos são simétricos, mas os recursos, comandos e responsabilidades de programação podem mudar.


Segurança: diretiva que não pode ser apagada

Expor um programa COBOL como REST não significa abrir a porta do mainframe para qualquer pessoa.

A API deve considerar:

  • TLS;

  • certificados;

  • autenticação;

  • autorização;

  • RACF;

  • proteção das transações;

  • proteção dos recursos;

  • validação de entrada;

  • limitação de chamadas;

  • auditoria;

  • mascaramento de informações sensíveis;

  • API gateway;

  • tokens;

  • logs seguros.

Uma arquitetura comum pode ser:

Cliente
   ↓
API Gateway
   ↓
Autenticação e políticas
   ↓
CICS
   ↓
Programa COBOL

O IBM API Connect pode atuar como camada de gerenciamento, aplicando:

  • segurança;

  • quotas;

  • analytics;

  • controle de versões;

  • portal para desenvolvedores;

  • políticas de tráfego.

O CICS continua executando a transação, enquanto o gateway controla a exposição externa.

Cuidado com logs

Não grave indiscriminadamente:

  • CPF;

  • senha;

  • token;

  • número completo de cartão;

  • dados bancários;

  • informações médicas;

  • chaves privadas.

Log de diagnóstico não deve virar arquivo de evidências contra a própria empresa.


Curiosidades da delegacia CICS

1. CICS não é apenas uma “tela verde”

Muitos iniciantes associam CICS exclusivamente a mapas BMS e terminais 3270.

Mas o CICS moderno pode atender:

  • aplicações web;

  • APIs;

  • Java;

  • JSON;

  • SOAP;

  • eventos;

  • mensageria;

  • integração com cloud;

  • workloads híbridos.

A tela 3270 é apenas uma das interfaces possíveis.


2. REST não obriga reescrita completa

Modernizar não significa necessariamente transportar toda a lógica para outra plataforma.

Muitas vezes, uma boa modernização consiste em:

Criar uma API estável
        ↓
Preservar a lógica confiável
        ↓
Substituir partes gradualmente

Isso reduz risco.

Reescrever milhões de linhas de COBOL apenas para produzir JSON pode ser economicamente irresponsável.


3. Copybook também é contrato

O copybook descreve mais do que campos.

Ele carrega decisões históricas:

  • tamanho de conta;

  • precisão monetária;

  • códigos;

  • indicadores;

  • datas;

  • flags;

  • estruturas repetitivas.

Ao expor uma API, você está transformando parte desse contrato interno em contrato externo.

Faça isso conscientemente.


4. JSON é flexível; COBOL é preciso

JSON aceita estruturas dinâmicas.

COBOL prefere estruturas rigorosamente definidas.

Isso não é defeito.

É uma diferença filosófica.

Em sistemas financeiros, precisão de posição, tamanho e decimal é uma vantagem.

O CICS cria uma ponte entre a flexibilidade externa e a disciplina interna.


Erros clássicos que o programador deve evitar

Expor diretamente a COMMAREA inteira

Uma COMMAREA pode conter:

  • campos internos;

  • fillers;

  • controles;

  • dados sensíveis;

  • flags técnicas;

  • áreas de trabalho;

  • códigos incompreensíveis para consumidores externos.

Crie uma interface própria para API.


Ignorar versionamento

Alterar um campo pode quebrar dezenas de consumidores.

Use versões e contratos claros.


Misturar erro técnico com erro de negócio

“Cliente não possui saldo” não é necessariamente uma pane no servidor.


Não validar números

Um valor JSON pode ultrapassar a capacidade de um PIC 9(5).

Valide limites antes da lógica de negócio.


Esquecer a codificação de caracteres

O mainframe trabalha frequentemente com EBCDIC; clientes web trabalham geralmente com UTF-8.

Conversões precisam estar corretamente configuradas.

Problemas de encoding podem transformar:

JOÃO

em um relatório digno do arquivo de ocorrências inexplicáveis.


Alterar copybook sem regenerar binding

Se a estrutura mudou, o mapeamento pode precisar ser regenerado e redistribuído.

Binding antigo com programa novo é receita para corrupção silenciosa.


Easter eggs para os veteranos do cinema e do mainframe

Em algum lugar da região CICS, um sysprog observa o painel e murmura:

Eu compraria essa API por um dólar.

Na sala ao lado, um desenvolvedor tenta enviar um JSON com campo numérico maior que o PIC suporta. O handler responde com a firmeza de um policial cibernético:

Dead or alive, you are coming with me.

O JSON, naturalmente, escolhe o 400 Bad Request.

Enquanto isso, uma reunião executiva promete substituir todo o mainframe em seis meses. No fundo da sala, o veterano do CICS apenas olha para o relatório de disponibilidade, toma um café e aguarda o próximo episódio.

Ele já viu esse filme antes.

Talvez mais de uma vez.


Conclusão: a quarta diretiva do CICS

O CICS Transaction Server não sobreviveu por permanecer parado.

Ele sobreviveu porque evoluiu sem abandonar seus fundamentos:

  • integridade;

  • desempenho;

  • segurança;

  • controle transacional;

  • escalabilidade;

  • compatibilidade;

  • proteção da lógica de negócio.

Ao fornecer suporte a REST e JSON, o CICS não obrigou o COBOL a fingir que é JavaScript.

Ele criou uma camada especializada de tradução.

O cliente envia HTTP e JSON.
O TCPIPSERVICE recebe a conexão.
O URIMAP identifica o caminho.
O PIPELINE conduz o processamento.
O JSON Handler converte a mensagem.
A COMMAREA ou o CHANNEL entrega os dados.
O programa COBOL executa a regra de negócio.
A resposta percorre o caminho inverso.

Tudo isso permite que um aplicativo moderno converse com uma aplicação escrita décadas atrás como se estivesse chamando qualquer outro serviço contemporâneo.

Essa é a verdadeira modernização pragmática.

Não é destruir o passado.
É colocar uma interface moderna diante dele.

Não é substituir um sistema confiável apenas porque sua linguagem é antiga.
É permitir que ele participe de arquiteturas atuais.

Não é esconder o mainframe por vergonha.
É transformá-lo em um provedor de serviços corporativos.

O jovem programador COBOL entra na sala pensando que encontrará apenas COMMAREA, BMS e terminal 3270.

Sai de lá compreendendo URIs, pipelines, bindings, JSON, TLS, APIs e integração híbrida.

No visor do CICS aparece a mensagem final:

SERVICE STATUS: ENABLED
PIPELINE STATUS: ACTIVE
PROGRAM STATUS: AVAILABLE
HTTP RESPONSE: 200 OK

A cidade digital pode continuar operando.

O JSON foi processado.
O COBOL permaneceu intacto.
A transação foi concluída.

E, em algum lugar do z/OS, a verdadeira quarta diretiva continua protegida:

Nunca interromper o processamento de produção.

sábado, 12 de setembro de 2015

🧠 Storage Control no CICS

 

CICS Storage Control

🧠 Storage Control no CICS

Onde o estado vive, onde ele morre e onde ele assombra produção

A imagem mostra:

Storage Control → Storage sources
• COMMAREA
• CWA (Common Work Area)
• TWA (Transaction Work Area)

Isso não é teoria.
Isso é onde bugs se escondem.


🧱 Storage Control – o papel do CICS

O Storage Control é o componente do CICS responsável por:

  • Alocar memória

  • Liberar memória

  • Isolar memória entre tasks

  • Proteger o CICS de você (sim, de você)

Tudo no CICS gira em torno de tasks concorrentes compartilhando CPU, mas não memória — salvo quando você pede explicitamente.


📦 COMMAREA

O clássico, o limitado, o abusado

O que é

Área de comunicação passada entre programas via:

  • LINK

  • XCTL

  • RETURN TRANSID

Características

  • 📏 Tamanho máximo: 32 KB

  • 🔁 Passagem explícita

  • ⏱️ Vida curta (dura o fluxo)

  • 🔒 Isolada por task

Quando usar

  • Dados pequenos

  • Estruturas simples

  • Fluxo linear clássico

Pecados capitais

  • Usar COMMAREA como banco de dados

  • Estourar tamanho

  • Reusar layout errado (ASRA clássico)

💀 ABEND típico: ASRA / AEIP


CICS TWA

🧰 TWA – Transaction Work Area

Estado temporário da transação

O que é

Área de memória associada à transação, não ao programa.

Características

  • Criada automaticamente pelo CICS

  • Acessível por qualquer programa da transação

  • Vive até o RETURN final

Quando usar

  • Guardar estado entre múltiplos programas

  • Fluxo pseudo-conversacional simples

Riscos

  • Confundir TWA com COMMAREA

  • Assumir que sobrevive entre transações (não sobrevive)

💡 Boa prática: TWA é “mochila da transação”, não cofre.


CICS CWA

🏛️ CWA – Common Work Area

O templo dos deuses (e dos pecados)

O que é

Área de memória global do CICS Region.

Características

  • Compartilhada por todas as tasks

  • Inicializada no startup

  • Não é isolada

  • Não é protegida

Quando usar (com muito cuidado)

  • Tabelas de controle

  • Flags globais

  • Cache de leitura

Quando NÃO usar

  • Dados de negócio

  • Dados por usuário

  • Qualquer coisa mutável sem controle

☠️ Risco real: corrupção de dados, race condition, caos silencioso.

CWA é poder absoluto — e poder absoluto gera incidentes absolutos.


🚀 CHANNEL & CONTAINER

O CICS moderno, civilizado e escalável

O que são

Substitutos modernos da COMMAREA.

  • CHANNEL → agrupador lógico

  • CONTAINER → estrutura de dados

Características

  • 📏 Tamanho praticamente ilimitado

  • 📦 Estruturas múltiplas

  • 🔄 Tipagem flexível

  • 🧼 Melhor manutenção

  • 🔐 Mais seguro

Quando usar

  • Aplicações modernas

  • Integração

  • Grandes volumes

  • APIs CICS

Comparação rápida

RecursoCOMMAREACHANNEL/CONTAINER
Tamanho32 KBMuito maior
EstruturaÚnicaMúltiplas
ManutençãoDifícilLimpa
FuturoLegadoPresente e futuro

🗺️ Como ler a imagem como um mainframer

A imagem não está falando só de memória.
Ela está dizendo:

“Escolha errado onde guardar estado
e você vai debugar às 3 da manhã.”


🧠 Regra Bellacosa de Ouro

  • COMMAREA → conversa curta

  • TWA → memória da transação

  • CWA → último recurso

  • CHANNEL/CONTAINER → escolha padrão moderna


☕ Comentário El Jefe Midnight Lunch

“CICS não quebra porque é antigo.
Ele quebra porque alguém tratou memória como variável global.”

🔥 Quem entende Storage Control, domina o CICS.


quarta-feira, 12 de outubro de 2011

🔥 COMMAREA vs CHANNEL/CONTAINER no CICS

 


🔥 COMMAREA vs CHANNEL/CONTAINER no CICS



☕ Midnight Lunch, COMMAREA gigante e o CICS olhando feio

Todo mainframer já viveu esse momento:

“Só aumentei a COMMAREA… de 2K pra 32K.”

Minutos depois:

  • ASRA misterioso

  • Storage estourando

  • Performance caindo

  • E alguém sussurra:
    👉 “Por que não usaram CHANNEL?”

Hoje vamos resolver essa treta histórica: COMMAREA vs CHANNEL/CONTAINER, com números, boas práticas, cicatrizes e filosofia Bellacosa.


🏛️ História: do bloco único ao container moderno

COMMAREA

  • Nasceu nos primórdios do CICS

  • Simples, direta, rápida

  • Pensada para pequenos volumes de dados

  • Era “o suficiente” nos anos 70/80

CHANNEL/CONTAINER

  • Introduzido no CICS TS 3.x

  • Resposta à complexidade crescente

  • Feito para dados grandes, estruturados e flexíveis

  • Arquitetura mais próxima de “mensageria moderna”

📌 Não é moda. É evolução arquitetural.


🧠 Conceito essencial (guarde isso)

COMMAREA = um bloco fixo de memória
CHANNEL/CONTAINER = coleção flexível de blocos independentes

Isso muda tudo.


📦 COMMAREA – o clássico confiável (e perigoso)

O que é?

Um único bloco contínuo de memória, passado entre programas via LINK/XCTL.

📏 Tamanho máximo

  • Até 32.767 bytes (~32 KB)

Sim. Esse é o limite duro.
Passou disso? Nem adianta insistir.


👍 Pontos fortes

✔ Simples
✔ Rápido
✔ Fácil de debugar
✔ Ideal para estruturas pequenas

👎 Limitações

❌ Tamanho limitado
❌ Forte acoplamento entre programas
❌ Layout rígido
❌ Difícil evoluir sem impacto


❌ Erros comuns com COMMAREA (easter eggs)

🐣 COMMAREA gigante “só por garantia”
🐣 Layout diferente entre programas
🐣 Reutilizar COMMAREA sem limpar
🐣 Usar COMMAREA como “dump de dados”

📌 COMMAREA não é mala de viagem.


📦 CHANNEL/CONTAINER – o adulto da sala

O que é?

Um CHANNEL é um agrupador lógico.
Um CONTAINER é um bloco individual de dados dentro do channel.

📦 Channel
└── Container A
└── Container B
└── Container C

Cada um com:

  • Tamanho próprio

  • Tipo próprio

  • Vida própria


📏 Tamanho máximo

  • Praticamente ilimitado (dependente de storage)

  • Containers podem ter megabytes

  • Muito além do limite da COMMAREA

📌 Aqui o gargalo deixa de ser o CICS e passa a ser o bom senso.


👍 Pontos fortes

✔ Estrutura flexível
✔ Baixo acoplamento
✔ Ideal para dados grandes
✔ Melhor para evolução de sistemas
✔ Integra bem com Web Services e MQ

👎 Cuidados

❌ Mais verboso
❌ Exige disciplina
❌ Overkill para casos simples


🥊 COMMAREA vs CHANNEL/CONTAINER

CritérioCOMMAREACHANNEL/CONTAINER
Tamanho máx~32 KBMuito grande
EstruturaFixaFlexível
EvoluçãoDifícilFácil
PerformanceExcelenteMuito boa
AcoplamentoAltoBaixo
ModernidadeClássicoAtual

📌 Não existe melhor. Existe mais adequado.


🛠️ Passo a passo: como escolher

1️⃣ Dados pequenos e estáveis? → COMMAREA
2️⃣ Muitos campos opcionais? → CHANNEL
3️⃣ Dados grandes (XML, JSON)? → CHANNEL
4️⃣ Sistema legado crítico? → COMMAREA (com cuidado)
5️⃣ Integração moderna? → CHANNEL/CONTAINER


⚡ Boas práticas Bellacosa

✅ COMMAREA

  • Use o menor tamanho possível

  • Documente o layout

  • Inicialize sempre

  • Evite “COMMAREA universal”

✅ CHANNEL/CONTAINER

  • Um container = um conceito

  • Nomeie containers claramente

  • Evite “container Frankenstein”

  • Libere quando não precisar

📌 Arquitetura também é educação.


🧪 Exemplo mental de otimização

Antes (COMMAREA)

  • Estrutura única de 30 KB

  • Metade dos campos nunca usados

  • Cada mudança quebra alguém

Depois (CHANNEL)

  • Container CLIENTE

  • Container PRODUTO

  • Container CONTROLE

  • Cada programa lê só o que precisa

🔥 Resultado:

  • Menos impacto

  • Mais clareza

  • Menos bug fantasma


📚 Guia de estudo recomendado

Para dominar o tema:

  • CICS Program Control

  • Storage Management

  • COMMAREA lifecycle

  • CHANNEL/CONTAINER APIs

  • Performance tuning em CICS

📖 Manual essencial: CICS Application Programming Guide


🤓 Curiosidades de boteco mainframe

🍺 CHANNEL foi criado porque COMMAREA virou “caixa de Pandora”
🍺 Há sistemas que simulam JSON dentro de COMMAREA (não faça isso)
🍺 Web Services no CICS usam CHANNEL por baixo dos panos
🍺 Muitos ainda usam COMMAREA por medo, não por necessidade


💬 Comentário El Jefe Midnight Lunch

“COMMAREA resolve rápido.
CHANNEL resolve certo.
O mainframe não perdoa preguiça arquitetural.”


🚀 Aplicações reais hoje

  • Core bancário moderno

  • APIs CICS

  • Integração com MQ

  • Processamento XML/JSON

  • Sistemas híbridos (CICS + Cloud)


🎯 Conclusão Bellacosa

COMMAREA não morreu.
CHANNEL não é bala de prata.

O mainframer experiente:

  • Sabe quando usar cada um

  • Respeita limites

  • Pensa no futuro

🔥 Arquitetura boa não dá abend. Dá orgulho.

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