Criar servidor?

senhores!!

gostaria de dicas sobre arquiteturas(livros,artigos etc) sobre como desenvolver um servidor web, ou servidor de aplicacao coisa relacionadas como threads(q ja sei trabalhar) etc… antes q me atirem pedra no caso aqui EU NO TO REIVENTANDO RODA acreditem!! é necessario refazer um servidor proprietario no qual esta muito mal implementado e não escala de jeito nenhum… ( legado miseravel!! )

bruno

Bem é assim, eu a alguns anos comecei a fazer um webserver, e cabei focando no desenvolvimento web baseado em scripts.

E para isto tenho 6 projetos:

Netuno - Servidor de Socket e gerenciador de Threads

Netuno Proteu - Protocolo HTTP, gerenciador de projetos, pubilca classes e arquivos de script para a web, e também suporte a J2EE para poder trabalhar com GlassFish e Tomcat.

Netuno Psamata - Classes uteis para todos os outros projetos.

Netuno Tritão - Gerenciador de Base de Dados e construtor de BackOffices.

Netuno Nereida - Gerenciador de schedules baseado em scripts.

CajuScript - Linguagem de script com sintaxe dinâmica

Todos são ou serão opensource, todos funcionam e utilizo eles no meu dia-a-dia, mas o único q esta online a 100% é o CajuScript.

Os outros estão esperando a sua vez, mas para te facilitar a vida coloquei online o código e um sample do Netuno e do Netuno Proteu.

http://netuno.googlecode.com/svn/trunk/

http://netuno-proteu.googlecode.com/svn/trunk/

http://netuno-psamata.googlecode.com/svn/trunk/

O Netuno é simples de entender e configurar e usar… acho que não vais ter dificuldades, tem todo o sistema de multithreads feito.

O Netuno Proteu é muito complexo, só fiz um exemplo muito simples, e também ele esta afinado só para o CajuScript, outras linguagens de script por enquanto não são suportadas na class Compile que gera os scripts das páginas.

Mas para ter uma idéia de como se pode fazer, tem ai bastante código e muita coisa pronta.

Espero que depois resolva abrir parte ou todo o projeto que queres fazer, não há razão para se ter um webserver proprietário, ao meu ver.

Eu comecei a fazer isto tudo no começo de 2003, espero até o fim do ano ter finalmente todos os projetos online e bem documentados.

Até o fim deste mês devo lançar a nova versão do CajuScript, e depois no próximo mês lançar o Netuno, e até o fim do ano o Netuno Proteu. O Netuno Tritão acho que só vai dar para o próximo ano, por que é muito complexo e grande.

eduveks

muito obrigado pela ajuda, vou ver como vc implementou seus servidores pra ter uma ideia, o problema é que o servidor web em delphi, e não poderei abrir pq é da empresa aqui. a questão é como melhorar performance,escabilidade etc etc em servidor feito em threads com sockets?
que tecnicas utilizar entendeu?

Se o seu servidor Web foi feito em Delphi, está mais que na hora de trocá-lo por um servidor Web em outra linguagem - Java, C (Apache) ou sei lá o que for. Por exemplo, seu servidor Web em Delphi suporta https (SSL)?

A propósito, um servidor Web escrito em código nativo (ou seja, C/C++ ou Delphi) sob Windows não pode reservar 1 thread para cada socket.
Ele tem de usar “Overlapped I/O”, que não é trivial de trabalhar.
O jeito de trabalhar com Overlapped I/O é bastante complexo, uma vez que você tem de transformar seu processamento em uma máquina de estados, e você tem de trabalhar com “worker threads”, não com uma thread para cada socket.
Eu aconselharia, para melhor rendimento, que o sistema fosse portado - não sei se existe uma forma, por exemplo, de usar o IIS com DLLs escritas em Delphi. É que o IIS já lida com esses problemas de “worker threads” e “overlapped I/O” transparentemente.
Só sou um pouco contra o uso de DLLs no IIS porque é extremamente complicado debugar DLLs no IIS (elas sempre acabam derrubando o IIS).

Pois é o thingol disse tudo, para trabalhar com o IIS pode fazer um HTTPHandler em .Net por exemplo e chamar a DLL do Delphi apartir do .Net. Fazer um HTTPHandler em .net é muito simples.

http://support.microsoft.com/kb/308001

http://www.15seconds.com/issue/020417.htm

Como chamar uma DLL (Delphi, etc) apartir do .Net:

http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=1937601&SiteID=21

Para usar o IIS e a DLL em Delphi diretamente teria que criar uma ISAPI, acho que isto pode te ajudar:

http://delphi.about.com/library/bluc/text/uc060901a.htm

Pelo que deu para notar fazer um ISAPI em Delphi daria um trabalhão o .Net tem tudo pronto, só implementar o HTTPHandler, ai a camada do Servidor Web em Delphi vc pode descartar e usar o IIS e o .Net para isto, e o resto vc aproveita o que esta em Delphi mesmo chamando apartir do .Net.

No banco em que trabalho usamos o IIS e .Net, claro é uma solução da própria Microsoft, pois faço parte da equipe deles, e fizemos um HTTPHandler .Net no lugar da solução que havia, que era uma ISAPI em C++, ficou muito bom, não houve perda de performance, muito pelo contrário para afinar as MaxIOThreads e MaxWorkerThreads no .Net é moleza e ai se afina a medida para os servidores, é a aplicação de balcões que é usada por 10.000 balcões no dia-a-dia, e o hardware são 10 servidores Pentium 3 1.3Mhz 2 CPUs, claro que mudamos para .Net e os servidores continuaram na mesma, mas no .Net conseguir fazer afinações e regular a performance é fácil, agora tu querer fazer uma coisa destas é meio complicado conseguir um nivel destes de desempenho, eu fiz meu servidor web, mas como citei acima o Netuno Proteu tem suporte a GlassFish e Tomcat, não fechei só ao meu servidor justamente por isto, o desempenho do GlassFish e Tomcat são superiores claro, o meu gerenciador de coneções(sockets vs threads) tem um bom desempenho, nada mau, mas não me arriscaria em usar em um sistema de altissimo nível de disponibilidade, eu uso ele e muito mas para pequenas coisas e com seu grau de importância, mas temos que ser realista pois pescoços podem rolar.

Se tu quiser avançar mesmo com criar um webserver do zero, acredito q vais ter imensas dificuldades atoa, sendo que com um HTTPHandler ou na pior das hipoteses um ISAPI resolveria o problema, e o IIS sabendo usar bem é um excelente webserver também, dá conta do recado.

thingol, isso ja foi motivo de interminaveis discussões minhas aqui na empresa com a diretoria, mas eles continuam vendendo o legado… enfim terei que mexer nisso de qualquer forma.

seguinte não irei fazer um servidor do zero apenas quero melhorar a perfomance e consumo de memoria do que já tenho ou retira-lo e conseguir “plugar” outro no lugar deste, pois é uma necessidade real, e infelizmente por enquanto não tem outra saida.

eduveks,gostei da ideia, bem eu já tentei portar para o apache mas não obtive sucesso, veja eu tenho um exe que funciona como processo q recebe as solicitações de plugins( uma dll delphi, com outro nome e que tem o componente q gera html) acontece q esse programa executa o plugin e gera a pagina a partir de um ponteiro para uma função que esta dentro do plugin( será q fui claro? puts!!)ou seja eu to muito amarrado aqui. se eu consegui colocar no ISS apartir do .net massa estarei me livrando de uma bronca grande…

a questão é:
1= me livrar do servidor,substituindo-o por outro
2=melhorar a performance do mesmo
para o item 1, a ideia do .net me parece interessante
para o item 2 eu vou dar uma pesquisada em “Overlapped I/O”

valeu passoal

Então no caso do HTTP Handler em .Net no método que é chamado a cada pedido:

public void ProcessRequest(HttpContext context) { context.Response.Write("Hello from custom handler."); }

Vc recebe um HttpContext, nesta classe vc tem tudo, os Response, Requests, Headers, Cookies, Sessions, etc:

http://msdn.microsoft.com/pt-br/library/system.web.httpcontext.aspx

No nosso HTTP Handler no banco fazemos o seguinte, com o HttpContext geramos um XML com toda a informação, fazemos loops no Response e Response.Form, Headers, Cookies, Sessions, e montamos o XML com toda esta informação, e depois com este XML enviamos para outros processos, no teu caso pode ser para a DLL em Delphi.

No Delphi fica fácil, é só pegar o XML e usar como bem entender, ai já tem toda a informação de cada pedido do browser.

Para pegar o output, pode ser um XML que o Delphi retorna na chamada do método q recebe o XML, ou seja no Delphi tens um método q recebe o XML com os dados de input, e retorna um XML com os dados de output.

No caso de dados binários, ou seja arquivos estáticos, não convém usar este processo, o só fazemos isto para pedidos a uma deternimada extensão que definimos no IIS, por exemplo *.x, ou seja todos os pedidos para URLs com a extensão *.x vai para o HTTP Handler em .Net que por usa vez encaminha para o Delphi, o resto, imagens, javascript, css, etc, fica no IIS como arquivos normais para download, e estes não passam pelo HTTP Handler.

Acho que este cenário é o mais fácil de implementar e administrar, acho que consegues resolve todos os teus problemas com pequenas mexinas no Delphi e a implementação de um simples HTTP Handler em .Net.