Como minizamos timeouts intermitentes em transações ISO-8583 com ajustes em TCP e buffers no Python
Yros Aguiar

Yros Aguiar @yros_aguiar_e4a99aaab452d

About: IT professional with over 18 years, 9 years experience in SRE/DevOps operations, 11 years of Cloud Applications Experience, driving excellence in the delivery of innovative services and solutions. Pa

Joined:
Jun 4, 2025

Como minizamos timeouts intermitentes em transações ISO-8583 com ajustes em TCP e buffers no Python

Publish Date: Jun 4
0 0

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:

  1. Habilitamos logs de baixo nível no cliente ISO 8583, incluindo logs de envio, recebimento e tempo de resposta.
  2. Utilizamos ferramentas como tcpdump, wireshark e netstat para observar o comportamento da conexão TCP.
  3. Monitoramos filas de sistema, utilização de file descriptors e buffers de socket no sistema operacional.
  4. 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))
Enter fullscreen mode Exit fullscreen mode

🔗 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/

Comments 0 total

    Add comment