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

Translate

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

sexta-feira, 19 de junho de 2026

IBM MQ sem Mistérios: da Primeira Fila ao Salto Quântico da Integração Corporativa

 

Bellacosa Mainframe uma visao do ibm mq 10

☕ Um Café no Bellacosa Mainframe

IBM MQ sem Mistérios: da Primeira Fila ao Salto Quântico da Integração Corporativa

O guia do Programador COBOL Padawan para compreender mensagens, filas, Queue Managers, canais, segurança, clusters, containers e a evolução do MQSeries ao IBM MQ 10.0

Existe uma cena clássica em praticamente todo ambiente corporativo: de um lado, temos um programa COBOL executando tranquilamente no z/OS; do outro, uma aplicação Java, um aplicativo bancário, uma API escrita em Python, um sistema Linux, um serviço na nuvem ou algum microsserviço perdido dentro de um cluster Kubernetes.

Todos precisam conversar.

O problema é que eles não falam necessariamente a mesma língua, não estão ligados no mesmo horário, não possuem a mesma velocidade e, pior ainda, podem ficar indisponíveis justamente no momento em que a mensagem precisa ser entregue.

É aí que entra o IBM MQ.

O MQ funciona como uma espécie de Central de Comunicações da Frota Estelar. A USS Enterprise não precisa pousar em cada planeta para entregar uma ordem. Ela transmite a mensagem por uma infraestrutura preparada para transportar, proteger, armazenar e encaminhar a comunicação.

No mundo corporativo, o IBM MQ desempenha uma missão semelhante.

Ele permite que aplicações diferentes troquem informações com segurança, confiabilidade e independência. Um programa envia uma mensagem; o MQ armazena essa mensagem; outro programa a recebe quando estiver pronto.

A ideia parece simples.

Mas é justamente essa simplicidade que sustenta bancos, seguradoras, companhias aéreas, governos, varejistas, indústrias, sistemas de pagamento e inúmeras operações críticas ao redor do planeta.

Prepare sua caneca de café, ajuste o uniforme da Frota e ligue o terminal 3270. Nossa missão será atravessar mais de três décadas de evolução do IBM MQ, começando no antigo MQSeries e chegando ao IBM MQ 10.0.


Capítulo I — Antes do MQ: quando as aplicações precisavam esperar umas pelas outras

Imagine que um programa chamado PGMPED01 precise enviar um pedido para outro programa chamado PGMFAT01.

Sem mensageria, o primeiro programa poderia chamar diretamente o segundo:

PGMPED01 ───────────────► PGMFAT01
           chamada direta

Essa arquitetura pode funcionar enquanto tudo estiver perfeitamente disponível.

Mas o que acontece quando:

  • o segundo programa está parado;

  • a rede caiu;

  • o servidor remoto está em manutenção;

  • o processamento demora;

  • há milhares de solicitações simultâneas;

  • uma das aplicações é atualizada;

  • o sistema consumidor precisa ser transferido para outra plataforma?

Na comunicação direta, o produtor e o consumidor ficam fortemente acoplados.

O programa produtor precisa conhecer:

  • o endereço do consumidor;

  • o protocolo utilizado;

  • o formato esperado;

  • o tempo de resposta;

  • a condição de disponibilidade.

É como se o capitão de uma nave precisasse localizar pessoalmente cada tripulante para entregar uma ordem. Se o oficial estivesse dormindo, em missão externa ou preso no Holodeck, toda a operação ficaria bloqueada.

O MQ introduz um intermediário:

PGMPED01 ───► FILA.PEDIDOS ───► PGMFAT01

O produtor não entrega diretamente ao consumidor. Ele coloca a mensagem em uma fila.

O consumidor não precisa estar funcionando naquele instante. Quando estiver disponível, poderá retirar e processar a mensagem.

Esse é o coração da comunicação assíncrona.


Capítulo II — O que significa MQ?

MQ tornou-se associado a Message Queueing, ou enfileiramento de mensagens.

O produto começou como MQSeries em 1993, depois foi renomeado WebSphere MQ em 2002 e passou a se chamar IBM MQ em 2014. A solução cresceu de uma plataforma de filas para um conjunto completo de recursos de mensageria corporativa, disponível em z/OS, sistemas distribuídos, appliances, nuvem e containers. (Wikipedia)

Uma mensagem é uma unidade de informação enviada por uma aplicação.

Ela pode conter:

  • uma transação bancária;

  • um pedido de compra;

  • os dados de um cliente;

  • uma solicitação de pagamento;

  • uma notificação;

  • um evento de estoque;

  • um documento JSON;

  • um registro COBOL;

  • uma instrução para outro sistema;

  • até mesmo dados binários.

A fila é o local lógico onde essa mensagem aguarda processamento.

Pense em uma estação ferroviária.

Os passageiros são as mensagens.

A plataforma é a fila.

O trem é o canal de transporte.

A estação central é o Queue Manager.

Os fiscais são as regras de segurança.

O sistema de sinalização representa os mecanismos de confirmação, controle e recuperação.

No universo da Frota Estelar, podemos fazer outra analogia:

Mensagem        = ordem da missão
Fila            = caixa de comunicações
Queue Manager   = computador central da nave
Canal           = frequência de transmissão
Aplicação       = tripulante remetente ou destinatário

Capítulo III — A criatura mais importante: o Queue Manager

O Queue Manager, ou gerenciador de filas, é o coração operacional do IBM MQ.

Ele administra:

  • filas;

  • mensagens;

  • conexões;

  • canais;

  • segurança;

  • recuperação;

  • logs;

  • persistência;

  • transações;

  • entrega entre ambientes.

Um Queue Manager pode ser imaginado como uma agência central dos Correios. Ele conhece as caixas postais, controla o armazenamento e encaminha as mensagens para outros locais.

Exemplo conceitual:

+---------------------------------------+
|         QUEUE MANAGER QMZOS01         |
|                                       |
|  FILA.PEDIDOS                         |
|  FILA.PAGAMENTOS                      |
|  FILA.RESPOSTAS                       |
|  FILA.ERROS                           |
|                                       |
|  Canais, logs, segurança e controle   |
+---------------------------------------+

Um programa pode abrir uma fila e colocar uma mensagem usando uma chamada MQPUT.

Outro programa pode abrir a mesma fila e obter a mensagem usando MQGET.

Fluxo básico:

Programa produtor
      |
      | MQPUT
      v
FILA.PEDIDOS
      |
      | MQGET
      v
Programa consumidor

No mundo COBOL, essas operações podem ser efetuadas por meio da interface MQI, a Message Queue Interface.

Uma sequência lógica simplificada seria:

MQCONN  → conectar ao Queue Manager
MQOPEN  → abrir uma fila
MQPUT   → colocar uma mensagem
MQCLOSE → fechar a fila
MQDISC  → desconectar

Para consumir:

MQCONN  → conectar
MQOPEN  → abrir
MQGET   → obter a mensagem
MQCLOSE → fechar
MQDISC  → desconectar

Esse ciclo é quase um ritual de embarque:

  1. entrar na nave;

  2. abrir o canal;

  3. transmitir ou receber;

  4. fechar o canal;

  5. desembarcar.


Capítulo IV — 1993: nasce o MQSeries

A década de 1990 foi um período de enorme fragmentação tecnológica.

Empresas possuíam:

  • mainframes;

  • servidores Unix;

  • PCs;

  • bancos de dados diferentes;

  • sistemas departamentais;

  • aplicações cliente-servidor;

  • redes heterogêneas.

A comunicação entre essas plataformas era complicada.

O MQSeries surgiu para fornecer mensageria confiável entre sistemas distribuídos.

A grande inovação não era apenas transportar dados. Era permitir que a aplicação produtora continuasse trabalhando sem precisar esperar que a aplicação consumidora terminasse.

Veja a diferença.

Comunicação síncrona

Aplicação A chama Aplicação B
Aplicação A fica esperando
Aplicação B processa
Aplicação B responde
Aplicação A continua

Comunicação assíncrona

Aplicação A envia mensagem
Aplicação A continua trabalhando
Aplicação B processa quando puder

Esse desacoplamento oferece quatro liberdades importantes:

Liberdade de tempo

Produtor e consumidor não precisam estar ativos simultaneamente.

Liberdade de plataforma

Um pode estar no z/OS; o outro, no Linux.

Liberdade de velocidade

O produtor pode enviar rapidamente, enquanto o consumidor processa no próprio ritmo.

Liberdade de evolução

Uma aplicação pode ser modificada sem exigir alteração imediata na outra, desde que o contrato da mensagem seja preservado.

Essa filosofia permanece válida mesmo depois de três décadas.


Capítulo V — Mensagens persistentes: o diário de bordo que não pode desaparecer

Nem toda mensagem possui a mesma importância.

Uma notificação de temperatura pode eventualmente ser descartada.

Uma transferência bancária, não.

Por isso, o MQ diferencia mensagens persistentes e não persistentes.

Mensagem não persistente

É normalmente utilizada quando desempenho é mais importante e uma eventual perda pode ser tolerada.

Exemplos:

  • telemetria temporária;

  • atualização visual;

  • evento sem valor transacional;

  • informação que pode ser recriada.

Mensagem persistente

É protegida pelos mecanismos de log e recuperação do Queue Manager.

Exemplos:

  • pagamento;

  • transferência;

  • pedido;

  • alteração de conta;

  • movimentação contábil;

  • reserva de passagem.

Se o sistema falhar, a mensagem persistente pode ser recuperada.

É o equivalente ao diário de bordo da Enterprise. Mesmo que a nave sofra uma pane, as informações essenciais da missão não podem simplesmente evaporar no espaço.


Capítulo VI — Commit e Backout: quando o MQ entra na transação

O MQ também pode participar de unidades de trabalho.

Imagine que um programa COBOL:

  1. leia uma mensagem da fila;

  2. atualize uma tabela Db2;

  3. grave um registro;

  4. confirme a transação.

Se tudo funcionar:

COMMIT

A mensagem é definitivamente removida da fila e a atualização do banco é confirmada.

Se ocorrer um erro:

ROLLBACK ou BACKOUT

A atualização é desfeita e a mensagem pode retornar à fila para nova tentativa.

Esse comportamento é fundamental para evitar o pior cenário de integração:

Mensagem removida
+
Banco não atualizado
=
Transação perdida

Quando MQ e Db2 estão coordenados corretamente, o processamento pode obedecer ao princípio:

Ou tudo acontece, ou nada acontece.

É a famosa atomicidade transacional.

Nenhum oficial da Frota gostaria de registrar “torpedo disparado” sem que o torpedo tivesse realmente sido lançado — ou lançar o torpedo sem atualizar o diário da batalha.


Capítulo VII — Canais: as rotas interestelares do MQ

Quando dois Queue Managers precisam conversar, normalmente utilizam canais.

Exemplo:

QMZOS01 ───────────────► QMLNX01
        canal emissor

Em uma configuração distribuída clássica, podemos encontrar:

  • Sender Channel;

  • Receiver Channel;

  • Server Connection Channel;

  • Client Connection Channel;

  • Cluster Sender;

  • Cluster Receiver.

Um Sender Channel envia mensagens.

Um Receiver Channel recebe.

Um Server Connection Channel permite que uma aplicação cliente se conecte remotamente a um Queue Manager.

Para o Programador COBOL iniciante, a distinção essencial é:

Aplicação local
    usa o Queue Manager próximo

Queue Manager
    usa canais para conversar com outro Queue Manager

A aplicação não precisa conhecer todos os detalhes da rota.

Ela coloca a mensagem em uma fila. O MQ resolve o transporte segundo a configuração existente.

É como pedir ao computador da nave:

“Entregue esta mensagem à Base Estelar 12.”

O tripulante não precisa calcular cada dobra espacial, cada repetidor subespacial ou cada salto intermediário.


Capítulo VIII — Filas locais, remotas e de transmissão

Uma fila local armazena mensagens dentro do Queue Manager.

FILA.LOCAL.PEDIDOS

Uma definição de fila remota representa um destino existente em outro Queue Manager.

FILA.REMOTA.FATURAMENTO

Uma fila de transmissão armazena temporariamente mensagens destinadas a outro Queue Manager.

Fluxo simplificado:

Aplicação
   |
   v
Definição remota
   |
   v
Fila de transmissão
   |
   v
Sender Channel
   |
   v
Receiver Channel
   |
   v
Fila local no destino

Você pode imaginar a fila remota como o endereço da Base Estelar, enquanto a fila de transmissão funciona como o compartimento de carga onde as mensagens aguardam a próxima nave de transporte.


Capítulo IX — Final dos anos 1990: agrupamento e clustering

À medida que o MQ crescia, surgiram necessidades mais sofisticadas.

Uma delas era transportar conjuntos de mensagens relacionadas.

Imagine um pedido composto por:

  • cabeçalho;

  • cliente;

  • dez itens;

  • pagamento;

  • entrega.

Essas partes podem ser enviadas como mensagens separadas, mas precisam ser processadas como um grupo lógico.

Outro avanço importante foi o clustering.

Sem cluster:

Aplicação
   |
   v
Queue Manager único

Se esse Queue Manager sofrer uma interrupção, o caminho pode ficar indisponível.

Com um cluster:

                  ┌──► QM01
Aplicação ────────┼──► QM02
                  └──► QM03

O cluster oferece mecanismos para distribuir mensagens entre instâncias de filas disponíveis em diferentes Queue Managers.

Mas atenção, Padawan: cluster não é sinônimo automático de alta disponibilidade completa.

Ele ajuda na conectividade e distribuição de carga, mas o projeto ainda precisa considerar:

  • disponibilidade do Queue Manager;

  • armazenamento;

  • aplicações consumidoras;

  • rede;

  • recuperação de desastre;

  • persistência;

  • afinidade de mensagens;

  • monitoramento.

Essa é uma armadilha frequente.

Cluster não é magia Jedi. É arquitetura.


Capítulo X — 2002: a era WebSphere MQ

Em 2002, o produto passou a integrar a família WebSphere e recebeu o nome WebSphere MQ. A mudança refletia o período em que arquiteturas Java, J2EE, serviços Web e integração corporativa ganhavam enorme importância. (Wikipedia)

Era a era da SOA: Service-Oriented Architecture.

A empresa deixava de pensar apenas em programas isolados e passava a organizar funcionalidades como serviços.

Exemplo:

Serviço de Cliente
        |
        v
       MQ
        |
        v
Serviço de Crédito
        |
        v
       MQ
        |
        v
Serviço de Faturamento

O MQ tornou-se um elemento essencial para conectar serviços sem criar dependências rígidas.

Muito antes de expressões como “microsserviços” e “cloud native” dominarem as conferências, o MQ já praticava princípios que permanecem modernos:

  • desacoplamento;

  • comunicação assíncrona;

  • contratos de mensagem;

  • tolerância a falhas;

  • processamento distribuído;

  • segurança;

  • rastreabilidade.

Curiosidade: vários conceitos vendidos hoje como novidades absolutas já frequentavam os corredores do mainframe quando muito desenvolvedor moderno ainda usava conexão discada.


Capítulo XI — Publish/Subscribe: uma mensagem para muitos ouvintes

No modelo tradicional de fila, uma mensagem é normalmente consumida por um consumidor.

Produtor ───► Fila ───► Consumidor

No modelo Publish/Subscribe, o produtor publica uma informação em um tópico.

Vários assinantes podem recebê-la.

                         ┌──► Assinante A
Publicador ──► Tópico ───┼──► Assinante B
                         └──► Assinante C

Exemplo: uma transação de venda foi concluída.

O evento pode interessar a:

  • estoque;

  • faturamento;

  • logística;

  • análise de fraude;

  • programa de fidelidade;

  • data lake;

  • sistema de notificações.

Em vez de o sistema de vendas chamar seis aplicações diferentes, ele publica um evento:

VENDA.CONCLUIDA

Cada assinante recebe e processa a informação segundo sua finalidade.

Essa arquitetura reduz acoplamento e facilita a inclusão de novos consumidores.

A ponte da Enterprise anuncia:

“Alerta vermelho!”

Segurança, Engenharia, Enfermaria e Comando recebem o mesmo evento, mas cada departamento toma uma ação diferente.

Isso é Publish/Subscribe explicado pela Frota Estelar.


Capítulo XII — WebSphere MQ 7 e a abertura para JMS, MQTT e alta disponibilidade

A evolução do MQ acompanhou Java, dispositivos conectados e arquiteturas distribuídas.

JMS facilitou a integração com aplicações Java.

MQTT tornou-se especialmente importante em cenários de dispositivos leves e telemetria.

Imagine:

Sensor industrial
       |
       | MQTT
       v
Gateway ou infraestrutura de mensageria
       |
       v
IBM MQ
       |
       v
Sistema corporativo

Um sensor não precisa executar um cliente pesado. Ele pode publicar dados usando um protocolo enxuto, enquanto a infraestrutura corporativa recebe, converte, distribui e processa as informações.

O MQ começou como um mensageiro entre sistemas corporativos e evoluiu para participar de ecossistemas com:

  • dispositivos;

  • aplicações móveis;

  • sistemas web;

  • Java;

  • integração empresarial;

  • serviços externos.


Capítulo XIII — Segurança: não basta entregar, é preciso proteger

Em mensageria corporativa, temos pelo menos cinco perguntas fundamentais:

  1. Quem está se conectando?

  2. A pessoa ou aplicação está autenticada?

  3. Ela tem autorização para acessar a fila?

  4. A comunicação está criptografada?

  5. A mensagem pode ser auditada?

A segurança pode envolver:

  • TLS;

  • certificados;

  • autenticação;

  • autorização;

  • CHLAUTH;

  • CONNAUTH;

  • RACF no z/OS;

  • proteção de filas;

  • identidades de usuários;

  • políticas de Advanced Message Security;

  • registros e monitoramento.

No z/OS, o RACF pode controlar o acesso aos recursos do MQ.

Exemplo conceitual:

Usuário APPPED01
pode PUT em FILA.PEDIDOS

Usuário APPFAT01
pode GET em FILA.PEDIDOS

Usuário DESCONHECIDO
não pode acessar

Uma boa prática é seguir o princípio do menor privilégio.

O produtor não precisa necessariamente retirar mensagens.

O consumidor não precisa necessariamente colocar mensagens.

O operador não precisa ler o conteúdo comercial.

O auditor não precisa alterar configurações.

Cada tripulante deve possuir apenas os acessos necessários para a própria missão.

Dar autoridade total a todas as aplicações seria como distribuir códigos de autodestruição da Enterprise para qualquer cadete recém-chegado.


Capítulo XIV — Advanced Message Security e Managed File Transfer

O Advanced Message Security permite aplicar proteção à própria mensagem.

Isso é diferente de proteger somente o canal.

TLS protege a comunicação durante o transporte:

Aplicação A ===== canal protegido ===== MQ

A proteção no nível da mensagem pode manter o conteúdo protegido mesmo enquanto ele passa por intermediários.

É a diferença entre:

  • transportar uma carta dentro de um túnel seguro;

  • colocar a carta em um envelope que somente o destinatário pode abrir.

O Managed File Transfer utiliza a infraestrutura e os controles de MQ para transferências de arquivos gerenciadas.

Isso pode oferecer:

  • auditoria;

  • rastreabilidade;

  • automação;

  • segurança;

  • confirmação;

  • integração com processos;

  • tratamento de falhas.

Em muitas empresas, mover um arquivo não significa simplesmente executar FTP. É preciso saber:

  • quem enviou;

  • quando enviou;

  • qual era o tamanho;

  • se chegou;

  • se foi processado;

  • se houve erro;

  • se ocorreu nova tentativa.

O MFT transforma a transferência em uma operação governada.


Capítulo XV — 2014: nasce oficialmente o nome IBM MQ

Em 2014, o produto deixou a identidade WebSphere e passou a chamar-se IBM MQ. (Wikipedia)

A mudança simbolizou sua independência e amplitude.

O MQ já não era apenas uma peça de um conjunto de ferramentas web. Era uma plataforma de mensageria com identidade própria, presente em múltiplos sistemas operacionais e arquiteturas.

Nessa fase ganharam destaque recursos como:

  • interfaces administrativas modernas;

  • console web;

  • conectividade aprimorada;

  • appliances;

  • maior integração operacional.

O IBM MQ Appliance ofereceu uma forma integrada de executar mensageria em equipamento dedicado, reduzindo parte do trabalho de montagem da pilha de infraestrutura.

Para algumas organizações, isso significava receber uma espécie de “nave pronta para voar”, em vez de montar motor, casco, computador, escudos e sistema de dobra separadamente.


Capítulo XVI — LTS e Continuous Delivery

A partir da família 9, compreender os modelos de entrega tornou-se essencial.

LTS — Long Term Support

Destinado a organizações que priorizam estabilidade e permanência em uma linha de manutenção por um período prolongado.

A IBM define o LTS como o nível recomendado para ambientes que exigem máxima estabilidade. Atualizações LTS recebem correções de defeitos e segurança, enquanto novas capacidades chegam por novas bases LTS ou são incorporadas a partir da evolução do fluxo CD. (IBM)

CD — Continuous Delivery

Entrega funcionalidades com maior frequência.

Exemplos de numeração:

9.4.0 = base LTS
9.4.1 = CD
9.4.2 = CD
9.4.3 = CD

A IBM explica que versões LTS utilizam normalmente o nível de modificação zero, enquanto as entregas CD utilizam níveis subsequentes. (IBM)

A escolha depende da missão.

Um banco com processos rígidos pode preferir LTS.

Um laboratório, uma equipe de inovação ou um ambiente que necessita rapidamente de determinada capacidade pode adotar CD.

Não existe “melhor” universal.

Existe o modelo adequado ao risco, governança e velocidade da organização.


Capítulo XVII — IBM MQ 9.1, 9.2, 9.3 e 9.4: o MQ entra definitivamente na era híbrida

A família 9 consolidou o MQ dentro do novo universo tecnológico:

  • containers;

  • Docker;

  • Kubernetes;

  • OpenShift;

  • REST;

  • JSON;

  • autenticação moderna;

  • observabilidade;

  • automação;

  • integração híbrida.

O IBM MQ 9.4 LTS tornou-se disponível em junho de 2024. Entre suas capacidades estavam melhorias administrativas, ampliação de escalabilidade no channel initiator do z/OS, aprimoramentos nos registros SMF, evolução do console e mensageria remota por REST API. (IBM)

Observe o que isso representa.

Um produto nascido em 1993 consegue operar em um ambiente com:

COBOL + CICS + Db2 + z/OS
              |
              v
             MQ
              |
              v
Java + Spring Boot + OpenShift + Kubernetes

Não foi necessário jogar fora o mainframe.

Não foi necessário reescrever todos os programas COBOL.

Foi criada uma ponte.

Essa é uma das maiores lições do MQ: modernização não significa necessariamente substituição.

Muitas vezes, modernizar significa expor, integrar, proteger, automatizar e observar melhor aquilo que já funciona.


Capítulo XVIII — 2026: IBM MQ 10.0 entra em cena

O IBM MQ 10.0 LTS foi anunciado em abril de 2026 e disponibilizado em junho de 2026, sucedendo o IBM MQ 9.4.0 LTS e a última entrega CD da linha 9.4, a versão 9.4.5. (IBM)

A versão reforça uma mensagem importante:

O MQ não está sendo mantido apenas por compatibilidade. Ele continua evoluindo para enfrentar novos problemas corporativos.

Entre os avanços documentados para o MQ 10.0 aparecem recursos ligados a:

  • conectividade simplificada com a nuvem;

  • melhorias de console;

  • recuperação de site alternativo;

  • monitoramento de Native HA;

  • tracing integrado com OpenTelemetry;

  • aprimoramentos administrativos;

  • segurança;

  • containers;

  • resiliência. (IBM)

No campo da segurança, o MQ 10.0 também trouxe suporte a mecanismos de troca de chaves quantum-safe baseados em FIPS 203 e ML-KEM para canais TLS 1.3 em plataformas compatíveis. A finalidade é ajudar a proteger comunicações contra o cenário conhecido como “coletar agora e descriptografar depois”. (IBM)

Aqui está o grande salto histórico:

1993: transportar mensagens entre aplicações

2026: transportar mensagens com integração híbrida,
observabilidade, automação, segurança moderna,
containers e preparação criptográfica para o futuro

A missão original permaneceu.

A nave ganhou novos motores.


Capítulo XIX — Exemplo completo: um pagamento processado por COBOL

Considere um aplicativo de pagamento.

O cliente realiza uma transferência.

Etapa 1 — Aplicativo envia a solicitação

{
  "contaOrigem": "12345",
  "contaDestino": "98765",
  "valor": 150.00
}

Etapa 2 — API valida o formato

A API verifica token, campos obrigatórios e limites básicos.

Etapa 3 — API publica no MQ

FILA.PAGAMENTOS.ENTRADA

Etapa 4 — Programa COBOL consome

Um programa CICS ou batch executa MQGET.

Etapa 5 — Regra de negócio é aplicada

O programa verifica:

  • saldo;

  • situação da conta;

  • limite;

  • bloqueios;

  • antifraude;

  • dados cadastrais.

Etapa 6 — Db2 é atualizado

UPDATE CONTA
SET SALDO = SALDO - :VALOR
WHERE NUM_CONTA = :ORIGEM

Etapa 7 — Transação é confirmada

Se tudo funcionar:

COMMIT

Etapa 8 — Resposta é publicada

FILA.PAGAMENTOS.RESPOSTA

Etapa 9 — Aplicativo recebe a confirmação

{
  "status": "APROVADO",
  "codigo": "TX458902"
}

Agora suponha que o programa COBOL esteja indisponível durante três minutos.

A API não precisa perder o pagamento.

A mensagem pode permanecer na fila até que o consumidor retorne.

Esse é o verdadeiro poder do desacoplamento temporal.


Capítulo XX — Dead-letter queue: o cemitério que precisa ser investigado

Quando uma mensagem não consegue chegar ao destino, ela pode ser encaminhada para a Dead-Letter Queue.

Mas cuidado com o nome.

Ela não deve ser tratada como um lixão.

Uma mensagem na DLQ representa uma anomalia:

  • destino inexistente;

  • fila cheia;

  • erro de roteamento;

  • configuração incorreta;

  • autorização;

  • canal indisponível;

  • definição remota errada.

Uma DLQ ignorada é como uma cápsula de fuga à deriva. Pode parecer apenas um ponto luminoso no radar, mas talvez contenha informações vitais.

Boas práticas:

  • monitore a DLQ;

  • investigue o motivo;

  • corrija a causa;

  • reencaminhe quando apropriado;

  • mantenha trilha de auditoria;

  • evite simplesmente apagar.


Capítulo XXI — Backout Queue: a mensagem Klingon indestrutível

Imagine que uma mensagem defeituosa seja lida por um programa.

O programa falha.

A transação executa rollback.

A mensagem retorna à fila.

O programa lê novamente.

Falha novamente.

Isso pode criar um loop:

GET
erro
ROLLBACK
GET
erro
ROLLBACK
GET
erro
ROLLBACK

Para evitar esse ciclo, é possível utilizar mecanismos de backout.

Após determinada quantidade de tentativas, a mensagem pode ser movida para uma fila de exceção:

FILA.PAGAMENTOS.BACKOUT

Essa mensagem é frequentemente chamada de poison message.

Ela não é literalmente venenosa, mas provoca falha repetitiva no consumidor.

Dica de campo: sempre trate o contador de backout e projete uma estratégia para mensagens problemáticas. Não deixe o programa lutar eternamente contra o mesmo Klingon em um loop temporal.


Capítulo XXII — Passo a passo para o COBOL Padawan começar a estudar

Passo 1 — Domine os conceitos

Antes de instalar qualquer coisa, compreenda:

  • mensagem;

  • fila;

  • Queue Manager;

  • canal;

  • persistência;

  • commit;

  • rollback;

  • produtor;

  • consumidor;

  • cluster;

  • Publish/Subscribe.

Passo 2 — Desenhe um fluxo simples

PRODUTOR → FILA → CONSUMIDOR

Depois acrescente:

PRODUTOR → QM1 → CANAL → QM2 → CONSUMIDOR

Passo 3 — Conheça as chamadas MQI

Estude inicialmente:

MQCONN
MQOPEN
MQPUT
MQGET
MQCLOSE
MQDISC

Depois avance para:

MQBEGIN
MQCMIT
MQBACK
MQINQ
MQSET

Passo 4 — Aprenda MQSC

MQSC é a linguagem administrativa usada para definir e controlar objetos.

Exemplos conceituais:

DEFINE QLOCAL(FILA.TESTE)
DISPLAY QLOCAL(FILA.TESTE)
ALTER QLOCAL(FILA.TESTE)
DELETE QLOCAL(FILA.TESTE)

Passo 5 — Crie um laboratório produtor/consumidor

O produtor envia:

USS ENTERPRISE NCC-1701

O consumidor lê e exibe.

Esse será nosso primeiro Easter egg.

Depois envie:

RESISTANCE IS FUTILE

Caso a mensagem pare na Dead-Letter Queue, saberemos que os Borg assumiram o canal.

Passo 6 — Teste persistência

Envie uma mensagem persistente, interrompa o Queue Manager de forma controlada e confirme a recuperação após a reinicialização.

Passo 7 — Teste transação

Faça o consumidor:

  1. obter a mensagem;

  2. provocar um erro;

  3. executar rollback;

  4. verificar o retorno da mensagem.

Passo 8 — Estude segurança

Crie usuários com permissões distintas.

Teste quem pode:

  • conectar;

  • colocar;

  • retirar;

  • consultar;

  • administrar.

Passo 9 — Adicione um segundo Queue Manager

Configure uma rota entre dois ambientes.

Observe:

  • fila remota;

  • transmission queue;

  • sender channel;

  • receiver channel.

Passo 10 — Monitore

Acompanhe:

  • profundidade da fila;

  • mensagens antigas;

  • canais parados;

  • erros;

  • DLQ;

  • desempenho;

  • logs;

  • consumo;

  • tentativas de autenticação.


Capítulo XXIII — Dez dicas do engenheiro-chefe

1. Não use uma fila como banco de dados

Fila é mecanismo de transporte e desacoplamento, não repositório permanente de consulta histórica.

2. Defina contratos de mensagem

Documente:

  • formato;

  • campos;

  • versão;

  • codificação;

  • tamanho;

  • obrigatoriedade;

  • tratamento de erro.

3. Pense em idempotência

O consumidor deve, quando possível, tolerar o recebimento repetido de uma mensagem sem executar duas vezes um efeito indevido.

4. Use identificadores de correlação

Eles ajudam a relacionar uma resposta à solicitação original.

5. Monitore idade, não apenas quantidade

Uma fila com dez mensagens antigas pode ser mais grave que uma fila com mil mensagens processadas rapidamente.

6. Planeje mensagens inválidas

Toda arquitetura precisa responder:

O que faremos quando o conteúdo não puder ser processado?

7. Proteja os canais

Não exponha canais administrativos ou permissões excessivas.

8. Evite mensagens gigantes sem necessidade

Mensagens muito grandes aumentam consumo de rede, armazenamento, log e tempo de processamento.

9. Conheça a semântica da entrega

“Coloquei na fila” não significa necessariamente “o negócio foi concluído”.

Significa que a responsabilidade foi transferida para outra etapa.

10. Documente o caminho completo

Não basta saber o nome da fila.

Registre:

  • produtor;

  • consumidor;

  • Queue Manager;

  • canais;

  • regras de segurança;

  • formato;

  • retentativas;

  • DLQ;

  • backout;

  • alertas;

  • responsáveis.


Capítulo XXIV — MQ versus chamadas REST

REST e MQ não são inimigos.

REST funciona muito bem quando:

  • a resposta imediata é necessária;

  • o consumidor está disponível;

  • o fluxo é simples;

  • a interação é síncrona.

MQ funciona muito bem quando:

  • o consumidor pode estar indisponível;

  • a operação precisa ser armazenada;

  • há grande volume;

  • os sistemas possuem velocidades diferentes;

  • retentativa e recuperação são necessárias;

  • o processamento pode ser assíncrono.

Uma arquitetura real pode usar ambos:

Aplicativo
   |
   | REST
   v
API
   |
   | MQ
   v
COBOL/CICS

REST recebe a solicitação.

MQ protege e desacopla o processamento.

COBOL executa a regra crítica.

É uma aliança entre planetas, não uma guerra entre tecnologias.


Capítulo XXV — O maior ensinamento da linha do tempo

O IBM MQ atravessou:

  • cliente-servidor;

  • Internet;

  • Java;

  • SOA;

  • Web Services;

  • integração empresarial;

  • cloud;

  • containers;

  • Kubernetes;

  • OpenShift;

  • observabilidade;

  • segurança pós-quântica.

E, apesar de toda essa evolução, sua ideia central continua reconhecível:

Uma aplicação produz uma mensagem.
Outra aplicação consome.
O MQ garante a travessia.

Essa permanência ensina algo precioso ao Programador COBOL Padawan.

Uma tecnologia não permanece relevante porque recusa mudanças.

Ela permanece relevante porque preserva seus princípios fundamentais enquanto adapta sua implementação ao novo mundo.

O COBOL também sobreviveu seguindo lógica semelhante.

O z/OS também.

O Db2 também.

O CICS também.

Eles não ficaram congelados em uma fotografia de 1970. Evoluíram, ganharam APIs, segurança moderna, integração, automação e novos modelos operacionais.

O IBM MQ tornou-se uma ponte entre gerações.

De um lado:

COBOL
CICS
IMS
Db2
z/OS

Do outro:

Java
Python
REST
JSON
Containers
Kubernetes
Cloud
IA

No centro:

IBM MQ

Conclusão — A mensagem precisa chegar

No final de nossa missão, percebemos que IBM MQ não é apenas uma ferramenta para criar filas.

Ele é uma filosofia de arquitetura.

Uma filosofia baseada em:

  • desacoplamento;

  • resiliência;

  • segurança;

  • persistência;

  • transações;

  • integração;

  • confiabilidade.

Para o Programador COBOL iniciante, aprender MQ é descobrir como o mainframe conversa com o restante da galáxia digital.

Seu programa COBOL não precisa compreender cada detalhe de uma aplicação móvel, de um container ou de uma API em nuvem.

Ele precisa conhecer o contrato da mensagem.

Precisa saber onde recebê-la.

Precisa processá-la corretamente.

Precisa confirmar ou desfazer a transação.

O restante fica sob responsabilidade da infraestrutura de mensageria.

Talvez essa seja a verdadeira genialidade do MQ: permitir que sistemas de épocas, linguagens e plataformas diferentes cooperem sem exigir que todos se transformem na mesma coisa.

Na Frota Estelar, vulcanos, humanos, andorianos, klingons e inúmeras espécies trabalham lado a lado. Cada uma mantém sua identidade, mas utiliza protocolos comuns para colaborar.

No ambiente corporativo, COBOL, Java, Python, Linux, z/OS, containers e APIs fazem exatamente isso.

E o IBM MQ permanece no meio da ponte de comando, silencioso, transportando milhões de mensagens enquanto quase ninguém percebe.

Até o dia em que ele para.

Nesse instante, todos descobrem que o mensageiro discreto era, na verdade, um dos sistemas mais importantes da nave.

Vida longa e próspera às filas.

E lembre-se do código secreto escondido no log da missão:

MSGID: NCC1701
CORRELID: BELLACOSA
REASON: 00000000
STATUS: MESSAGE DELIVERED

A transmissão foi concluída. ☕🖖

quarta-feira, 26 de março de 2025

O Guia Definitivo para um Programador COBOL Padawan Entender Como os Grandes Bancos Distribuem Milhões de Mensagens sem que as Aplicações Precisem Saber Para Onde Estão Enviando

 

Bellacosa Mainframe e o ibm mq clustering sem misterios

☕ Um Café no Bellacosa Mainframe

IBM MQ Clustering sem Mistérios

O Guia Definitivo para um Programador COBOL Padawan Entender Como os Grandes Bancos Distribuem Milhões de Mensagens sem que as Aplicações Precisem Saber Para Onde Estão Enviando

Existe uma frase muito conhecida entre arquitetos de sistemas distribuídos:

"As melhores infraestruturas são aquelas que as aplicações nem percebem que existem."

Essa frase resume perfeitamente a filosofia do IBM MQ Clustering.

Quando um programador COBOL começa sua carreira no ambiente IBM Z, normalmente aprende primeiro sobre arquivos VSAM, Db2, CICS, JCL, IMS e, em algum momento, conhece o IBM MQ. Inicialmente, tudo parece simples: um programa faz um MQPUT, outro realiza um MQGET, e as mensagens seguem seu caminho. Porém, conforme a empresa cresce, surgem novas perguntas.

E se houver dezenas de Queue Managers?

E se um deles parar?

E se o volume de mensagens dobrar durante a Black Friday?

E se um datacenter inteiro ficar indisponível?

É exatamente para responder a essas perguntas que nasceu o IBM MQ Clustering, uma tecnologia extremamente sofisticada que, curiosamente, trabalha de forma quase invisível para quem desenvolve aplicações.

Hoje vamos abrir a caixa-preta dessa arquitetura e entender por que muitos dos conceitos considerados modernos na computação em nuvem já eram utilizados pelo IBM MQ muito antes de Kubernetes, Service Mesh ou API Gateways se tornarem populares.


A evolução natural dos grandes sistemas

Imagine um pequeno sistema bancário.

Existe apenas um Queue Manager.

COBOL
   │
 MQPUT
   │
 QM1
   │
 FILA

Tudo funciona perfeitamente.

Mas bancos nunca permanecem pequenos.

Novos produtos surgem.

PIX.

Cartões.

Investimentos.

Internet Banking.

Aplicativos móveis.

Open Finance.

Seguradoras.

Correspondentes bancários.

Agora centenas de aplicações precisam trocar mensagens.

Um único Queue Manager deixa de ser suficiente.


A primeira solução... e o primeiro problema

O caminho mais óbvio seria criar novos Queue Managers.

QM1
QM2
QM3
QM4
QM5

Até aqui parece simples.

O problema aparece quando cada aplicação precisa conhecer todos eles.

O código começa a ficar assim:

Se pagamento → QM2

Se cartão → QM3

Se empréstimo → QM4

Se PIX → QM5

Sempre que nasce um novo Queue Manager...

...centenas de aplicações precisam ser alteradas.

Isso é um pesadelo operacional.


A filosofia do IBM MQ

Os engenheiros da IBM fizeram uma pergunta brilhante.

"Por que obrigar a aplicação a conhecer toda a infraestrutura?"

E inverteram completamente o raciocínio.

Em vez da aplicação decidir para onde enviar...

...ela apenas entrega a mensagem ao Cluster.

Quem decide o destino é o próprio IBM MQ.

Esse desacoplamento é um dos pilares da engenharia de software moderna.


O Cluster não é um servidor

Aqui existe um dos maiores erros cometidos por iniciantes.

Muitos imaginam que um Cluster seja um computador enorme.

Não é.

O Cluster é apenas um grupo lógico de Queue Managers.

Imagine um banco presente em vários estados brasileiros.

São Paulo

QM1

------------

Rio

QM2

------------

Brasília

QM3

------------

Curitiba

QM4

Todos fazem parte do mesmo Cluster.

Podem executar:

  • Linux

  • AIX

  • IBM Z

  • Windows

  • Containers

Nada impede essa convivência.


O segredo está no conhecimento compartilhado

Cada Queue Manager continua sendo totalmente independente.

Ele possui:

  • logs próprios

  • recovery próprio

  • filas próprias

  • canais próprios

  • transações próprias

O Cluster não une fisicamente esses componentes.

Ele compartilha conhecimento.

É uma enorme diferença.


Os bibliotecários do Cluster

Imagine uma biblioteca nacional.

Existem milhares de livros.

Alguém precisa saber onde cada livro está.

No IBM MQ esse papel pertence aos Repositories.

São eles que mantêm o catálogo do Cluster.


Full Repository

O Full Repository conhece absolutamente tudo.

Ele sabe:

  • todos os Queue Managers

  • todas as filas de Cluster

  • todos os canais

  • atributos

  • prioridades

  • disponibilidade

É como um catálogo central.

Quando um novo Queue Manager entra no Cluster, ele registra suas informações no Full Repository.


Por que dois Full Repositories?

Essa pergunta aparece frequentemente em entrevistas técnicas.

A resposta é simples.

Nunca devemos criar um ponto único de falha.

Imagine um único catálogo.

Se ele desaparecer...

ninguém consegue registrar novos membros.

Por isso sempre existem pelo menos dois.

FR1

⇄

FR2

Os dois mantêm sincronização contínua.

Se um falhar...

o outro continua funcionando.

Essa redundância é um princípio clássico do IBM Z.


Partial Repository

Agora chegamos a uma das partes mais elegantes da arquitetura.

O Partial Repository não tenta conhecer o mundo inteiro.

Ele aprende apenas aquilo que realmente utiliza.

Imagine um funcionário do banco especializado apenas em financiamentos.

Ele não precisa decorar todas as regras de previdência privada.

Da mesma forma, um Partial Repository armazena somente as informações necessárias para executar seu trabalho.

Isso reduz consumo de memória, processamento e tráfego de rede.


Aprendizado sob demanda

Quando um Queue Manager precisa enviar uma mensagem para uma fila desconhecida, ele consulta um Full Repository.

O diálogo interno acontece mais ou menos assim.

PR

↓

"Quem possui esta fila?"

↓

FR

↓

"QM7"

↓

PR

↓

"Obrigado. Vou guardar essa informação."

Na próxima mensagem, ele já sabe o caminho.

É praticamente um cache inteligente.


O caminho percorrido pela mensagem

Para um programador COBOL, esse processo é fascinante porque praticamente nada muda no código.

A aplicação executa:

CALL 'MQPUT'

Ou utiliza a API correspondente.

A partir daí, começa uma sequência de decisões invisíveis.

Primeiro, o Queue Manager recebe a mensagem.

Depois verifica se a fila pertence ao Cluster.

Caso pertença, consulta suas informações locais.

Se necessário, conversa com um Full Repository.

Obtém todas as possíveis rotas.

Avalia disponibilidade.

Analisa balanceamento.

Seleciona o melhor destino.

Encaminha a mensagem.

A aplicação nunca participa dessas decisões.


O verdadeiro balanceamento de carga

Muitos acreditam que o IBM MQ distribui mensagens aleatoriamente.

Na realidade, ele considera diversos fatores.

Entre eles:

  • disponibilidade do Queue Manager

  • estado dos canais

  • pesos configurados

  • prioridade

  • ranking

  • afinidade

  • Cluster Workload Balancing

  • Cluster Workload Exit

Imagine três servidores.

QM2

QM3

QM4

Todos hospedam a mesma fila.

As mensagens podem ser distribuídas assim:

1 → QM2

2 → QM3

3 → QM4

4 → QM2

5 → QM3

6 → QM4

Nenhuma linha de código COBOL precisou ser alterada.


Alta Disponibilidade de verdade

Agora imagine que QM3 pare inesperadamente.

Em muitas arquiteturas antigas, seria necessário alterar configurações, reiniciar aplicações ou até modificar parâmetros em produção.

No IBM MQ Cluster, isso normalmente não acontece.

O middleware identifica que aquele Queue Manager está indisponível.

Automaticamente passa a enviar novas mensagens para os demais integrantes do Cluster.

Esse comportamento aumenta drasticamente a disponibilidade dos serviços.


O que acontece com mensagens persistentes?

Aqui entra um dos grandes diferenciais do IBM MQ.

Quando uma mensagem é persistente, ela é protegida pelos mecanismos de logging e recuperação do Queue Manager.

Caso ocorra uma falha durante a transmissão, entram em ação:

  • logs

  • commits

  • rollbacks

  • syncpoints

  • retries automáticos

É justamente essa confiabilidade que faz o IBM MQ continuar sendo um dos principais middlewares utilizados pelos maiores bancos do mundo.


Os canais continuam existindo

Outro mito bastante comum.

Cluster não elimina canais.

Ele apenas simplifica sua administração.

Sem Cluster, normalmente seria necessário criar inúmeros canais ponto a ponto.

QM1 → QM2

QM1 → QM3

QM1 → QM4

QM2 → QM5

Quanto mais Queue Managers...

mais canais.

No Cluster surgem conceitos como:

  • Cluster Sender

  • Cluster Receiver

A administração fica muito mais simples.


Escalabilidade praticamente transparente

Imagine uma Black Friday.

O processamento dobra.

Depois triplica.

O Queue Manager começa a atingir limites.

Sem Cluster seria necessário reconfigurar aplicações.

Com Cluster basta adicionar novos Queue Managers.

Eles passam a receber parte das mensagens automaticamente.

Essa expansão horizontal é um dos grandes motivos pelos quais o IBM MQ continua extremamente atual.


MQ Cluster não significa replicação

Esse ponto merece atenção.

O Cluster não replica automaticamente mensagens.

Também não compartilha filas.

Nem transforma vários Queue Managers em um único.

Cada Queue Manager continua responsável pelas próprias filas.

O Cluster apenas decide para qual deles cada mensagem deve ser enviada.


Comparando com tecnologias modernas

É impossível não perceber algumas semelhanças.

Hoje ouvimos falar diariamente em:

  • Kubernetes

  • Service Discovery

  • Service Mesh

  • API Gateway

  • Load Balancer

Todos trabalham com uma ideia semelhante.

As aplicações deixam de conhecer a infraestrutura física.

Existe uma camada intermediária responsável por encontrar o melhor destino.

O IBM MQ fazia exatamente isso quando muitos desses conceitos ainda nem existiam.


Onde o COBOL entra nessa história?

Aqui está uma das maiores lições para um Programador COBOL Padawan.

Você não precisa conhecer toda a infraestrutura para desenvolver uma boa aplicação.

Seu programa deve preocupar-se apenas com a lógica de negócio.

Quem decide:

  • onde executar

  • qual servidor utilizar

  • qual Queue Manager está disponível

  • qual caminho seguir

é o middleware.

Essa separação de responsabilidades é um dos maiores exemplos de arquitetura corporativa.


Curiosidades que poucos conhecem

Alguns fatos interessantes sobre MQ Clustering.

Curiosidade 1

O Cluster foi criado para reduzir drasticamente o custo administrativo em grandes ambientes com dezenas ou centenas de Queue Managers.


Curiosidade 2

Os Full Repositories normalmente não processam mensagens das aplicações.

Sua principal função é manter e distribuir metadados do Cluster.


Curiosidade 3

Partial Repositories aprendem dinamicamente novas rotas conforme a necessidade.

Isso reduz tráfego desnecessário.


Curiosidade 4

É possível possuir centenas de Queue Managers dentro de um único Cluster.


Curiosidade 5

Muitas instituições financeiras utilizam MQ Clustering em conjunto com tecnologias como IBM MQ Uniform Clusters, Multi-Instance Queue Managers, RDQM (em plataformas distribuídas), IBM z/OS Sysplex, CICS e IMS, criando arquiteturas extremamente resilientes.


Erros clássicos em entrevistas

Se você pretende trabalhar com middleware ou IBM MQ, evite responder estas afirmações.

❌ "Cluster compartilha filas."

Não compartilha.


❌ "Cluster replica mensagens."

Não necessariamente.


❌ "Full Repository recebe todas as mensagens."

Ele mantém metadados.


❌ "Partial Repository conhece todo o Cluster."

Conhece apenas o necessário.


❌ "Cluster elimina canais."

Não elimina.

Ele simplifica sua administração.


Easter Egg Bellacosa Mainframe

Existe uma analogia interessante para quem veio do mundo IBM Z.

Pense no VTAM.

Uma aplicação CICS normalmente não precisa conhecer todos os detalhes da infraestrutura física de rede.

Ela conversa com uma camada responsável por localizar recursos.

O MQ Cluster segue uma filosofia parecida.

As aplicações enxergam um ambiente lógico.

Quem conhece os detalhes físicos é o middleware.

Essa abstração é uma característica recorrente das tecnologias IBM: esconder a complexidade operacional para que o desenvolvedor possa concentrar seus esforços na regra de negócio.


A maior lição para um Programador COBOL Padawan

Quando começamos a programar, acreditamos que escrever código é a parte mais importante do trabalho.

Com o tempo percebemos que sistemas corporativos são muito maiores do que programas COBOL.

Eles são compostos por camadas especializadas que cooperam entre si: CICS gerencia transações, Db2 administra dados, RACF controla segurança, JES organiza o processamento batch e o IBM MQ coordena a comunicação entre aplicações.

O MQ Clustering representa um dos melhores exemplos dessa filosofia. Ele permite que aplicações continuem simples enquanto o middleware assume responsabilidades complexas como descoberta de serviços, balanceamento de carga, alta disponibilidade e roteamento inteligente.

Essa separação de responsabilidades explica por que os maiores bancos do mundo conseguem processar milhões de mensagens por hora com estabilidade. O desenvolvedor escreve um único MQPUT; o IBM MQ decide o restante.

E talvez essa seja a maior lição desta conversa: engenharia de software de alto nível não consiste em fazer cada componente saber tudo. Consiste em fazer cada componente saber apenas o necessário e confiar que a arquitetura fará o restante.

No universo IBM Z, essa ideia existe há décadas. Hoje ela recebe novos nomes na computação em nuvem, mas seu princípio continua exatamente o mesmo: desacoplamento, resiliência e inteligência distribuída. É por isso que estudar IBM MQ Clustering não é apenas aprender um produto — é compreender um dos fundamentos da arquitetura de sistemas corporativos modernos.


sábado, 13 de julho de 2024

IBM MQ — Quando The Postman Encontrou um Queue Manager, Viu Igor Tentando Mandar um PIX por E-mail e Decidiu Reconstruir a Civilização

 
Bellacosa Mainframe e o IBM MQ

☕ Um Café no Bellacosa Mainframe

IBM MQ — Quando The Postman Encontrou um Queue Manager, Viu Igor Tentando Mandar um PIX por E-mail e Decidiu Reconstruir a Civilização

Ou: Kevin Costner atravessou uma América quebrada com uma sacola de cartas, um jovem padawan COBOL descobriu que uma fila não é apenas uma espera, CICS encontrou Db2 no meio da estrada — e o carteiro ensinou que “mensagem entregue” é uma promessa séria demais para depender de sorte

Prólogo — A carta que não podia sumir

No filme The Postman (1997), Kevin Costner interpreta um sobrevivente num Estados Unidos pós-colapso. Em certo momento, ele veste o uniforme de um antigo carteiro e começa a levar cartas entre comunidades isoladas. Não são só papéis: aquelas mensagens transportam notícias, esperança, pedidos, vínculos e a prova de que ainda existe algum tipo de ordem naquele mundo quebrado.

IBM MQ é, guardadas as devidas proporções e sem o cavalo, o carteiro de sistemas corporativos.

Ele não entrega cartas manuscritas. Entrega uma solicitação de transferência, uma ordem de pagamento, uma reserva de voo, uma confirmação de compra, um aviso de fraude, um comando para atualizar estoque ou o pedido para emitir uma apólice. E sua grande missão é simples de dizer, difícil de cumprir e caríssima quando falha:

Receber a mensagem, guardá-la com segurança e entregá-la ao destino certo mesmo quando parte do mundo tecnológico está tendo um ataque de nervos.

Para quem está começando em COBOL, IBM MQ parece inicialmente “mais uma sopa de letras corporativa”. Temos JCL, CICS, Db2, VSAM, RACF, MQ, JES2, IMS e, em algum corredor escuro, Igor tentando resolver integração distribuída com um PERFORM UNTIL WS-TUDO-FUNCIONE.

Mas a ideia básica é muito humana: se eu preciso mandar algo importante e o destinatário não está disponível agora, não jogo a carta fora. Eu a deixo sob a responsabilidade de um serviço confiável.

E esse serviço é o IBM MQ.




1. O problema: sistemas não vivem no mesmo horário

Imagine um banco. O aplicativo móvel recebe um pedido:

Transferir R$ 500,00 da conta A para a conta B.

A aplicação do celular está na cloud. A validação antifraude pode estar em Kubernetes. O core bancário pode rodar COBOL, CICS e Db2 no z/OS. A notificação ao cliente pode estar em outra plataforma.

Se tudo fosse uma chamada síncrona, a história seria assim:

Aplicativo → chama serviço → chama outro serviço → chama CICS → espera

Agora imagine que o sistema de liquidação está em manutenção, a rede oscila ou uma região inteira reinicia. Se cada componente precisar estar vivo, rápido e de bom humor no mesmo instante, a operação vira uma torre de dominós.

A chamada síncrona tem seu lugar. Quando o cliente pergunta “qual é meu saldo?”, normalmente espera uma resposta agora. Mas uma instrução importante — “registre esta transferência” — pode ser tratada de outro modo:

Aplicativo → IBM MQ → fila segura → sistema processador

O aplicativo entrega a mensagem ao MQ e o MQ assume a responsabilidade de conservá-la até o consumidor poder trabalhar.

Essa separação é chamada de desacoplamento temporal. Produtor e consumidor deixam de precisar respirar no mesmo ritmo.



2. Afinal, o que é IBM MQ?

IBM MQ é um middleware de mensageria empresarial. “Middleware” é aquele software que vive entre aplicações e impede que elas precisem saber demais umas das outras.

Ele não é banco de dados. Não é API REST. Não é CICS. Não é Kafka. Não é uma planilha com uma coluna chamada “pendências”, embora algumas empresas tenham chegado perigosamente perto disso.

Ele é uma infraestrutura para troca confiável de mensagens.

Os principais personagens são:

PersonagemO que faz
Aplicação produtoraCria e envia uma mensagem
MensagemCarrega dados e metadados da operação
FilaEspera organizada para mensagens
Aplicação consumidoraRetira e processa a mensagem
Queue ManagerAdministra filas, logs, segurança e recuperação
CanalRota controlada entre Queue Managers

O Queue Manager é o carteiro-chefe, o gerente do correio e o sujeito que sabe onde cada carta está. Ele cria e gerencia filas, grava mensagens persistentes, controla acessos, conversa com outros Queue Managers e tenta evitar que uma falha técnica se transforme em perda de negócio.



3. Fila não é atraso; fila é proteção

Muita gente ouve “fila” e pensa: “então meu sistema ficou lento”.

Nem sempre.

Uma fila pode funcionar como amortecedor. Pense na Black Friday: o site recebe 20 mil pedidos por minuto, mas o faturamento legado consegue tratar 2 mil por minuto com segurança. Sem uma fila, o site pressiona o sistema de faturamento até ambos caírem de mãos dadas, como dois personagens de filme-catástrofe.

Com MQ:

Pedidos chegam rápido
        ↓
Fila IBM MQ absorve o pico
        ↓
Faturamento processa no ritmo seguro

A operação continua registrada. Pode haver espera, sim, mas espera controlada é muito melhor que pedido perdido, duplicado ou uma tela dizendo “Erro inesperado. Tente novamente” — frase que, no idioma do cliente, significa “o que aconteceu com meu dinheiro?”.

No mundo real, a profundidade de uma fila é um sinal de saúde. Uma fila crescendo pode indicar aumento legítimo de demanda, lentidão do consumidor, indisponibilidade, erro de conexão ou uma aplicação que resolveu entrar em meditação transcendental às 03h17.



4. Persistência: a carta entrou no cofre

Uma mensagem pode ser persistente ou não persistente.

Mensagens não persistentes servem para situações em que perder alguma informação é tolerável: telemetria, indicadores passageiros, dados de baixa criticidade. Já uma transferência financeira, uma ordem de compra ou uma emissão de bilhete precisa sobreviver a queda de processo, servidor ou conexão.

Quando configurada como persistente, a mensagem é registrada de forma recuperável pelo MQ. Se o Queue Manager cair depois de receber a mensagem, ele usa seus logs para recuperar um estado consistente no retorno.

Em português de boteco:

Não é “deixei um bilhete na mesa”. É “depositei a carta no cofre, peguei recibo e agora o carteiro responde por ela”.

Exemplo:

  1. Um programa COBOL coloca uma solicitação na fila.

  2. O MQ confirma que aceitou a mensagem.

  3. O sistema consumidor fica indisponível.

  4. A mensagem continua guardada.

  5. O consumidor volta.

  6. A operação é processada.

Isso é ouro em ambientes críticos.



5. O detalhe que separa demo de produção: commit e rollback

O padawan COBOL precisa guardar esta lição no bolso do uniforme do carteiro: MQ e Db2 precisam conversar direito.

Imagine que um programa CICS recebe uma mensagem para efetuar uma transferência. Ele precisa:

  • debitar a conta;

  • creditar a outra;

  • registrar auditoria;

  • talvez enviar uma mensagem de confirmação.

Se ele atualizar o Db2 e cair antes de confirmar o consumo da mensagem, ela pode reaparecer. Se mandar a mensagem e cair antes de atualizar o Db2, a integração pode contar uma história diferente do banco.

É aqui que entram unidades de trabalho e syncpoint.

A sequência saudável é:

GET da mensagem
↓
Atualizações no Db2
↓
Validações de negócio
↓
COMMIT
↓
Mensagem é definitivamente confirmada

Se algo falhar antes do COMMIT, pode ocorrer ROLLBACK: as atualizações são desfeitas e a mensagem permanece disponível para nova tentativa.

Mas atenção: “exactly once” não é feitiço de Hogwarts. MQ fornece mecanismos robustos de entrega e processamento transacional; ainda assim, a aplicação deve ser idempotente.

Idempotência significa que, se uma mesma instrução chegar de novo, o efeito de negócio não pode ser repetido indevidamente.

Exemplo: a mensagem possui um identificador único de transferência. Antes de debitar, o programa consulta uma tabela de controle. Se aquele identificador já foi liquidado, ele não debita novamente.

Porque uma fila confiável protege o transporte. Quem protege a regra “não cobrar duas vezes” é o desenho completo da solução.


6. Como COBOL conversa com MQ?

Em COBOL, o programa chama a API MQ. Os nomes clássicos aparecem como personagens de uma velha peça:

  • MQCONN — conecta ao Queue Manager;

  • MQOPEN — abre uma fila;

  • MQPUT — coloca uma mensagem;

  • MQGET — retira uma mensagem;

  • MQCLOSE — fecha a fila;

  • MQDISC — desconecta.

Um esqueleto conceitual de envio seria:

MOVE 'TRANSFERENCIA|000123|500.00' TO WS-MENSAGEM

CALL 'MQPUT'
  USING HCONN
        HOBJ
        MD
        PMO
        WS-TAMANHO
        WS-MENSAGEM
        COMPLETION-CODE
        REASON-CODE
END-CALL

Na vida real há estruturas, opções, códigos de retorno e cuidados com charset, tamanho, transação e tratamento de erro. Mas o conceito é simples: seu COBOL prepara uma mensagem e pede ao MQ que a coloque numa fila.

O consumidor faz o caminho inverso com MQGET.

Eis um bom conselho de mestre Jedi: não enfie regra de negócio inteira dentro do texto da mensagem. Defina contratos claros. Use campos identificáveis, versões de layout e documentação. Uma mensagem que ninguém entende seis meses depois é só um VSAM emocional.


7. Mensagem não é só conteúdo

Uma mensagem MQ tem corpo e metadados. O corpo pode trazer JSON, XML, texto delimitado, cópia COBOL, bytes binários ou outro formato acordado.

Os metadados ajudam muito:

  • MsgId: identificador da mensagem;

  • CorrelId: relaciona uma resposta ao pedido original;

  • prioridade;

  • data de expiração;

  • persistência;

  • formato;

  • identificador de aplicação;

  • contexto de segurança.

O CorrelId é especialmente útil em request-reply. Uma aplicação manda uma solicitação e espera uma resposta associada àquele pedido, não à resposta de algum outro cliente que estava passeando pela fila.

É o equivalente a escrever o número do protocolo na carta. Sem isso, o carteiro Kevin Costner entrega a resposta da sua transferência para o sujeito da reserva aérea, e logo Igor propõe “um ajuste manual temporário”.


8. Ordem, retries e as filas onde moram os monstros

MQ pode preservar ordem em uma fila, mas o arquiteto precisa perguntar: ordem de quê?

Com vários consumidores paralelos, prioridades, reprocessamentos e múltiplos caminhos, a ordem global pode não ser a mesma. Para uma reserva aérea, talvez seja necessário respeitar a sequência dos eventos daquela reserva específica:

RESERVA-CRIADA
PAGAMENTO-APROVADO
BILHETE-EMITIDO

Não é preciso impedir que outras reservas sejam processadas em paralelo. O segredo é usar chaves de correlação, identificadores de negócio e desenho consciente.

E quando a mensagem falha?

Ela não deve ser reprocessada eternamente como funcionário tentando autenticar num ambiente RACF com senha expirada. É preciso prever:

  • tentativas controladas;

  • fila de backout;

  • dead-letter queue;

  • monitoramento;

  • alertas de profundidade e idade da fila;

  • procedimento de investigação e reprocessamento.

A dead-letter queue não é o cemitério onde se joga a culpa. É uma caixa postal especial que diz: “esta mensagem não chegou ao destino; alguém precisa entender por quê”.


9. Segurança: o carteiro não entrega a carta para qualquer um

IBM MQ pode trabalhar com autenticação, autorização, TLS e integração com controles corporativos. Em z/OS, RACF pode definir quem conecta, quem abre uma fila, quem põe mensagens, quem lê e quem administra.

Uma boa configuração inclui:

  • canais protegidos por TLS;

  • certificados adequadamente geridos;

  • contas técnicas com privilégio mínimo;

  • regras por fila;

  • auditoria;

  • proteção contra dados sensíveis em logs;

  • monitoramento de acessos anormais.

MQ não torna uma arquitetura segura por telepatia. Ele oferece mecanismos para isso. Deixar uma fila financeira aberta para qualquer usuário técnico é como Kevin Costner entregar o saco de cartas ao primeiro miliciano de passagem e esperar boas práticas.


10. MQ, REST e Kafka: ninguém precisa sair na porrada

REST é ótimo quando alguém precisa perguntar e receber resposta imediata. MQ é ótimo quando uma instrução crítica precisa sobreviver a indisponibilidades. Kafka costuma ser poderoso para fluxos de eventos e múltiplos consumidores, especialmente em análise e streaming.

Uma empresa madura pode usar os três.

App chama API
↓
API valida pedido
↓
MQ entrega instrução ao core COBOL/CICS
↓
Db2 registra o estado
↓
Evento alimenta analytics

Modernização não significa jogar COBOL pela janela e substituir tudo por microsserviços com nomes de planetas. Significa conectar o que já é sólido ao que precisa evoluir.

O mainframe continua excelente onde consistência, escala, transação e disponibilidade importam. MQ é uma das pontes mais elegantes entre essa fortaleza e o resto do universo.


11. Roteiro de estudo para o padawan COBOL

Comece nesta ordem:

  1. Entenda produtor, consumidor, mensagem, fila e Queue Manager.

  2. Aprenda a diferença entre MQPUT e MQGET.

  3. Estude persistência e unidades de trabalho.

  4. Entenda COMMIT, ROLLBACK e idempotência.

  5. Pratique MsgId e CorrelId.

  6. Descubra o que são channels e comunicação entre Queue Managers.

  7. Estude segurança, TLS e autorização.

  8. Aprenda a monitorar filas, backout e dead-letter queue.

  9. Monte um laboratório simples: programa envia pedido, outro consome e registra resultado.

  10. Depois conecte isso a CICS e Db2.

O objetivo não é decorar siglas. É olhar para uma arquitetura e enxergar o caminho da mensagem: quem a criou, onde ela espera, quem a consome, o que acontece se algo cair e como provar que o negócio ficou consistente.

Epílogo — A república reconstruída por mensagens

No filme, o uniforme de carteiro vira símbolo de reconstrução. As pessoas voltam a acreditar que uma mensagem pode atravessar distância, caos e medo para alcançar alguém.

IBM MQ faz algo parecido no mundo corporativo. Ele não deixa sistemas conversarem apenas quando o céu está azul e todos os servidores estão felizes. Ele cria um mecanismo para que informações importantes resistam a falhas, picos, reinícios, lentidão e à inevitável criatividade humana em produção.

Para o programador COBOL iniciante, a lição é poderosa: você não escreve apenas programas que movem campos de uma área para outra. Em muitos ambientes, você escreve parte de uma cadeia que transporta decisões de negócio pelo mundo.

E, entre o MQPUT, o COMMIT, o Db2 e o consumidor do outro lado, existe um velho carteiro atravessando a estrada:

“A mensagem chegou ao MQ. Agora ela não está mais perdida. Ela tem destino, recibo, guarda e história.”

Porque nem todo problema precisa virar um ABEND — mas toda mensagem crítica merece um bom carteiro.

quinta-feira, 21 de setembro de 2023

IBM MQ: Muito Além das Filas — A Engenharia Invisível que Mantém Grandes Empresas em Movimento

 

Bellacosa Mainframe e o ibm mq muito alem das filas

IBM MQ: Muito Além das Filas — A Engenharia Invisível que Mantém Grandes Empresas em Movimento

"Se o banco autorizou seu PIX, a companhia aérea confirmou sua passagem e a operadora aprovou sua compra no cartão em poucos segundos, existe uma boa chance de que o IBM MQ tenha participado dessa conversa silenciosa entre sistemas."

A comparação entre administrar filas de mensagens e controlar o tráfego aéreo é extremamente feliz. Em ambos os casos, o objetivo não é apenas transportar algo de um ponto ao outro, mas garantir que cada "passageiro" (mensagem) chegue ao destino correto, na ordem adequada, sem colisões, sem perdas e com total rastreabilidade.

É justamente essa capacidade que fez do IBM MQ um dos pilares da integração corporativa por mais de três décadas.

Enquanto novas tecnologias aparecem todos os anos, o MQ permanece praticamente onipresente em bancos, seguradoras, bolsas de valores, empresas de logística, telecomunicações, governos e indústrias.

Isso acontece porque ele resolve um problema que nunca deixou de existir:

Como permitir que dezenas ou centenas de sistemas diferentes conversem entre si de forma confiável?


O verdadeiro problema não é enviar mensagens

Enviar uma mensagem é fácil.

Um socket TCP faz isso.

Uma API REST também.

Um POST HTTP consegue transportar informações perfeitamente.

O problema começa quando surgem perguntas muito mais difíceis:

  • E se o sistema destino estiver indisponível?

  • E se a rede cair durante a transmissão?

  • E se o consumidor estiver mais lento que o produtor?

  • E se houver milhares de mensagens por segundo?

  • Como garantir que nenhuma mensagem seja perdida?

  • Como recuperar mensagens após um desastre?

  • Como processar tudo exatamente uma única vez?

É aqui que o IBM MQ mostra por que continua sendo referência.

Ele não é apenas um mecanismo de envio.

Ele é um sistema completo de entrega garantida.


Local Queues: o coração do Queue Manager

O texto começa destacando as Local Queues.

Pode parecer apenas um objeto simples.

Na prática, elas representam o ponto onde toda a arquitetura converge.

Quando um programa COBOL executa:

MQPUT

ele normalmente está gravando em uma Local Queue.

Quando um programa Java faz:

put(message)

também.

Quando um serviço REST recebe uma requisição e publica uma mensagem...

...novamente estamos falando de uma Local Queue.

Ela é o "disco de pouso" das mensagens.


O ciclo de vida de uma fila

O artigo cita o CRUD clássico.

Mas cada comando tem implicações importantes.

DEFINE

Criar uma fila significa estabelecer diversas políticas:

  • persistência

  • tamanho máximo

  • profundidade

  • prioridade

  • triggering

  • cluster

  • segurança

  • compartilhamento

Não é simplesmente "criar uma pasta".

É definir comportamento operacional.


LIKE

Pouca gente utiliza adequadamente:

DEFINE QLOCAL(NOVA.FILA)
LIKE(FILA.MODELO)

Esse comando economiza horas.

Imagine uma organização com:

  • MAXDEPTH

  • DEFPSIST

  • SHARE

  • TRIGGER

  • MONQ

  • HARDENBO

todos configurados segundo padrões corporativos.

Copiar a definição evita inconsistências.

Em ambientes regulados isso é praticamente obrigatório.


ALTER

Alterar filas em produção exige cuidado.

Exemplo:

ALTER QLOCAL(PAGAMENTOS)
MAXDEPTH(500000)

Parece inocente.

Mas alterar atributos pode afetar:

  • performance

  • consumo de disco

  • comportamento das aplicações

Administradores experientes sempre avaliam o impacto antes de executar alterações.


CLEAR

Este comando merece respeito.

CLEAR QLOCAL(TESTE)

Ele elimina todas as mensagens.

Não existe "desfazer".

Jamais deve ser utilizado em produção sem absoluta certeza.


DELETE

Excluir uma fila exige planejamento.

Muitas aplicações dependem daquele objeto.

Apagar uma queue errada pode derrubar diversos sistemas ao mesmo tempo.


Filas maiores que 2 TB

Esse detalhe passa despercebido por muitos profissionais.

Quando pensamos em filas normalmente imaginamos alguns megabytes.

Na realidade, grandes bancos mantêm milhões de mensagens simultaneamente.

Imagine:

  • processamento noturno

  • liquidação financeira

  • cartões

  • PIX

  • TED

  • boletos

Durante picos, enormes volumes permanecem temporariamente armazenados.

O MQ foi projetado para esse cenário.


Remote Queues: desacoplamento arquitetural

Talvez este seja o ponto mais elegante do artigo.

Uma Remote Queue não contém mensagens.

Ela contém conhecimento.

Conhecimento sobre onde determinada mensagem deve chegar.

Esse conceito é chamado de indireção.

Na Engenharia de Software, indireção é uma das técnicas mais poderosas para reduzir acoplamento.


Sem Remote Queue

Aplicação precisa conhecer:

  • servidor

  • porta

  • canal

  • queue manager

  • fila destino

Toda alteração exige nova implantação.


Com Remote Queue

A aplicação apenas envia:

MQPUT
CLIENTES

O administrador decide:

  • qual servidor

  • qual Queue Manager

  • qual canal

  • qual rota

A aplicação permanece completamente ignorante da infraestrutura.

Esse desacoplamento reduz drasticamente custos de manutenção.


Uma analogia simples

Imagine enviar uma carta.

Sem MQ:

Você escreve diretamente o endereço completo.

Se o destinatário mudar de prédio, precisa reenviar todas as cartas.

Com MQ:

Você entrega a carta para a central de distribuição.

Ela sabe exatamente para onde encaminhar.

O remetente nunca precisa conhecer a rota.


RNAME, RQMNAME e XMITQ

Esses três atributos representam praticamente a tabela de roteamento do MQ.

RNAME

Destino real.

PAGAMENTOS

RQMNAME

Qual Queue Manager administra essa fila.

Pode estar em outra cidade.

Outro país.

Outro datacenter.


XMITQ

A "rodovia".

Ela guarda mensagens enquanto aguardam transporte.

Caso a comunicação seja interrompida, elas permanecem armazenadas.

Quando o canal voltar, seguem viagem automaticamente.

É uma fila de espera extremamente inteligente.


A beleza da transparência

O usuário destaca um benefício enorme:

Trocar infraestrutura sem alterar código.

Esse talvez seja o maior presente que um administrador pode oferecer aos desenvolvedores.

Mudanças ficam concentradas na infraestrutura.

Aplicações permanecem intactas.

Essa separação de responsabilidades é um princípio clássico de arquitetura corporativa.


Model Queues

Pouca gente conhece.

Menos gente ainda utiliza.

Imagine milhares de clientes conectados simultaneamente.

Cada um precisa de uma fila temporária.

Criar manualmente seria impossível.

A Model Queue resolve isso.

Ela funciona como uma classe em programação orientada a objetos.

A partir dela o MQ cria filas temporárias dinamicamente.

É extremamente elegante.


Services

Outro recurso subestimado.

Muitos sistemas precisam iniciar automaticamente processos auxiliares.

Por exemplo:

  • daemon Java

  • listener

  • programa C

  • script Shell

Em vez de depender do sistema operacional, o próprio MQ pode controlar esse ciclo de vida.

Resultado:

menos scripts

menos automações

menos pontos de falha.


Triggering

Aqui entramos em automação pura.

Imagine um supermercado.

Quando chegam dez clientes na fila do caixa...

automaticamente outro caixa é aberto.

Triggering faz exatamente isso.

Quando uma fila atinge determinada condição:

  • inicia um programa

  • desperta um consumidor

  • executa um processamento Batch

  • chama um serviço

Sem intervenção humana.

É um dos recursos mais antigos do MQ e continua extremamente eficiente.


dmpmqmsg

Administradores antigos ainda chamam de qload.

É praticamente um "canivete suíço".

Permite:

  • backup

  • restauração

  • migração

  • cópia

  • exportação

  • importação

Durante migrações entre ambientes ele costuma ser indispensável.


O comentário mais importante

O autor encerra com uma observação extremamente verdadeira:

A maioria dos problemas não está no IBM MQ.

Quem administra middleware sabe disso.

Quando algo "não chega", normalmente o MQ está funcionando exatamente como deveria.

Os problemas costumam estar em:

  • aplicações

  • canais bloqueados

  • certificados expirados

  • permissões OAM

  • firewalls

  • DNS

  • Cluster Receiver

  • Channel Authentication (CHLAUTH)

  • SSL/TLS

  • regras de roteamento

  • filas de transmissão congestionadas

O MQ normalmente apenas evidencia problemas existentes em outras camadas.


Linha de comando versus MQ Explorer

Essa pergunta desperta quase uma divisão filosófica.

MQ Explorer

Vantagens:

  • visual

  • intuitivo

  • excelente para iniciantes

  • facilita inspeções rápidas

Desvantagens:

  • menos automatizável

  • difícil em grandes ambientes


MQSC

Vantagens:

  • rapidez

  • scripts

  • versionamento

  • automação

  • DevOps

  • auditoria

Administradores experientes frequentemente preferem:

runmqsc

porque conseguem reproduzir alterações em dezenas de servidores utilizando exatamente os mesmos comandos.

Infrastructure as Code começa justamente aqui.


Uma reflexão arquitetural

O maior mérito do IBM MQ nunca foi apenas transportar mensagens.

Seu verdadeiro valor está em separar aplicações da infraestrutura.

Essa separação permite que empresas mudem servidores, troquem sistemas operacionais, modernizem datacenters, migrem para containers, integrem APIs REST, conectem aplicações em nuvem e mantenham sistemas COBOL escritos há décadas funcionando exatamente da mesma forma.

É uma demonstração clássica de engenharia de software bem executada: o produtor não precisa conhecer o consumidor, o consumidor não precisa conhecer o produtor e ambos continuam evoluindo de forma independente. Esse desacoplamento reduz riscos, facilita modernizações graduais e garante continuidade operacional — razão pela qual o IBM MQ permanece essencial em arquiteturas de missão crítica, mesmo em uma era dominada por microsserviços, APIs REST, eventos e plataformas em nuvem.

Em outras palavras, o IBM MQ não é apenas um produto de mensageria. Ele é uma camada estratégica de integração que protege as aplicações das mudanças inevitáveis da infraestrutura, permitindo que empresas inovem sem comprometer a estabilidade de seus sistemas mais críticos. É essa combinação de confiabilidade, escalabilidade e abstração que explica por que, mais de 30 anos após seu lançamento, o IBM MQ continua sendo um dos componentes mais respeitados e utilizados no ecossistema IBM Z e nas grandes arquiteturas corporativas.

sábado, 2 de março de 2019

🪽 HERMES E AS MENSAGENS QUE NÃO PODIAM SE PERDER

 

Bellacosa Mainframe e o sistema de menssegeria no ibm mainframe.

☕ Um Café no Bellacosa Mainframe

🪽 HERMES E AS MENSAGENS QUE NÃO PODIAM SE PERDER

IBM MQ, COBOL, CICS, filas, tópicos, Kafka, eventos, persistência, commit, rollback, retry, DLQ, idempotência, observabilidade — e o dia em que Hermes descobriu que entregar uma mensagem aos deuses era muito mais complicado do que simplesmente correr pelo Olimpo.



🎬 PRÓLOGO — O jovem programador e o mensageiro dos deuses

Imagine nosso jovem programador COBOL chegando para trabalhar.

08:07.

Café na mão.

ISPF aberto.

Nenhum ABEND.

Por enquanto.

Seu programa recebe uma transação, atualiza algumas informações no Db2 e precisa avisar outro sistema de que determinada operação aconteceu.

Ele pensa:

— Fácil. Eu chamo o outro programa.

Uma voz surge atrás dele:

— E se ele estiver fora do ar?

O jovem vira a cadeira.

Ali está um sujeito usando sandálias aladas, segurando um caduceu e olhando para o terminal 3270 como se aquilo fosse perfeitamente normal.

— Quem é você?

— Hermes.

Na mitologia grega, Hermes era o mensageiro dos deuses. Circulava entre diferentes mundos levando informações, ordens e notícias.

Em nossa história, portanto, ele conseguiu um emprego novo:

Arquiteto de Integração do Olimpo.

Hermes aponta para a tela.

— Padawan, você está cometendo o primeiro pecado da integração distribuída.

— Qual?

— Acreditar que todo mundo estará disponível quando você precisar.

E assim começa nossa viagem pela mensageria e integração assíncrona no mainframe.



🏛️ CAPÍTULO 1 — O OLIMPO NÃO É UMA ILHA

Durante muito tempo, quem começa a estudar mainframe pode desenvolver uma visão semelhante a esta:

COBOL
  │
  ├── JCL
  ├── CICS
  ├── Db2
  ├── VSAM
  └── IMS

Parece um ecossistema fechado.

Mas o mainframe moderno está conectado a praticamente tudo:

                    MAINFRAME
                        │
        ┌───────────────┼───────────────┐
        ▼               ▼               ▼
      Cloud           Mobile          Web
        │               │               │
        ├───────────────┼───────────────┤
        ▼               ▼               ▼
    APIs             Kafka          Analytics
        │                               │
        ▼                               ▼
 Microservices                    Data Platforms

Bancos, seguradoras, empresas aéreas, varejistas, indústrias e governos possuem aplicações construídas em tecnologias e épocas completamente diferentes.

Um programa COBOL pode precisar conversar com:

Java.

Python.

SAP.

Linux.

Windows.

Cloud.

Aplicações móveis.

Microsserviços.

Sistemas parceiros.

Plataformas analíticas.

Hermes sorri.

— Finalmente um trabalho digno de um mensageiro dos deuses.

Mas surge uma questão:

Como fazemos tantos mundos diferentes conversarem de maneira confiável?

Uma das respostas é mensageria.



⚡ CAPÍTULO 2 — ZEUS QUER UMA RESPOSTA AGORA

Antes de entender integração assíncrona, precisamos entender integração síncrona.

Imagine:

PROGRAMA A
    │
    │ REQUEST
    ▼
PROGRAMA B
    │
    │ PROCESSAMENTO
    ▼
 RESPONSE
    │
    ▼
PROGRAMA A

A envia uma solicitação.

A espera.

B processa.

B responde.

A continua.

Isso é perfeitamente adequado para inúmeras situações.

Quando você consulta o saldo bancário, por exemplo, normalmente quer a resposta naquele momento.

Zeus pergunta:

— Quanto tenho na conta?

Você dificilmente responderia:

— Senhor dos trovões, sua solicitação foi aceita. Talvez eu responda amanhã.

Talvez seja seu último dia no Olimpo.

Portanto, integração síncrona não é ruim.

O problema aparece quando fazemos tudo dessa maneira.



⏳ CAPÍTULO 3 — E SE APOLO ESTIVER FORA DO AR?

Considere:

CICS
 │
 └────────► SISTEMA B
               │
               X
             OFFLINE

Agora temos perguntas interessantes.

Quanto tempo o CICS deve esperar?

Cinco segundos?

Trinta?

Um minuto?

O que acontece com a transação?

Tentamos novamente?

Quantas vezes?

O usuário fica esperando?

Fazemos rollback?

É aí que Hermes coloca sobre a mesa uma pequena caixa.

— O que é isso?

— Uma fila.

O programador olha desconfiado.

Hermes escreve uma mensagem:

PEDIDO 4711

e coloca dentro da caixa.

— Agora posso ir embora.

— Mas ninguém recebeu!

— Ainda.

Essa palavra muda tudo.



📬 CAPÍTULO 4 — A CAIXA POSTAL DO OLIMPO

A arquitetura agora é:

PRODUTOR
    │
    │ mensagem
    ▼
┌───────────────┐
│     QUEUE     │
│               │
│ MSG 4711      │
└───────┬───────┘
        │
        ▼
   CONSUMIDOR

O produtor não precisa necessariamente esperar que o consumidor processe naquele instante.

Ele entrega a mensagem à infraestrutura de mensageria.

Esse conceito é fundamental:

DESACOPLAMENTO TEMPORAL

Produtor e consumidor não precisam necessariamente estar disponíveis simultaneamente.

Imagine um sistema CICS produzindo mensagens durante uma indisponibilidade temporária do consumidor.

CICS
 │
 ├── MSG 1001 ──► QUEUE
 ├── MSG 1002 ──► QUEUE
 ├── MSG 1003 ──► QUEUE
 └── MSG 1004 ──► QUEUE

                   CONSUMIDOR
                      OFFLINE

Posteriormente:

CONSUMIDOR ONLINE

QUEUE
 │
 ├── MSG 1001
 ├── MSG 1002
 ├── MSG 1003
 └── MSG 1004
       │
       ▼
PROCESSAMENTO

Esse princípio é conhecido como store-and-forward.

Hermes comenta:

— Finalmente inventaram algo melhor que minhas pernas.


🟦 CAPÍTULO 5 — HERMES CONHECE IBM MQ

No universo IBM Z, um dos grandes protagonistas dessa história é o IBM MQ.

Para nosso Padawan, vamos começar pelo modelo mais simples:

┌──────────────┐
│ COBOL / CICS │
└──────┬───────┘
       │
       │ MQPUT
       ▼
┌─────────────────────┐
│       IBM MQ        │
│                     │
│   Queue Manager     │
│         │           │
│         ▼           │
│       QUEUE         │
└─────────┬───────────┘
          │
          │ MQGET
          ▼
┌─────────────────────┐
│     CONSUMIDOR      │
└─────────────────────┘

Guarde inicialmente duas palavras:

MQPUT coloca uma mensagem.

MQGET obtém uma mensagem.

Claro que IBM MQ é muito maior que isso.

Mas todo Jedi começou segurando um sabre de treinamento.


💳 CAPÍTULO 6 — HERMES COMPRA UM CAFÉ

Hermes desce do Olimpo e compra um café.

R$ 12.

Uma simples compra pode provocar vários processamentos:

COMPRA
 │
 ├── autorização
 ├── registro financeiro
 ├── antifraude
 ├── notificação
 ├── cashback
 ├── analytics
 └── histórico

Agora imagine executar tudo sincronamente:

COMPRA
 │
 ├──► ANTIFRAUDE
 ├──► NOTIFICAÇÃO
 ├──► CASHBACK
 ├──► ANALYTICS
 └──► HISTÓRICO

Analytics ficou indisponível.

Devemos impedir Hermes de tomar café?

Provavelmente não.

Aqui surge uma importante decisão arquitetural:

O que precisa acontecer antes da resposta e o que pode acontecer depois?

Podemos ter:

                 COMPRA
                    │
                    ▼
              AUTORIZAÇÃO
                    │
                   OK
                    │
          ┌─────────┴─────────┐
          ▼                   ▼
     RESPONDE AO POS        EVENTO
                               │
                               ▼
                           MENSAGERIA
                               │
                 ┌─────────────┼─────────────┐
                 ▼             ▼             ▼
             Analytics     Cashback      Notificação

Agora estamos pensando como arquitetos.

Mensageria não é simplesmente colocar informações em uma fila.

É decidir onde podemos remover dependências.


🔖 CAPÍTULO 7 — O PERGAMINHO 4711

Integração assíncrona não significa necessariamente ausência de resposta.

Imagine que Hermes entregue:

REQUEST-ID = 4711

O consumidor processa e posteriormente envia:

CORRELATION-ID = 4711

Assim podemos relacionar:

REQUEST 4711
     │
     ▼
 processamento
     │
     ▼
RESPONSE 4711

Isso é correlação.

Imagine milhares de solicitações circulando pelo Olimpo.

Sem identificadores seria caos.

Correlation IDs também são extremamente úteis para observabilidade.

Quando alguém disser:

— Minha transação desapareceu!

você poderá procurar o identificador através das diferentes etapas.

Hermes chama isso de:

rastreamento do pergaminho sagrado.

O pessoal de observabilidade prefere chamar de tracing.


💾 CAPÍTULO 8 — A MENSAGEM NÃO PODE DESAPARECER

Nem toda mensagem possui a mesma importância.

Considere:

CPU = 43%

Talvez perder uma amostra de telemetria seja tolerável.

Agora considere:

TRANSFERENCIA
ORIGEM=123
DESTINO=456
VALOR=50000

A conversa muda.

Mensageria empresarial permite trabalhar com diferentes requisitos de persistência e confiabilidade.

Mas isso envolve trade-offs.

Persistência e garantias adicionais possuem custos.

Portanto a pergunta não é simplesmente:

"Persistente é melhor?"

A pergunta correta é:

"Qual nível de garantia o negócio exige?"

Essa mudança de pergunta é uma característica importante de engenharia.


🔄 CAPÍTULO 9 — HERMES ENTREGA A MESMA CARTA DUAS VEZES

Chegamos a uma das partes mais perigosas.

Uma mensagem diz:

PAGAR R$ 100
TRANSACTION-ID = ABC123

O consumidor processa.

PAGAMENTO OK

Mas alguma falha ocorre no momento errado.

A infraestrutura pode, dependendo do desenho e das garantias adotadas, apresentar a mensagem novamente.

O programa recebe:

PAGAR R$ 100
TRANSACTION-ID = ABC123

e paga novamente.

Agora temos:

R$100 + R$100 = R$200

E alguém recebe um telefonema às:

03:17.

Easter egg encontrado. ☕

A palavra mágica é:

IDEMPOTÊNCIA

O consumidor deve conseguir reconhecer que:

ABC123

já produziu seu efeito de negócio.

Por exemplo:

ABC123 JÁ PROCESSADA?

SIM ──► não repetir efeito
NÃO ──► processar

Esse assunto é fundamental quando ouvimos a expressão exactly-once.

Sempre pergunte:

Exactly-once onde?

No broker?

No transporte?

No consumidor?

No banco?

No efeito financeiro final?

Sistemas distribuídos adoram transformar frases simples em problemas profundamente interessantes.


☠️ CAPÍTULO 10 — MEDUSA ENTROU NA FILA

Agora temos:

MSG 001 → OK
MSG 002 → OK
MSG 003 → ERRO
MSG 004
MSG 005

Tentamos MSG 003 novamente.

Erro.

Novamente.

Erro.

Novamente.

Erro.

Ela petrifica qualquer consumidor que tente processá-la.

Hermes olha para a fila.

— Medusa.

Na engenharia chamamos algo semelhante de poison message.

Precisamos impedir ciclos infinitos:

GET
 │
 ▼
ERROR
 │
 ▼
ROLLBACK
 │
 ▼
GET
 │
 ▼
ERROR

Uma arquitetura madura estabelece políticas de retry e tratamento de mensagens problemáticas.

Depois de determinado tratamento ou número de tentativas, a mensagem pode ser direcionada para análise.

Entram em cena mecanismos associados a Dead-Letter Queues.

QUEUE
  │
  ▼
PROCESSAMENTO
  │
  ├──────────────► OK
  │
  ▼
 ERROR
  │
  ▼
 RETRY
  │
  ▼
continua falhando
  │
  ▼
 DLQ

Mas atenção:

DLQ não é cemitério.

Uma DLQ que ninguém monitora é apenas um lugar elegante para esconder incidentes.


⏱️ CAPÍTULO 11 — NÃO ATAQUE UM SISTEMA QUE JÁ ESTÁ CAÍDO

Retry também pode causar desastre.

Imagine 100 mil mensagens falhando.

Todas tentam novamente imediatamente.

100.000
   │
   ▼
 RETRY
   │
   ▼
SERVIÇO DOENTE

O serviço tenta recuperar-se enquanto recebe uma avalanche.

Podemos utilizar estratégias de backoff:

tentativa 1
    │
    ▼
espera
    │
tentativa 2
    │
    ▼
espera maior
    │
tentativa 3

Também pode haver jitter, introduzindo variação para evitar que milhares de clientes façam retry exatamente no mesmo instante.

Hermes resume:

— Se a porta do templo está quebrada, mandar dez mil pessoas baterem nela simultaneamente dificilmente vai consertá-la.


🔐 CAPÍTULO 12 — HADES DESCOBRE COMMIT E ROLLBACK

Agora entramos em território profundamente mainframe.

Imagine:

CICS
 │
 ├── UPDATE Db2
 │
 └── MQPUT

Queremos consistência.

Uma situação perigosa seria:

Db2 = COMMIT
MQ  = ROLLBACK

Ou o inverso:

Db2 = ROLLBACK
MQ  = COMMIT

Dependendo da arquitetura e dos recursos envolvidos, CICS, Db2 e MQ podem participar de unidades de trabalho coordenadas.

Conceitualmente:

┌─────────────────────────────┐
│        UNIT OF WORK         │
│                             │
│ UPDATE DB2                  │
│ MQPUT                       │
│                             │
│ COMMIT / ROLLBACK           │
└─────────────────────────────┘

E aqui existe uma deliciosa curiosidade histórica.

Muita gente olha para arquiteturas modernas distribuídas como se problemas de consistência tivessem sido descobertos ontem.

Mainframeiros olham para aquilo segurando uma xícara de café e pensam:

— Interessante. Estamos discutindo commit, rollback, recovery e integridade há algumas décadas.


📢 CAPÍTULO 13 — HERMES DESCOBRE O PUB/SUB

Fila e tópico não são a mesma coisa.

No modelo clássico de queue:

PRODUTOR
    │
    ▼
  QUEUE
    │
    ▼
CONSUMIDOR

Agora imagine um acontecimento:

PAYMENT.APPROVED

Muitos sistemas estão interessados.

                  PAYMENT.APPROVED
                         │
                         ▼
                       TOPIC
                         │
             ┌───────────┼───────────┐
             ▼           ▼           ▼
         Marketing   Analytics   Notificação

Entramos em Publish/Subscribe.

O produtor publica algo.

Interessados assinam.

Isso permite diminuir determinado tipo de acoplamento.

Em vez de:

A conhece B
A conhece C
A conhece D
A conhece E

podemos ter:

A
│
▼
"PAYMENT.APPROVED"
│
▼
BROKER

A informa que algo aconteceu.

Os interessados decidem o que fazer.


📜 CAPÍTULO 14 — COMANDO NÃO É EVENTO

Hermes recebe dois pergaminhos.

Primeiro:

GENERATE-INVOICE

Segundo:

INVOICE-GENERATED

Parecem semelhantes.

Semanticamente são diferentes.

O primeiro é uma intenção ou comando:

Faça alguma coisa.

O segundo descreve um fato:

Alguma coisa aconteceu.

Compare:

COMMAND
└──► SHIP-ORDER

com:

EVENT
└──► ORDER-SHIPPED

Essa distinção é extremamente importante em arquiteturas orientadas a eventos.

Um evento deve representar algo significativo que ocorreu no domínio.


🐘 CAPÍTULO 15 — ZEUS PERGUNTA: "E KAFKA?"

É inevitável.

Alguém menciona mensageria.

Cinco minutos depois:

Kafka.

Apache Kafka é uma plataforma de event streaming distribuído.

Mas não devemos resumir a discussão a:

Kafka = MQ novo

ou:

MQ = Kafka velho

É uma simplificação ruim.

Como primeiro mapa mental:

IBM MQ
 │
 ├── queues
 ├── reliable messaging
 ├── integração empresarial
 ├── routing
 └── forte tradição transacional

Enquanto Kafka trabalha fortemente com conceitos como:

Kafka
 │
 ├── topics
 ├── partitions
 ├── offsets
 ├── retention
 ├── replay
 └── event streaming

No Kafka, podemos imaginar:

TOPIC
 │
 ├── PARTITION 0
 │      ├── EVENT 0
 │      ├── EVENT 1
 │      └── EVENT 2
 │
 └── PARTITION 1
        ├── EVENT 0
        └── EVENT 1

Consumidores acompanham posições usando offsets.

Dependendo da retenção e arquitetura, eventos podem ser relidos.

Isso abre possibilidades interessantes para:

analytics,

event streaming,

integração,

reprocessamento,

data platforms,

event-driven architectures.


🤝 CAPÍTULO 16 — MQ E KAFKA NÃO PRECISAM DUELAR

Hermes coloca IBM MQ de um lado.

Kafka do outro.

Zeus prepara um raio.

— Que vença o melhor!

Hermes responde:

— Não funciona assim.

Podemos perfeitamente encontrar arquiteturas contendo:

              IBM Z
                │
        COBOL / CICS
        Db2 / IMS
                │
                ▼
              IBM MQ
                │
       ┌────────┴────────┐
       ▼                 ▼
 Sistemas            Integração
 corporativos             │
                          ▼
                        Kafka
                          │
             ┌────────────┼────────────┐
             ▼            ▼            ▼
          Cloud       Analytics      Data

Não precisamos transformar tecnologia em religião.

A pergunta profissional é:

Qual problema estou tentando resolver?


📚 CAPÍTULO 17 — O COPYBOOK ENCONTRA O JSON

Mensageria precisa de contratos.

Imagine:

{
  "customer": 123,
  "amount": 500
}

Alguém altera para:

{
  "customerId": 123,
  "amount": 500,
  "currency": "BRL"
}

Consumidores antigos podem ter problemas.

O programador COBOL deveria imediatamente reconhecer o conceito.

Veja:

01 CUSTOMER-RECORD.
   05 CUSTOMER-ID       PIC 9(10).
   05 CUSTOMER-NAME     PIC X(40).
   05 CUSTOMER-STATUS   PIC X.

Copybooks também representam contratos estruturais entre programas e dados.

No ecossistema distribuído encontramos mecanismos como:

JSON Schema,

Avro,

Protocol Buffers.

Todos enfrentam questões familiares:

estrutura,

tipos,

campos,

versões,

compatibilidade,

evolução.

Portanto, quando alguém disser que contratos de dados são uma inovação moderna, não discuta.

Tome um café.

Mostre um copybook de 1987.

Continue trabalhando.


📈 CAPÍTULO 18 — A FILA COMEÇA A ENGORDAR

Agora Hermes encontra:

PRODUTOR
10.000 mensagens/s

CONSUMIDOR
6.000 mensagens/s

Temos:

10.000 - 6.000
=
4.000 mensagens/s

acumulando.

Em uma hora:

4.000 × 3.600
=
14.400.000 mensagens

Nenhum programa necessariamente sofreu ABEND.

Nenhum servidor necessariamente caiu.

Mesmo assim temos um incidente crescendo.

Esse fenômeno nos leva ao conceito de backpressure.

PRODUÇÃO
10.000/s
    │
    ▼
████████████████████████████
            QUEUE
              │
              ▼
           6.000/s
         CONSUMIDOR

Agora precisamos pensar em capacidade.

Podemos aumentar consumidores?

Existe processamento paralelo?

Precisamos preservar ordenação?

Qual o tamanho das mensagens?

Quanto podemos acumular?

Qual é o SLA?

Qual é o limite operacional?


🔭 CAPÍTULO 19 — HERMES INSTALA OBSERVABILIDADE NO OLIMPO

Mensageria sem observabilidade pode virar uma caixa-preta.

Precisamos conhecer coisas como:

queue depth
message age
throughput
consumer rate
processing latency
error rate
retry count
DLQ depth
end-to-end latency

Existe uma armadilha particularmente interessante.

Uma fila contendo:

100.000 mensagens

pode estar saudável se processar centenas de milhares rapidamente.

Enquanto outra contendo:

37 mensagens

pode estar em situação crítica se a mensagem mais antiga estiver esperando quatro horas.

Portanto:

QUEUE DEPTH NÃO CONTA TODA A HISTÓRIA.

Precisamos observar também message age.

Pergunte:

Qual é a idade da mensagem mais antiga?

Essa simples pergunta pode revelar problemas invisíveis.


🔢 CAPÍTULO 20 — A ORDEM DOS PERGAMINHOS

Considere:

1 CUSTOMER.CREATED
2 CUSTOMER.UPDATED
3 CUSTOMER.DELETED

Esperamos:

1 → 2 → 3

Mas sistemas distribuídos e processamento paralelo exigem cuidado com ordenação.

Imagine:

1 → 3 → 2

Agora tentamos atualizar algo depois de excluí-lo.

Surge outra grande decisão arquitetural:

Onde realmente precisamos preservar ordem?

Ordenação global pode limitar paralelismo e throughput.

Por isso tecnologias modernas trabalham com conceitos como:

partition,

key,

grouping,

sequence.

Às vezes precisamos preservar ordem apenas para determinado cliente:

CUSTOMER 123
1 → 2 → 3

enquanto outro cliente pode ser processado independentemente:

CUSTOMER 999
1 → 2 → 3

Isso permite paralelismo sem abandonar a ordem relevante para o negócio.


🕸️ CAPÍTULO 21 — O ESPAGUETE ASSÍNCRONO

Hermes abre um diagrama antigo.

A → Q1 → B
    │
    └── Q2 → C
              │
              Q7
              │
              ▼
              D → Q13
                   │
                   ▼
                   E → Q29
                        │
                        ▼
                        ???

— Quem criou Q29?

Silêncio.

— Quem consome?

Silêncio.

— Podemos remover?

Um velho programador COBOL levanta lentamente a cabeça:

— Está aí desde 2004.

Hermes:

— E?

— Melhor não mexer.

Bem-vindo à arqueologia corporativa.

Mensageria também pode produzir spaghetti architecture.

Por isso precisamos de:

documentação,

ownership,

catálogo de interfaces,

contratos,

versionamento,

observabilidade,

governança,

naming standards,

políticas de retenção,

procedimentos de recuperação.

Tecnologia excelente sem governança continua capaz de produzir caos excelente.


🌉 CAPÍTULO 22 — MODERNIZAR NÃO SIGNIFICA DEMOLIR O TEMPLO

Existe uma visão simplista:

MODERNIZAÇÃO
=
tirar COBOL

Não.

Modernização pode significar:

             COBOL
               │
        negócio crítico
               │
       ┌───────┴────────┐
       ▼                ▼
      API              MQ
       │                │
       ▼                ▼
  síncrono          assíncrono
       │                │
       └────────┬───────┘
                ▼
           ECOSSISTEMA
                │
       ┌────────┼────────┐
       ▼        ▼        ▼
     Cloud    Kafka    Mobile

O COBOL pode continuar executando perfeitamente a lógica crítica.

Mudamos a maneira como essa lógica participa do ecossistema.

Isso também é modernização.

Talvez o problema nunca tenha sido o programa COBOL.

Talvez fosse o acoplamento em torno dele.


🧭 CAPÍTULO 23 — PASSO A PASSO DO PADAWAN

Se você está começando agora, não tente aprender IBM MQ inteiro em um fim de semana.

Hermes recomenda uma trilha.

Passo 1 — Entenda produtor e consumidor.

Quem cria a mensagem?

Quem processa?

Passo 2 — Entenda queue.

Aprenda o modelo básico:

PRODUCER → QUEUE → CONSUMER

Passo 3 — Estude PUT e GET.

No universo MQ:

MQPUT
MQGET

Passo 4 — Estude persistência.

O que acontece se alguma coisa cair?

Passo 5 — Estude unidade de trabalho.

COMMIT
ROLLBACK

Passo 6 — Provoque erros mentalmente.

Pergunte sempre:

E SE?

E se o consumidor cair?

E se a rede cair?

E se receber duas vezes?

E se a mensagem estiver inválida?

E se 10 milhões chegarem?

E se ficarem seis horas esperando?

Passo 7 — Estude correlação.

Aprenda a seguir uma transação ponta a ponta.

Passo 8 — Estude retry e DLQ.

Falha não é exceção em sistemas distribuídos.

Falha faz parte do projeto.

Passo 9 — Estude idempotência.

Pergunte:

Posso executar isso duas vezes sem cobrar duas vezes o cliente?

Passo 10 — Aprenda Pub/Sub.

Depois diferencie:

COMMAND

de:

EVENT

Passo 11 — Estude Kafka.

Somente então compare modelos.

Passo 12 — Aprenda observabilidade.

Não basta entregar mensagens.

Precisamos provar que foram entregues e saber o que aconteceu quando não foram.


🧠 CAPÍTULO 24 — AS PERGUNTAS QUE TRANSFORMAM O PROGRAMADOR EM ENGENHEIRO

Quando receber uma integração para desenvolver, não pergunte apenas:

Qual COPYBOOK?

Pergunte:

Precisa ser síncrona?

Pode ser assíncrona?

Podemos receber duplicatas?

Precisamos preservar ordem?

Qual é o SLA?

Quanto tempo podemos acumular?

Qual é a unidade de trabalho?

Quem faz commit?

O que acontece no rollback?

Existe retry?

Qual política de backoff?

Existe DLQ?

Quem monitora a DLQ?

Existe correlation ID?

Como fazemos tracing?

O contrato possui versão?

Quem é o owner?

Como recuperamos mensagens?

Como sabemos que a recuperação terminou?

Essas perguntas valem muito mais do que simplesmente decorar uma API.


🏛️ EPÍLOGO — HERMES ENTREGA A ÚLTIMA MENSAGEM

Anoitece no Olimpo.

Nosso Padawan fecha o ISPF.

Hermes guarda seu caduceu.

O jovem programador finalmente percebe que passou o dia inteiro estudando filas, tópicos, mensagens, eventos, MQ, Kafka, commit, rollback, idempotência, DLQ, retry e observabilidade.

Mas aprendeu algo maior.

Mensageria não é sobre transportar bytes.

É sobre administrar dependências entre sistemas que inevitavelmente falharão em momentos diferentes.

Uma arquitetura síncrona pergunta:

"Você está disponível agora?"

Uma arquitetura assíncrona pode dizer:

"Tenho algo importante para você. Pegue quando puder, dentro das regras que estabelecemos."

Essa diferença permite construir sistemas extraordinariamente resilientes.

Hermes coloca sobre a mesa seu último pergaminho:

MESSAGE-ID: HERMES-0001
PERSISTENCE: YES
CORRELATION-ID: BELLACOSA
STATUS: DELIVERED

O Padawan pergunta:

— Então finalmente entendi IBM MQ?

Hermes ri.

— Não.

— Não?!

— Você entendeu algo mais importante.

— O quê?

Hermes aponta para o mainframe.

Por que ele existe.

Porque sistemas críticos não vivem em um universo perfeito.

Redes caem.

Serviços param.

Consumidores atrasam.

Mensagens chegam duplicadas.

Dados mudam.

Filas crescem.

Aplicações sofrem rollback.

Máquinas reiniciam.

Deploys dão errado.

E eventualmente alguém faz alguma coisa inexplicável numa sexta-feira à tarde.

Engenharia de sistemas críticos não consiste em acreditar que nada disso acontecerá.

Consiste em construir sistemas preparados para continuar corretos quando acontecer.

Talvez seja justamente por isso que conceitos de mensageria combinam tão bem com o mundo mainframe.

O mainframe nunca foi construído partindo da pergunta:

"Como fazemos uma demonstração bonita?"

Ele nasceu em um mundo que perguntava:

"O que acontece se isso der errado?"

Essa pergunta atravessou gerações.

Do batch ao CICS.

Do VSAM ao Db2.

Do terminal 3270 às APIs.

Do MQ ao Kafka.

Do datacenter à cloud.

As tecnologias mudaram.

A responsabilidade permaneceu.

Hermes calça novamente suas sandálias aladas.

Antes de partir, olha uma última vez para nosso jovem programador COBOL:

— Amanhã estudaremos uma coisa chamada event-driven architecture.

O Padawan sorri:

— Parece moderno.

Hermes também sorri.

— É. Mas traga café.

— Por quê?

— Porque os humanos inventaram um nome novo para algo que vai nos fazer discutir commit, rollback, entrega, ordenação e recuperação outra vez.

E desaparece pelos corredores do Olimpo.

No terminal permanece apenas uma mensagem:

***************************************
* HERMES MESSAGE DELIVERY SYSTEM      *
***************************************

MESSAGE ......... BELLACOSA-0317
STATUS .......... DELIVERED
QUEUE DEPTH ..... 00000000
OLDEST MSG AGE .. 00:00:00
DLQ DEPTH ....... 00000000

ALL SYSTEMS NORMAL.

***************************************
* NEVER TRUST "ALL SYSTEMS NORMAL".   *
***************************************

Nosso Padawan olha para o relógio.

03:17.

Em algum lugar do datacenter, uma fila começa lentamente a crescer.

QUEUE DEPTH: 00000001

Hermes já havia ido embora.

Mas a aula seguinte acabara de começar.


☕ Moral do Bellacosa Mainframe

Mensageria não é colocar uma mensagem numa fila.

É saber:

quem envia, quem recebe, quando recebe, quantas vezes pode receber, em qual ordem, durante quanto tempo podemos esperar, o que acontece se ninguém receber, como recuperamos, como impedimos duplicidade, como observamos o caminho e como mantemos o negócio correto quando alguma peça inevitavelmente falhar.

Quando o programador COBOL começa a fazer essas perguntas, deixa de enxergar apenas programas.

Passa a enxergar sistemas.

Quando começa a enxergar sistemas, deixa de tratar MQ como apenas mais uma API.

Passa a compreender arquitetura.

E quando entende arquitetura, finalmente percebe por que Hermes, mensageiro dos deuses, teria se sentido perfeitamente em casa diante de um IBM Z:

uma mensagem só cumpriu sua missão quando chegou ao destino certo, no contexto certo, com integridade — e existe evidência suficiente para provar isso.

Bem-vindo ao Bellacosa Mainframe. Onde até os deuses precisam respeitar COMMIT e ROLLBACK.

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