Durante a operação de um sistema de pagamentos de uma fintech brasileira baseado em transações via protocolo ISO8583 (Maquininhas e Transações fisicas), nossa equipe enfrentou um desafio crítico: timeouts intermitentes na comunicação com o adquirente, afetando a confiabilidade e latência das autorizações.
Após uma análise detalhada e aplicação de técnicas de debugging em redes e sockets, conseguimos minimizar o problema com ajustes precisos nas configurações de TCP e buffers do socket Python.
📍 O cenário
Nosso sistema, escrito em Python, se conectava diretamente ao adquirente utilizando uma implementação customizada do protocolo ISO 8583 sobre TCP/IP. Em determinados horários, notamos que as requisições apresentavam timeouts aparentemente aleatórios, mesmo quando o servidor remoto (adquirente) estava saudável e o payload estava correto.
Esses timeouts, além de prejudicar a taxa de sucesso das transações, também aumentavam a complexidade operacional e exigiam reprocessamentos.
O que é o protocolo ISO 8583?
ISO 8583 é um padrão internacional que define como sistemas de transações financeiras eletrônicas (como cartões de crédito, débito e terminais POS/ATM) devem se comunicar.
Criado originalmente para o setor bancário, ele especifica a estrutura das mensagens, os campos de dados, os tipos de transações (como venda, cancelamento, consulta de saldo) e como essas mensagens devem ser codificadas, transmitidas e interpretadas entre sistemas como adquirentes, emissores, gateways e redes de pagamento.
Principais características:
Usa o modelo cliente-servidor sobre TCP/IP ou outras camadas.
Cada mensagem contém um MTI (Message Type Identifier) que define seu propósito (ex: requisição de autorização).
Os dados são organizados em campos numerados chamados Data Elements (DE).
Pode ter bitmaps para indicar quais campos estão presentes.
É um protocolo binário ou ASCII estruturado, dependendo da implementação.
Exemplo de mensagens:
0100 – Requisição de autorização.
0110 – Resposta à autorização.
0200 – Transação financeira (ex: compra).
0420 – Estorno.
🔍 Como debugamos
Nosso processo de investigação seguiu as seguintes etapas:
- Habilitamos logs de baixo nível no cliente ISO 8583, incluindo logs de envio, recebimento e tempo de resposta.
- Utilizamos ferramentas como
tcpdump
,wireshark
enetstat
para observar o comportamento da conexão TCP. - Monitoramos filas de sistema, utilização de file descriptors e buffers de socket no sistema operacional.
- Correlacionamos os horários de falha com picos de volume e throughput de rede.
Com isso, identificamos que:
- O buffer de envio e recepção do socket estava sendo saturado em alguns momentos.
- A latência aumentava ligeiramente antes dos timeouts.
- Havia retransmissões TCP e atrasos no ACK durante a transmissão do pacote ISO.
🛠️ A solução: ajustes nos sockets
Realizamos os seguintes ajustes no cliente ISO 8583 Python:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Aumentamos os buffers de envio e recepção
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)
# Definimos TCP_NODELAY para evitar delays por Nagle
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
# Reduzimos o timeout para reações rápidas
sock.settimeout(5) # Ajustável conforme SLA do adquirente
# Conectamos e seguimos com a transmissão
sock.connect((host, port))
🔗 Links úteis sobre ISO 8583:
Wikipedia (Inglês)
https://en.wikipedia.org/wiki/ISO_8583
ISO 8583 Message Structure
https://www.ibm.com/docs/en/devops-test-workbench/11.0.2?topic=schemas-iso-8583-overview-structure
ISO 8583 Emulator Server
https://github.com/yrosaguiar/iso8583-server
Repositório Python ISO8583 (PyISO8583)
https://pypi.org/project/pyiso8583/
Doc estrutura ISO8583
https://pyiso8583.readthedocs.io/en/latest/