Ajuda: Uma decisão difícil para um Framework Web baseado em Rust e Lua
A alguns dias tenho pensado como seria divertido criar um ecossistema do zero com Rust e lua, criando um framework similar a Next.js ou Sveltekit, porém executando tudo no server é claro. A ideia seria simples criar uma biblioteca Rust que possui um server (Axum para ser exato) e mapeia scripts lua com base em uma estrutura de diretórios. Cada script recebe seja por variável global ou parâmetro de função, o contexto da requisição, e responde de forma apropriada.
No momento lua está rodando embarcado no binário final por meio da biblioteca mlua. E aí que entra meu problema:
O problema:
Como chamar esses scripts de forma assíncrona ou multithread. Para começar os estados de lua não são thread safe por motivos obveis e não podem ser compartilhados entre threads.
Algumas soluções me vieram a mente:
- A imediata é: criar um state para cada requisição que vai morrer no fim dela. Parece uma solução horrível, porém era assim que Scripts PHP executavam, subiam, retornavam e morriam.
- Outra solução é manter um pool de estados, um para cada thread digamos. Assim cada request será respondida de forma sincrona. Isso limita o gasto de recursos, porém não achei nenhuma solução opensource que utilize essa abordagem, por favor me corrijam se estiver errado.
- Por último, bolar um event loop para tornar o call de cada script assíncrona. Esse pode ser usado em conjunto com o state pool, porém não é exatamente fácil de implementar.
Um detalhe importante: os Scripts não possuem estado, são funções puras, recebem o contexto, serviços injetados e respondem a request. Ponto.
E aí? O que você acha? Que sou maluco? Bom, isso é claro. Mas adoraria testar os limites de um projeto como esse no meu tempo livre. Portanto gostaria de uma solução, mesmo que não ideal.