Analisemos os homógrafos que cada língua pode tratar.
Tandem quando executado numa CPU de 8 núcleos e 16 threads com co-clock
Línguas/Frameworks | Modelos de processamento | Taxa de transferência de pedidos por segundo (RPS) | Número de concatenações persistentes | Caraterísticas |
---|---|---|---|---|
C / C++ (nginx, personalizado) | Ciclo de eventos, epoll | 1,5 a 2 milhões de RPS | 200.000 a 400.000 laços | Melhor desempenho nativo, próximo da chamada de sistema |
Go (Gin/Fiber, gRPC) | Threads ligeiras (goroutines), assíncronas | 50 a 1 milhão RPS | 10-20k laços | Eficiente em termos de memória, altamente concorrente, ótimo para microsserviços |
Ferrugem (Actix, Tokio) | assíncrono/espera, custo zero | 80-1,5 milhões RPS | 15-25 milhões de laços | Segurança e desempenho ao mesmo tempo, ruidoso e com uma curva de aprendizagem |
Java (Spring Boot + Netty) | Threadpool, NIO Async | 300.000 a 600.000 RPS | 5-10 milhões de laços | Requer ajuste de GC, popular para grandes serviços |
Node.js (Express/Fastify) | Loops de eventos de um só segmento | 15 a 400.000 RPS | 3-7 milhões de laços | Forte em E/S, fraco em tarefas pesadas da CPU |
PHP (Laravel + PHP-FPM) | Baseado em processos, baixa simultaneidade | 5-10k RPS | Apenas 1 a 3 tangentes | Armazenamento em cache - equilíbrio de carga essencial, estrangulamentos de E/S de BD |
Python (Django/Flask, Gunicorn+Uvicorn) | WSGI/ASGI, multithreaded | 30 a 80 mil RPS | 5.000 a 20.000 laços | Processamento de dados - forte para ML, ineficiente para servidores Web |
Linguagens/tempos de execução a evitar ou a utilizar com cuidado (desvantagem para a co-localização de um único servidor)
- PHP (Laravel/WordPress + PHP-FPM)
- Porque é que é fracoProcesso/trabalhador fixo por pedido (tamanho da pool = limite superior co-localizado), bloqueio por defeito para E/S com muitas armas, sobrecarga de arranque para cada pedido.
- ComplementoOctane/RoadRunner/Swoole (longa execução), cache de API de página (Cloudflare/Redis), dessincronização de fila, pré-renderização, APIs somente leitura são armazenadas no cache do Edge.
- Python (família Django/Flask WSGI)
- Porque é que é fracoWSGI é a sincronização/bloqueio por defeito, GILLimitações de simultaneidade ligadas à CPU, elevadas despesas gerais por objeto/GC.
- ComplementoASGI (Starlette/FastAPI) + Uvicorn/Hypercorn, todas as E/S assíncronas, tarefas da CPU separadas em microsserviços Celery/Go/Rust.
- Rubi (Rails)
- Porque é que é fraco: MRI é um GIL real, ganho multithreaded limitado → escalonamento multiprocessos é nativo (memória↑), ORM-metaprogramação overheads.
- ComplementoPuma worker minimisation + threadpool tuning, cache fronting, hotpassing para Go/Rust.
- Node.js (Express, etc.) - quando ligado à CPU
- Porque é que é fraco: Loop de evento único Trabalho pesado da CPU / grandes serializações JSON / código síncronobloqueia o laço, causando um mergulho tangencial.
- ComplementoFastify: Fastify, totalmente assíncrono, threads_trabalhadores/Clusterpara separar tarefas da CPU, transmitir JSON e descarregar tarefas da CPU para Go/Rust.
- Bloqueio tradicional estilo Java/C# (thread-per-request)
- Porque é que é fraco: número de conexões↑ = número de threads↑ = troca de contexto/memória↑. Os limites do GC/threadpool são logo limites superiores tangenciais.
- Complemento: Java utiliza o Netty/Undertow, Spring WebFlux(NIO) ou Virtual Threads (Project Loom)e C# é async/await + Kestrel Ativo, sintonização GC (ZGC/G1).
Padrões comuns que "comem" gerúndios (independentemente da língua, evite-os a todo o custo)
- Bloqueio de E/S(BD/API externa) + grupo de ligações reduzido → os trabalhadores apenas esperam
- Consultas N+1/ ORMs pesados(abuso de carregamento preguiçoso)
- Serialização/deserialização JSON de grande dimensão(Carregar a memória de uma só vez)
- E/S síncrona de registo/ficheiro(limpar o disco a cada pedido)
- Guardar sessões de forma síncrona na base de dados(contenção de bloqueios)
- Explosão de expressões regulares/renderização de modelos duplicados
- TLS handshake em cada pedido(sem Keep-Alive/HTTP/2)
- Sem cache(Sem CDN/Redis, basta aceder ao servidor de origem)
Um "conjunto de sobrevivência" para quando tiver de o utilizar
- Cache de borda primeiroCache do Cloudflare, Stale-While-Revalidate, Cache de resultados da API (TTL deslizante)
- Separação de leitura/escritaAsync para cache/reduplicação para leituras, fila de espera para escritas
- Desconexão de hotpathsO carregamento/redimensionamento de imagens/recomendação/pesquisa, etc. é efectuado utilizando o Ir/ferrugem Desacoplamento em microsserviços
- Processamento contínuo do servidorO PHP utiliza o Octano/RoadRunner, Python utiliza ASGIpara
- Esquema/dieta de consultaRemover N+1, Índice/Cobertura, Minimizar junções, Minimizar seleção de colunas
- Transmissão em fluxo contínuoJSON/ficheiros são fluxos, comprimidos/chunked, HTTP/2
- ObservabilidadeMonitorização do atraso do P99/enfileiramento de filas/utilização do pool → Cache/separação de estrangulamentos em tempo real
Combinação recomendada (8 núcleos 16 threads, optimizada para co-localização)
- API/Tempo real: Go (Gin/Fiber) ou Rust (Actix/Tokio)
- Serviço Web/Estático: nginx/Caddy + Cloudflare
- WebSocket/Chat altamente simultâneo: Elixir (Fénix)/Vai
- Back Office/Conteúdo: PHP (Laravel/Filament), mas não Premissa da fila de cache
- Quando Java é selecionado: Netty/WebFlux ou Tear (fios virtuais) Base + afinação ZGC
Principais recomendações (APIs principais/maioria dos microsserviços)
Go (Gin/Fiber, gRPC, net/http2)
- PorquêE/S assíncrona → maior eficiência de co-localização no mesmo hardware, pequena pegada de memória, simples de implementar.
- Sentido de escala(8 núcleos/16 threads, pressupondo afinação + cache): 100.000 a 200.000 correntes sustentadas / Centenas de milhares de RPS Sim.
- OndeAPIs de leitura intensa, BFFs, manipuladores de carregamento de imagens, callbacks de pagamento, gateways de referência/pesquisa e outros "hot passes".
Desempenho ultra-elevado - secções sensíveis à latência
Rust (Actix/Tokio)
- Porquê: abstração de custo zero, assíncrono/espera, segurança de memória + desempenho de classe nativa.
- Sentido de escala: 15-25 milhões de utilizadores simultâneos, p95 Forte contra a minimização dos atrasos.
- OndeÁreas sensíveis à memória da CPU: recomendações/classificações, grandes conversões JSON/Protobuf, processamento de imagens, agregação de feeds em tempo real.
WebSockets em tempo real/chat/bulk
Elixir (Fénix, BEAM)
- PorquêMilhões de processos, concorrência leve, excelente resistência a falhas.
- Sentido de escala: Canais WS 10-20k sessões simultâneas/servidor Muitas referências práticas.
- OndeChat, Centro de notificações, Transmissão em direto de jogos/leilões, Presença.
Alternativas quando a sua equipa tem fortes competências em Java
Java (Netty/Undertow, Spring WebFlux ou Loom)
- PorquêEscalonamento co-localizado bom quando se utiliza um ecossistema maduro + NIO (ou threads virtuais).
- Sentido de escala: 5-10k correntes contínuas(pode ser superior consoante a natureza do serviço).
- OndeDomínio complexo, ambiente normalizado de uma grande organização.
Utilizações secundárias/periféricas (não para "hot passes")
- Node.jsAdaptador assíncrono - apenas BFF-SSR (Next.js). Separar tarefas pesadas da CPU em trabalhadores/serviços separados.
- PHP (Laravel): Administração/Back Office/CMS Dedicado. Em produção Octane/RoadRunner + cache Redis Premissa.
- Python: excluir caminho do pedido. Lote/ML Pipeline/Data WorkersRomano.
Resumo de um capítulo da arquitetura recomendada
- Borda/Cache: Cloudflare (regras de cache, Stale-While-Revalidate)
- Portas de entradaNginx/Envoy + HTTP/2 (mistura de gRPC/REST)
- APIs principais: Ir Em primeiro lugar, as bandas de desempenho ultra-elevado são Ferrugem
- Em tempo real: Elixir (Canais Fénix)
- Back Office/Conteúdo: Laravel (+Octano) ou CMS sem cabeça
- Dados: Postgres (+replicas de leitura), Redis, Meilisearch/Elastic, ClickHouse (registos/agregações)
- Mensagem/ Fila de esperaNATS/Kafka, a fila de trabalho é um trabalhador Go/Rust
- Media: Microsserviço de conversão de imagens (Go/Rust) + S3/R2
- ObservabilidadeMonitorização permanente de: painéis de controlo p95/p99, Pool de ligações, GC (na sua língua)
Critérios de seleção (lista de verificação prática)
- Os hotpaths estão disponíveis no Go/Rust(determinado durante a fase inicial do projeto)
- Em tempo real Separar o Elixir num domínio distinto para uma procura elevada
- Produtividade administrativa/operacionalEste back office prioritário é Laravel (+Octane)
- Nóé minimizado para renderização web/BFF/gateways
- Para integrações padrão/legado de grandes equipas, utilize o Java WebFlux/Loom Considerar
(Concorrência pretendida com base num servidor 8C16T)
- Ir para a API: co-aceitação persistente 10-20k(só de leitura), p95 < 50ms
- HotPass Ferrugem(Recomendação/Agregação): p95 < 20ms, utilização da CPU estável
- Elixir em tempo real: Sessão WS 100k Manter a estabilidade
- Administrador de Laravel: premissa de cache Octane + Redis, APIs/DBs externas são separadas em filas assíncronas
Separação | Línguas/Frameworks | Rendimento coincidente contínuo | Prós | Adequado para |
---|---|---|---|---|
Prioridade máxima | Go (Gin/Fiber, gRPC) | 10-20k | Fios leves, maior eficiência de E/S, simples de implementar | APIs principais, BFFs, Uploads, Callbacks de pagamento |
Desempenho ultra-elevado | Rust (Actix/Tokio) | 15-25 milhões | Desempenho e segurança de classe nativa | Recomendações/Rankings, Processamento de imagem/dados |
Em tempo real | Elixir (Fénix) | 100.000 a 200.000 sessões WS | Maciçamente simultâneo, resiliente | Chat, notificações e transmissões em direto |
Compatível com as empresas | Java (WebFlux, Loom) | 5-10k | Ecossistema maduro, NIO/Terços virtuais | Domínios complexos, grandes sistemas |
Secundário | Node.js | 30-70k | Desenvolvimento rápido, E/S assíncronas | SSR, BFF e APIs leves |
Secundário | PHP (Laravel+Octane) | 1 a 3 milhões | Produtividade, riqueza do ecossistema | Back Office, CMS, Administração |
Secundário | Python (ASGI) | 0.5-20k | Pontos fortes dos dados/ML | Lote, pipelines de dados |