Node.JS - Mudanças arquiteturais na versão 0.6 e suporte a Windows
Na última CodeConf, Ryan Dahl apresentou o Road Map do Node.JS para a versão 0.6. Dentre as mudanças, o foco em fazer funcionar no Windows sem tranqueiras (i.e. Cygwin) teve bastante destaque. Isso resultará em uma grande mudança arquitetural, no que diz respeito ao core do projeto, que é a gerência de I/O Assíncrono.
O problema do Node.JS com o Windows se dá porque sistemas operacionas UNIX e Windows tratam Network Programming de forma totalmente diferente. Enquanto no Unix usamos libev e libeio por cima de select, epoll ou kqueue (isso varia de acordo com o sabor de unix), no Windows esse tratamento é totalmente diferente. Windows até tem suporte a select, porém não é eficiente para sistemas de alta concorrência. O que resolve esse problema no Windows se chama I/O Completion Ports (IOCP), que sinceramente não conheço nada sobre. Eu li a página da documentação mas sequer um teste básico eu fiz. Pretendo fazer e depois escrever alguma coisa sobre isso mais pra frente.
Até onde eu entendi, o I/O Completion Ports já tem o suporte completo para I/O Assíncrono, sem precisar ter um Thread Pool próprio para gerênciar isso (que é o que o Node faz no Unix). Posso estar enganado pois não testei isso.
Junto a essa idéia, criou-se um projeto chamado liboio, que é a nova abstração para o tratamento de I/O de cada plataforma (i.e. Sistema Operacional). Esse projeto será integrado a versão 0.6 do Node.JS.
A nova estrutura fica da seguinte forma:
Anteriormente não existia essa segunda camada, nem a parte de IOCP e Windows Kernel, portanto considero a mudança significativa, apesar de a parte *nix receber basicamente uma abstração, o que não deve mudar mundo quando nesses SOs.