Feature/multi instance - #517
Merged
regyssilveira merged 4 commits intoJul 10, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR: Estabilização e Documentação da Arquitetura Multi-Instance (Delphi / FPC)
Este Pull Request consolida a estabilização completa da branch
feature/multi-instancedo framework Horse. Corrigimos todas as incompatibilidades de compilação cruzada com o Free Pascal (FPC 3.2.2 / Lazarus / Linux) e asseguramos 100% de integridade e cobertura na suíte de testes unitários e de integração no Delphi (Windows).Além disso, foram adicionados exemplos práticos simplificados de console, documentação técnica bilíngue detalhando o comportamento de rede e novos scripts de testes automatizados ponta a ponta (E2E).
🛠️ Alterações e Resolução de Problemas (Bug Fixes)
1. Compatibilidade Cross-Platform (FPC / Lazarus)
TInterlocked(ausente/incompleto em versões do FPC no Linux) por condicionais de compilação utilizando as APIs nativas da RTL do Free Pascal (InterlockedIncrementeInterlockedDecrement) em src/Horse.Core.pas e src/Horse.Instance.pas.procedure begin end). Introduzimos o método privadoEmptyNextpara gerenciar callbacks de resposta vazios sem causar erros sintáticos de compilação.threadvarGCurrentExecutor,GCurrentNext,GCurrentNextCaller) e classes executoras dedicadas, mantendo o ecossistema thread-safe e compatível com compilação pura em Lazarus/Linux.GetCallbackde src/Horse.Instance.pas utilizando typecast explícitoTHorseCallback(ACallbackRequest)para satisfazer o compilador FPC.2. Estabilização da Suíte de Testes
TestMultiInstanceRoutingIsolationem tests/src/tests/Tests.Integration.MultiInstance.pas para inicializar e finalizar os servidores em portas paralelas de forma sequencial. Isso evita colisões de portas físicas do sistema operacional decorrentes da arquitetura singleton estática clássica dos provedores standalone do Horse.3. Usabilidade e Didática dos Exemplos (Samples)
IsConsole := Falseno escopo inicial. Isso permite que os métodosListenretornem o fluxo de execução imediatamente para a Thread Principal, ativando os sockets em background nos provedores e permitindo gerenciar o encerramento do console com umReadlnlimpo, sem a necessidade de criação manual de threads (TThread).--delaynos executáveis de amostra. Se detectada, os servidores aguardam 10 segundos antes de encerrar, permitindo testes automatizados de requisição física sem bloqueio interativo de teclado.🌐 Comportamento de Rede: Standalone Sockets vs. Servidores Gerenciados
Como os provedores locais standalone do Horse (Indy, IOCP, HttpSys) utilizam estruturas singleton de classe, a execução simultânea concorrente de múltiplos listeners de socket físicos na mesma aplicação standalone não é suportada por design devido a colisões de bindings locais do SO.
Contudo, a arquitetura
THorseInstanceatinge sua totalidade de uso em Servidores Web Gerenciados (como IIS via DLL ISAPI, Apache via mod_delphi, CGI ou FastCGI):80para API pública e8080para módulo Admin) e repassa os requests para o processo do Horse.THorseWebModulecontendo o cabeçalhoRequest.ServerPortpreenchido.GetHorseInstanceByPort(LPort)e direciona o fluxo para a árvore de rotas isolada daquela instância, garantindo 100% de isolamento e independência de middlewares sem conflito de concorrência de sockets locais.Esta distinção foi documentada em detalhes na nova seção de infraestrutura em doc/multi-instance.md e doc/multi-instance.pt-BR.md.
🧪 Validação dos Testes
Foram executados e passaram com 100% de sucesso (Zero erros) os seguintes testes:
Default,Default+Radix,HttpSys,HttpSys+Radix,IOCP,IOCP+Radix).THorseestática clássica (modo antigo) continua preservada.Invoke-RestMethodno exemplo de multi-instâncias e no servidor de integração clássico.📂 Arquivos Modificados / Adicionados
src/Horse.Core.pas— Tratamento de loops de hooks atômicos sob FPC.src/Horse.Instance.pas— Operações atômicas, callbacks e typecast sob FPC.src/Horse.Core.Router.Radix.pas— Threadvars e executors para Radix Router sob FPC.src/Horse.Core.RouterTree.pas— Threadvars e executors para RouterTree clássico sob FPC.src/Horse.Core.RouterTree.NextCaller.pas— Isolamento de NextCallers sob FPC.tests/src/tests/Tests.Integration.MultiInstance.pas— Sequenciamento de sockets locais.tests/run_quick_test.ps1— [NOVO] Script de compilação rápida de integridade.tests/run_e2e_integration_tests.ps1— [NOVO] Script de testes de integração E2E físicos.README.md/README.pt-BR.md— Inclusão do link da nova documentação.doc/multi-instance.md/doc/multi-instance.pt-BR.md— [NOVO] Manuais de referência de instâncias.doc/roadmap/prioritization_matrix.md— Atualização do status para Concluído.samples/delphi/console_multi_instance/ConsoleMultiInstance.dpr— Exemplo Delphi simplificado.samples/lazarus/console_multi_instance/ConsoleMultiInstance.lpr— Exemplo Lazarus simplificado.