Quem desenvolve APIs de alta performance no ecossistema Delphi e Lazarus conhece bem o Horse. Ele se consolidou como o framework web mais querido e utilizado devido à sua filosofia minimalista, velocidade e consumo irrisório de recursos.
No entanto, à medida que a web evolui, novos desafios surgem. Até então, para enviar qualquer resposta HTTP, o Horse dependia de carregar todo o payload de dados na memória do servidor para depois escrevê-lo fisicamente no socket do cliente. Para grandes relatórios JSON, exportações em lote ou transmissões de dados em tempo real, isso gerava picos de consumo de memória física (heap) sob alta concorrência.
Com a chegada das arquiteturas modernas de Inteligência Artificial Generativa (onde o modelo responde palavra por palavra via tokens) e dashboards de monitoramento contínuo, a transmissão incremental de dados tornou-se mandatória. É com muito orgulho que anunciamos o suporte nativo a Web Streams e Server-Sent Events (SSE) no Horse!
O que é Streaming HTTP e por que você precisa dele?
Diferente do fluxo tradicional Request-Response (onde o cliente faz a pergunta e aguarda a resposta inteira ficar pronta), o Streaming HTTP permite que o servidor vá enviando pequenos pedaços (chunks) de dados assim que eles são gerados no backend.
Existem dois cenários principais onde essa abordagem brilha:
- Web Streams (NDJSON): Excelente para transmitir grandes volumes de registros estruturados (como milhares de linhas de banco de dados) de forma contínua, linha a linha, sem estourar o limite de memória RAM do cliente ou do servidor.
- Server-Sent Events (SSE): Protocolo padronizado que mantém uma conexão unidirecional persistente aberta. O servidor pode enviar eventos e mensagens assíncronas em tempo real ao cliente utilizando uma única conexão HTTP comum, sem a complexidade de negociação do WebSocket.
Como Funciona no Core do Horse
A arquitetura foi desenhada com foco em compatibilidade multiplataforma absoluta. Introduzimos a interface IHorseStreamWriter, que expõe métodos simplificados e thread-safe para monitorar a conectividade física do cliente e enviar dados continuamente:
type
IHorseStreamWriter = interface
function IsConnected: Boolean;
procedure Write(const AContent: string);
procedure Close;
end;
O Horse gerencia automaticamente o encerramento da conexão e o ciclo de vida dos sockets em todos os provedores suportados (Indy, HttpSys, IOCP e Epoll), garantindo que os cabeçalhos HTTP e cookies originais sejam enviados de forma segura antes do início da transmissão.

Painel interativo demonstrando a recepção de dados via Web Streams, Server-Sent Events e a fluidez de um chatbot de IA em tempo real com delay de digitação natural.
Mão na Massa: Implementando Web Streams (NDJSON)
No exemplo a seguir, criamos uma rota no Horse que envia múltiplos registros de forma incremental, simulando o processamento ou leitura de blocos de dados. Veja como a implementação é limpa:
THorse.Get('/ndjson',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Res.ContentType('application/x-ndjson; charset=utf-8');
Res.SendStream(
procedure(const AWriter: IHorseStreamWriter)
var
I: Integer;
LJSON: string;
begin
for I := 1 to 10 do
begin
// Verifica se o cliente web ainda está conectado na outra ponta
if not AWriter.IsConnected then Break;
LJSON := Format('{"id": %d, "message": "Registro %d de 10"}'#10, [I, I]);
AWriter.Write(LJSON);
Sleep(500); // Simula leitura do banco de dados
end;
end);
end);
registry.com.br
Utilizando Server-Sent Events (SSE) para Mensagens em Tempo Real
Para criar canais de telemetria ou notificações que se integram perfeitamente com a API EventSource nativa dos navegadores web modernos, basta configurar os cabeçalhos de conexão persistente e utilizar a assinatura SSE:
THorse.Get('/sse',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Res.ContentType('text/event-stream; charset=utf-8');
Res.AddHeader('Cache-Control', 'no-cache');
Res.AddHeader('Connection', 'keep-alive');
Res.SendStream(
procedure(const AWriter: IHorseStreamWriter)
var
I: Integer;
begin
for I := 1 to 5 do
begin
if not AWriter.IsConnected then Break;
// Formato padronizado do SSE
AWriter.Write(Format('event: message'#10'data: {"id": %d, "count": %d}'#10#10, [I, I]));
Sleep(1000);
end;
end);
end);
Integrando APIs de Inteligência Artificial palavra por palavra
Se você está integrando IA Generativa no seu backend (como o SDK do Gemini ou da OpenAI), você pode usar o SSE no Horse para transmitir a resposta gerada em tempo real para a sua interface front-end, proporcionando aquele efeito elegante de “digitação” (typing effect) palavra por palavra, eliminando a ansiedade do usuário final enquanto aguarda o processamento de respostas longas.
Segurança Arquitetural e Garantia de Qualidade
Para garantir que essa nova feature suportasse cargas de estresse monumentais sem apresentar degradação ou Memory Leaks:
- Implementamos uma suíte de testes de estresse disparando 15 requisições de streaming simultâneas em paralelo através de uma infraestrutura de
TThreadPoollocal e isolada, garantindo descarte limpo de threads na heap. - Executamos testes estáticos em uma matriz robusta de 74 combinações de compiladores, provando compatibilidade total do Delphi 10 Seattle até o novíssimo Delphi 13 Florence no Windows, além do Lazarus (FPC) rodando em containers Linux.
Conclusão
Com a introdução de Web Streams e Server-Sent Events, o Horse dá um salto monumental em maturidade de arquitetura web. Agora você pode construir APIs modernas de telemetria, IA Generativa, chat em tempo real e processamento de arquivos volumosos com a simplicidade e leveza de sempre.
A feature já está disponível na branch principal do Horse e pronta para ser levada para produção. Experimente hoje mesmo nos seus projetos e veja o consumo de RAM das suas APIs despencar!
Descubra mais sobre Régys Borges da Silveira
Assine para receber nossas notícias mais recentes por e-mail.
Dê-nos sua opinião, seu comentário ajuda o site a crescer e melhorar a qualidade dos artigos.