DEV Community

EronAlves1996
EronAlves1996

Posted on

Reimplementar a API de Servlets em Rust?

Ontem à noite, estava eu confabulando em reimplementar toda a especificação de Servlets do Jakarta EE em Rust, porém existem desafios em Rust que já estão resolvidos em Java.

Quando falamos da especificação de servlets, como consta no livro (no PDF no caso), temos que prever duas entidades em separado:

1 - O Servlet em si
2 - O Container de Servlets

Image description

Esse é um pattern bem consolidado em Java, tanto que muitos frameworks em Java se utilizam do Pattern de uma forma ou de outra

  • Spring, usando embedded containers
  • Eclipse Jersey
  • Akka HTTP (usa Eclipse Jetty por baixo)

Porém, para implementar isso como manda no livro, eu teria que implementar as duas entidades em separado e me apoiar em um sistema de plugins para conseguir prover o funcionamento dos servlets de forma plugável.

Isso no Java já está superado faz tempo. Você pode implementar seu próprio classloader para isso ou se apoiar no URLClassLoader para encontrar as classes dinamicamente no file system. Já escrevi um blog post sobre isso.

https://dev.to/eronalves1996/how-classpath-scanning-works-behind-the-scenes-564b

Tecnicamente, você poderia fazer isso em qualquer runtime capaz de ler código dinamicamente. Porém em Rust isso é mais difícil. Temos que encarar alguns fatos

1 - Rust tem sua compilação padrão estática. Isso significa que ele produz um fat bundle com tudo que precisa.
2 - Podemos mudar a compilação para dinâmica, mas muita coisa não pode ser garantida nesse momento, pois Rust tem uma ABI instável.
3 - Apoiar-se na ABI de C significa perder muitos recursos e navegar em águas muito perigosas.

Este último fato significa que podemos ler shared objects compilados para a ABI de C, só que é bom lembrar que qualquer leitura de símbolo é uma operação unsafe e não temos qualquer garantia de que o símbolo existe no .so

4 - Perda de performance.

Leitura e carregamento de um .so tem overhead de carregamento do arquivo em memória e o overhead associado ao ffi.

Existem outros perigos associados a isso, mas reimplementar a API de Servlets em Rust requer algumas adaptações para conseguirmos uma interface mais familiar para quem programa. Porém classifico muito mais como uma tarefa de aprendizado do que algo que tenha realmente utilidade.

Top comments (0)