Você está na página 1de 66

Universidade Federal de Pernambuco

Centro de Informática

Graduação em Ciência da Computação

NODE.JS TRABALHO DE GRADUAÇÃO GUSTAVO STOR DE AGUIAR
NODE.JS
TRABALHO DE GRADUAÇÃO
GUSTAVO STOR DE AGUIAR

ESTUDO TECNOLÓGICO E DESENVOLVIMENTO FULL-STACK JAVASCRIPT DE PLATAFORMA DE COMPETIÇÕES EM PROBLEMAS ALGORÍTMICOS

Recife, Julho de 2015

Universidade Federal de Pernambuco

Centro de Informática

Graduação em Ciência da Computação

NODE.JS

ESTUDO TECNOLÓGICO E DESENVOLVIMENTO FULL-STACK JAVASCRIPT

DE PLATAFORMA DE COMPETIÇÕES EM PROBLEMAS ALGORÍTMICOS

ALUNO: GUSTAVO STOR DE AGUIAR ORIENTADOR: FERNANDO DA FONSECA DE SOUZA

Trabalho de Graduação apresentado no Centro de Informática da Universidade Federal de Pernambuco como requisito parcial para a obtenção do grau de Bacharel em Ciência da Computação.

Recife, Julho de 2015

Agradecimentos !

Foram! quatro ! anos! e ! meio ! que ! cursei ! Ci ê ncia ! da ! Computa çã o ! no ! Centro ! de ! Informá tica ! da ! Universidade! Federal ! de ! Pernambuco.! Nesse ! tempo,! n ã o ! s ó ! conheci! amigos! maravilhosos,! como ! grupos! nos! quais! me ! identifiquei! bastante.! O! PETF Informá tica,! que ! me ! acolheu! de ! Setembro ! de ! 2011 ! a ! Fevereiro ! de ! 2015,! foi !! extremamente ! importante ! para ! o ! meu ! desenvolvimento! é tico,! filantr ó pico ! e ! de ! trabalho! em! equipe.! No ! PET,! fiz ! amizades! que ! perduram ! até ! hoje.! Muito ! obrigado! a ! todos ! que ! trilharam!alguma!parte !da !histó ria !comigo !nesse !grupo !fenomenal.!

!de !vontade ! foi ! uma ! das!

e ! coragem.! Fazer! parte ! dessa ! rotina,! todas ! as! manh ã s ! e ! tardes! de ! s á bado,!

decisõ es! mais! certas! que ! eu ! j á ! fiz.! Foi ! com! a ! Maratona ! de ! Programa çã o ! que ! eu ! transformei ! a ! arte ! de ! programar! em! uma ! paixã o.! A! maior! parte ! das! minhas! conquistas! fora ! do ! meio ! acad ê mico,! como ! ter ! recebido! uma ! proposta ! de ! trabalho! do ! Facebook,!

Participar!da !Maratona !de !Programa çã o !foi !o !meu !maior!pilar!de !for ç a

Goo gle ! e ! Microsoft,!

foram! devido! ao ! conhecimento! que ! obtive ! nesse ! grupo.! Agrade ço ! a

todos ! que ! trilharam! essa ! rotina ! comigo,! em! particular!

à ! professora ! Liliane! Salgado,! que

leva ! esse ! projeto ! com! tanta ! garra ! e ! vigor,! e ! a ! todos ! que ! participaram! de ! algum! time !

comigo:!Bruno,!Sab ó ia,!Lucas!Veras,!Rael,!Lucas!Lima,!M

!Souza,!mentor!brilhante,!tutor !

do !PET,!excelente!professor!e !de !quem!eu !j á !tive !oportunidade!de !ser!monitor!por!alguns! semestres\! e ! Ká tia ! Guimarã es,! professora ! de ! algoritmos! e ! estruturas! de ! dados,! do ! qual fui ! monitor! por! dois! anos,! brilhante! academicamente! e ! pessoalmente,! com! seu ! carisma

e !vontade!de !ensinar.!A !todos !os!demais!professores,!agradeç o !por!você s !se !esforç arem! para !alavancar!o !re conhecimento!do !CIn!mundo !afora.!

Por! fim,! agradeç o ! à ! minha ! fam ília.! À! Marlene,! uma ! segunda! m ã e ! para ! mim.! A !

meus! irmã os,! Camila ! e ! Guilherme,! que ! sempre ! estã o ! ao ! meu ! lado ! torcendo ! por! mim.! A ! meus! cunhados,! Diego! e ! Thais,! que ! tamb é m ! considero! irmã os,! por! tant o ! tempo ! que ! nos! conhecemos,! desejoF lhes! o ! melhor! que ! a ! vida ! possa ! oferecer.! A! meus! pais,! Antô nio ! e !

!

! as! minhas! decisõ es! e ! me ! aceitarem! por! quem! sou:! um! jovem! cientista ! da ! computa çã o ! com! grandes! ambi çõ es.! Eu ! sou ! extremamente! grato ! a ! você s.! E! a ! Victor,! a ! quem! eu ! agradeç o !por!estar!sempre !perto,!e !compartilhar!dos!mesmos!sonhos.!Obrigado!por!fazer! me us!dias!mais!felizes.!

Marta,! eu ! s ó ! queria! que ! você s ! soubessem! que ! eu ! me ! considero! extremamente ! sortudo de !ter !você s!como !pais,!por!me !amarem!acima !de !qualquer!coisa,!me !apoiarem!e m !todas

!

!

á rio !e !Duhan.!

Agrade ç o !aos!professores!Fernando!da !Fonseca !de

!

!

!

"Science is a differential equation. Religion is a boundary condition.” (Alan Turing)
"Science is a differential equation. Religion is a boundary condition.”
(Alan Turing)

RESUMO4

Desenvolvimento! de ! software ! para ! a ! Web ! é uma ! das! á reas! mais! requisitadas! no ! mercado ! de ! tecnologia! da ! informa çã o.! As! decisõ es! envolvidas! com! o ! projeto ! de ! uma ! aplicaçã o !online!variam!desde !a !escolha!do !sistema !operacional!até qual !a !tecnologia!de ! desenvolvimento! que ! será utilizada.! No ! meio ! da ! crescente ! demanda! em! plataformas! de ! desenvolvimento! Web ! de ! alto! desempenho,! e ! que ! facilitem! a ! cria ç ã o ! de ! aplicaçõ es! din â micas! na ! Web, ! Node.js! surge ! n ã o ! s ó para ! solucionar,! mas! tamb é m ! para ! mudar! o ! paradigma! de ! desenvolvimento! Web ! a ! que ! estamos! acostumados! — integrando! a ! mesma !linguagem!de !programaçã o !no !cliente !e !no !servidor.!Os !principais!objetivos!desse ! trabalho! envolvem! investigar! detalhadamente! o ! funcionamento! dessa ! plataforma ! e ! sua ! arquitetura,! realizar! diversos! testes! comparativos! entre ! essa ! e ! outras! tecnologias! e ! implementar!uma !aplicaçã o !em!Node.js.!

A! aplicaçã o ! desenvolvida! neste ! trabalho! é uma ! p lataforma ! de ! competi çõ es! simuladas! de ! programaçã o,! a ! fim ! de ! prover! uma ! sistematiza çã o ! dos! treinos! em! programaçã o ! competitiva ! nas! institui çõ es! de ! ensino! brasileiras.! Muitos! times! que ! representam! o ! Brasil ! em! competi çõ es! mundiais! de ! programaçã o,! como ! a ! Olimp íada ! Internacional! de ! Informá tica ! (IOI) ! e ! a ! Competi çã o ! Internacional! de ! Programa çã o ! para ! o ! Colegiado! (ICPC)! n ã o ! possuem! nenhum! m é todo ! de ! treino,! resolvendo! problemas! algorítmicos! avulsos! para ! ganhar! experi ê ncia ! e ! conhecimento.! Na ! aplicaçã o ! desenvolvida,! q ualquer! institui çã o ! ou ! aluno! individualmente! pode ! criar! suas! pró prias! competi çõ es! virtuais,! nas! mesmas! regras! das! competi çõ es! oficiais,! e ! escolher! as! questõ es!a !partir!de !v á rios!repositó rios!de !problemas!algorítmicos!na !Internet.!Com!esse ! sistema,!n ã o !some nte!colocamos!em!prá tica !o !conhecimento!de !Node.js!elucidado!neste ! trabalho,!como !tamb é m !plantamos!o !sonho !de !ampliar!a !visibilidade!do !potencial!do !Brasil ! mundo !afora.!

!

Palavras8 chave:!desenvolvimento!Web\ !Node.js\!programaçã o !competitiva.!

!

ABSTRACT4

Softw are ! development! for ! the ! Web ! is! one ! of! the ! most! sought! after! areas! in ! the !

information!technology!market.!Decisions!involved!with!the !design!of!an !online!application! range ! from! the ! choice ! of! the ! operating! system! to ! which ! development! technology! will ! be used.! Amid ! the ! growing! demand! for ! high F performance! Web ! development! platforms! and ! which !facilitate !the !creation !of!dynamic!Web !applications,!Node.js!comes!not!only!to !solve

!

!

!

these !issues!but!also

— ! by! integrating! the ! same ! programming! language! on ! the ! client! and ! server.! The ! main ! goals!of!this !work!involves!a !detailed!investigation!of!the !operation!of!this !platform!and !its! architecture,! making ! various! comparative! tests ! between! this ! and ! other! technologies! a nd ! deploying!an !application!in !Node.js.!

!to !change!the !Web !development!paradigm!to !which !we !are !used !to

The ! application! developed! in ! this ! work! is! a ! platform! for ! simulated! programming! competitions! simulated,! in ! order! to ! provide! a ! systematisation ! of! training! for ! programming! contests! in ! Brazilian! educational! institutions.! Many! teams! representing! Brazil ! in ! global! programming!competitions!such !as!the !International!Olympiad !in !Informatics!(IOI) !and !the ! International! Collegiate! Programming! Contest! (ICPC)! have ! no ! training! method,! but! perform! loose ! algorithmic! problem! solving! to ! gain ! experience! and ! knowledge.! In ! the !

developed! application,! any! institution ! or! individual! student! can ! create ! their ! own ! virtual !

the ! official ! competitions,! and ! choose ! the ! questions!

competitions! under! the ! same ! rules! of!

from !various!repositories!of!algorithmic!problems!on !the !Internet.!With !this !system,!we !are

! not! only! putting! into! practice ! the ! knowledge! of! Node.js! elucidated! in ! this ! work,! but! also ! planting!the !dream!of!increasing!the !visibility!of!Brazil ’ s !potential!around!the !world.!

!

Keywords:!Web !development\!Node.js\!competitive !programming.!

!

SUMÁ RIO4

INTRODUÇÃO 4

47

1 4A 4WEB 4

411

1.1!EVOLUÇÃO!DO!DESENVOLVIMENTO!WEB !

!11

1.2!JAVASCRIPT:!WEB !INTERATIVA !

!13

1.3!FLUXO!DE!COMUNICAÇÃO!NA!WEB !

!15

1.4!FLUXO!DE!REQUISIÇÃO!NOS!SERVIDORES!

!18

2 4V8:4JAVASCRIPT4EFICIENTE 4

424

2.1!MOTIVAÇÃO!

!24

2.2!OTIMIZA

ÇÕES!DO!MECANISMO!

!26

2.2.1!Acesso

!Eficiente !

!26

2.2.2!Valores!marcados!e !arrays!

!28

2.2.3!Compilação!de !código!JavaScript!

!29

2.2.4!Garbage!Collection!Eficiente !

!32

2.3!AVALIAÇÕES!DE!DESEMPENHO!

!33

2.4!CONSIDERAÇÕES!FINAIS !

!36

3 4NODE.JS4

437

3.1!CONTEXTO!HISTÓRICO!

!37

3.2!CARACTER ÍSTICAS !GERAIS !

!39

3.2.1!Diferente !de !JavaScript!Tradicional!

!39

3.2.2!Compartilhamento!de !Código!

!40

3.2.3!Assincronicidade!

!41

3.2.4!Servidor!Integrado!

.!43

3.2.5!Gerenciador!de !Pacotes!

!44

3.3!ARQUITETURA!

!45

3.4!BENCHMARKS!

!47

3.4.1!Arquivos!Está ticos!

.!47

3.4.2!I/O!bound!

!48

3.4.3!CPU !bound!

!49

3.4.3!Outros!

!49

4 4PROJETO4E4IMPLEMENTAÇÃO4

451

4.1!PROBLEMÁTICA !

!51

4.2!OBJETIVO!

!52

4.3!ASPECTOS!FUNCIONAIS!

!53

4.4!ASPECTOS!N ÃOF FUNCIONAIS!

!54

4.5!ARQUITETURA!

!56

4.6!RESULTADOS!

!58

5 4CONCLUSÕES4

460

5.1!TRABALHOS!FUTUROS !

!61

REFERÊNCIAS4

463

7

INTRODUÇÃO 4

A! World ! Wide ! Web ! é ,! de ! longe,! o ! servi ç o ! mais! utilizado! da ! Internet.! Por! meio ! del a ,! conseguimos! obter! conte ú do ! e ! nos! conectar! a ! pessoas! em! poucos! milissegundos.! Todo ! esse ! conte ú do ! e ! essas! pessoas! a ! quem! nos! conectamos! estã o ! disponíveis! em! p á ginas! na !Web, !e !a !ordem!de !grandeza!dessas!p á ginas!existentes!é a !mesma !que !a !quantidade! de ! pessoas! no ! mundo 1 .! É como ! se ! cada ! pessoa ! do ! mundo ! fosse ! responsá vel ! por! uma ! p á gina ! virtual.! A! importâ ncia ! da ! World ! Wide ! Web ! nos! dias! de ! hoje ! é de ! tamanha ! magnitude! que ! o ! desenvolvimento! de ! aplica çõ es! Web ! passou ! a ! ser! um! dos! conhecimentos!mais!requisitados!no !mercado !de !trabalho!em!tecnologia!de !informa çã o.!

Mas!tudo !é !feito !de !escolhas,!e !nem!sempre !s ã o !fá ceis.!Desenvolver!uma !aplica o !

na ! Web ! come ç a ! sempre ! com! uma ! escolha:! que ! tecnologia! usar? ! Um! iniciante! poderia! escolher! a ! que ! provê ! um! conjunto! de ! ferramentas! ou ! frameworks! que ! facilite ! o ! desenvolvimento\!um!desenvolvedor!mais!experiente!poderia!optar!por!uma !que !ofere ç a ! s uporte ! a ! mais! conexõ es! paralelas,! ou ! que ! seja ! otimizada! no ! gerenciamento! de ! requisi çõ es.! Existem! in ú meras! linguagens! de ! programaçã o ! com! suporte ! a ! desenvolvimento! Web, ! algumas! com! seus! respectivos! frameworks! que ! auxiliam! no ! desenvolvimento:!Django 2 ,!em!Python 3 \!Rails 4 ,!em!Ruby 5 \!PHP 6 .!A!escolha!da !tecnologia! utilizada! depende! muito ! do ! desenvolvedor,! do s ! objetivos ! e ! da ! determinaçã o ! do ! desenvolvedor.

Dizer! qual ! tecnologia! de ! desenvolvimento! Web ! é mais! apropriada! para ! um! determinado! projeto ! depende! muito ! do s ! requisitos.! N ã o ! muito ! longe! disso,! poré m,! é comum! querer! comparar! tecnologias! em! determinados! aspectos! específicos.! “ Qual ! é a ! melhor! tecnologia! a ! utilizar! quando! queremos! otimizar! o ! tempo ! de ! resposta ! de ! uma ! requisi çã o? ” ,! “ Qual ! é a ! tecnologia! mais! prop íci a ! para ! iniciantes?” ,! “ Que ! tecnologia! podemos! usar! para ! desenvolver! um! servidor! Web ! que ! facilite ! a ! persistê ncia ! de ! conexã o ! cliente F servidor?” ou ! “É possível ! uma ! ú nica ! instâ ncia ! de ! servidor! aguentar! ao ! menos! 10 !

1 Dado extraído de http://www.worldwidewebsize.com/ em Abril de 2015.

2 https://www.djangoproject.com

3 https://www.python.org

4 http://rubyonrails.org

5 http://rubyonrails.org

6 http://php.net

8

mil ! conexõ es! paralelas?” s ã o ! perguntas! comuns! e ! que ! podemos,! neste ! caso,! responder! precisamente! qual ! ou ! quais! tecnologias! disponíveis! s ã o ! mais! apropriadas! para ! o ! determinado!requisito.!

O! ú ltimo ! ponto! levantado! – uma ! implementaçã o ! de ! servidor! Web ! que ! consiga! manter! 10 ! mil ! conexõ es! paralelas! – é frequentemente! revisitado! em! pesquisas! e ! levantamentos!das!tecnologias!que !melhor!atendem!à s !demandas!de !grandes!servidores! em! produ çã o.! O! problema! C10K 7 !relata ! justamente ! isso:! o ! gargalo! n ã o ! é mais! o ! hardware,!pois!com!uma !m á quina!2000MHz,!com!4GB!de !memó ria !RAM!e !uma !placa !de ! rede ! de ! 1000Mbits/s,! dividindo! esses! recursos! para ! 10000! clientes,! disponibilizaríamos,! em! um! simples! c á lculo ! baseado! na ! distribui çã o ! uniforme ! dos! recursos,! 200KHz! de ! processamento,! 400KB! de ! memó ria ! virtual ! e ! uma ! conexã o ! de ! 100Kbits/s ! para ! cada ! usu á rio,! o ! que ! pode ! ser! bastante ! suficiente ! para ! a ! maioria ! das! p á ginas! na ! Web. ! Mas! o ! mundo !n ã o !é tã o !ideal!assim,!e !nem!tudo !depende!do !hardware.!Chegamos!em!um!ponto! em! que ! o ! problema! maior! é desenvolver! o ! software ! que ! consiga! ser! o ! mais! efici ente! possível ! na ! distribui çã o ! dos! recursos.! Numa ! era ! em! que ! 5 ! segundos! de ! espera ! é muito ! tempo,!otimiza çã o !dos!recursos!pode !ser!a !melhor!arma !para !quem!quer!se !sobressair.!

O! problema! que ! mencionamos! foca ! no ! lado ! do ! cliente,! mas! desenvolvimento!

Web

tamb é m ! deve ! se ! importar! com! o ! lado ! do ! desenvolvedor.! Nesse ! â mbito,! existem! prá

ticas!

que !podem!facilitar!muito !o !desenvolvimento.!Primeiramente,!a !tecnologia!escolhida!deve

 

dispor! de ! um! framework! de ! desenvolvimento!

que ! seja ! continuamente! mantido ! por! uma

equipe! ou ! comunidade! de ! desenvolvedores! – dependendo! de ! sua ! natureza ! privada! ou

ú blica.! Esse ! aspecto ! é fundamental! em! computa çã o,! pois! c ó digos! se ! tornam! obsoletos! muito ! rapidamente.! Erros! que ! comprometem! a ! seguranç a ! s ã o ! encontrados! a ! todo ! instante ! e ! as! tecnologias! devem! acompanhar! a ! passo ! r á pido ! essas! mudan ç as! e ! corre çõ es.! Outro ! fundamental! pré F requisito! é que ! a ! tecnologia! empregada! disponha! de té cnicas! atuais! de ! programaçã o.! Desenvolver! um! servidor! Web ! em! Perl 8 ,! como ! era !

p

com!

tantas ! op es! mais! flex veis! existentes.! Por! fim,! muitos! defendem! a ! ideia! de ! que ! o !

desenvolvimento!se !torna !mais!pr tico !e !modular!quando!utilizamos!a !mesma !linguagem!

comum! no ! fim ! da ! d é cada ! de ! 90,! seria ! considerado ! um! pesadelo! nos! dias! de ! hoje ,!

de !programaçã o !para !desenvolver!o !frontend !e !o !backend !do !servidor!Web. !

7 http://www.kegel.com/c10k.html/

8 https://www.perl.org

9

Tendo !em!vista !todos !os!problemas!levantados,!uma !nova !tecnologia!foi !proposta !e

colocada!em!prá tica !h á poucos!anos,!e !a !comunidade!de !desenvolvedores!dela !está cada

vez!maior.!Focada !em!desenvolvimento!de !servidores!Web !em!JavaScript 9

,!a !plataforma

Node.js 10 !foi ! implementada! utilizando! o ! mecanismo! V8,! desenvolvido! pelo

! Google 11 .! V8

é um! mecanismo! altamente! otimizado! de ! JavaScript! que ! funciona! como ! um! compilador!

JIT! (JustF In F Time) conceito ! introduzido! por! McCarthy! (1960)! — ! e ! transforma ! o ! c ó digo

altoF n ível ! em! c ó digo ! de ! m á

quina.! Assim! como ! o ! Google ! Chrome 12 ,! que ! tamb

é m ! utiliza ! o

mecanismo! V8,! o ! Node.js! incorporou! esse ! mecanismo! e ! desenvolveu! uma ! plataforma ! para ! desenvolvimento! Web, ! que ! tr á s ! consigo! os! benefícios! de ! JavaScript! no ! lado ! do !

servidor,!e !os!benefícios!do !desempenho!do !V8 !como !base !estrutural

!da !tecnologia.!

Node.js é principalmente! utilizado ! em! sistemas! com! excesso ! de ! opera çõ es! de ! entrada !e !sa ída,!de !forma !que !essas!opera çõ es!n ã o !bloqueiam!o !processador!do !servidor! e ! executam! em! paralelo! no ! sistema ! operacional.! Al é m ! disso,! a ! aplicaçã o ! principal! é executada! em! uma ! ú nica ! thread,! abstraindo! para ! o ! programador! a ! cria çã o ! de ! outras! threads! em! decorrê ncia ! de ! opera çõ es! n ã o F bloqueantes.! Para ! entender! melhor! como ! a ! tecnologia!consegue!suportar !milhares!de !conexõ es!e !manter!sua !alta!efici ê ncia,!fazemos! um!estudo !detalhado !nesse !trabalho!sobre !Node.js!e !as!té cnicas!de !otimiza çã o !exercidas! no ! interior! da ! plataforma,! al é m ! de ! v á rios! testes! comparativos! com! outras! linguagens! de ! programaçã o ! e ! tecnologias! de ! desenvolvimento! Web. ! Os ! testes! feitos ! no ! decorrer! do ! trabalho! comparam! a ! efici ê ncia ! do ! JavaScript! V8 ! em! termos! de ! velocidade! de ! processamento,! linhas! de ! c ó digo ! para ! uma ! determinada! tarefa ,! e ! recursos! do ! sistema !

m emó ria ! e ! CPU), com! outras! linguagens! de ! programaçã o.! Comparam! tamb m ! o !

desempenho! do ! Node.js,! que ! tem ! o ! V8 ! como ! um! dos! seus! principais! componentes,! em! termos!de !quantidade!de !requisi çõ es!que !o !servidor!consegue!lidar!por!segundo.!

Al é m ! do ! estudo ! tecnol ó gico ! de ! Node.js,! este ! trabalho! envolve! a ! concep çã o ! e !

implementaçã o ! de ! uma ! aplicaçã o ! utilizando! essa ! tecnologia.! A! aplicaçã o ! desenvolvida!

! Brasi l.! Durante ! o ! desenvolvimento,! co locamos! em! prá tica ! todo ! o ! conhecimento! da ! tecnologia! Node.js! abordado! neste ! trabalho,! de ! forma ! a ! maximizar! o ! desempenho! de ! nossa !aplicaçã o !e !prover!o !m ínimo !de !latê ncia !possível !para !as!requisi çõ es!dos!usu á rios.!

! competitiva ! no

tem ! por! objetivo! prover! um! meio ! de ! sistematizar! treinos! de ! programaçã o

9 https://developer.mozilla.org/en-US/docs/Web/JavaScript

10 https://nodejs.org/ 11 http://code.google.com/apis/v8/

12 https://www.google.com/chrome/

10

Estabelecemos! metas! e ! aspectos! funcionais! e ! n ã o F funcionais! que ! foram! implementados! para ! que ! a ! aplicaçã o ! cumpra ! seu ! papel.! Os ! aspectos! funcionais! envolvem! as! características! do ! sistema ! no ! n ível ! de ! comportamento! e ! fun çõ es,! enquanto! os! n ã o F funcionais! definem! como ! o ! sistema ! é operado,! considerando! crité rios! de ! desempenho,! usabilidade,!tecnologias!utilizadas!e !outros.!

O! primeiro ! cap ítulo ! deste ! trabalho! relembra ! alguns! conceitos! b á sicos! da ! Web, ! abordando! rapidamente! a ! evolu çã o ! do ! desenvolvimento! Web ! desde ! q ue ! o ! primeiro ! protocolo! HTTP! (BERNERSF LEE,! 1991 ) ! foi ! estabelecido,! na ! d é cada ! de ! 90.! Falamos!

tamb é m ! sobre ! a ! Web ! interativa ! e ! sobre ! como ! o ! JavaScript! rapidamente! dominou! a !

linguagem!de !script!em!todos !os!navegadores,!mesmo !sendo !tã o Das! duas! ú ltimas! se çõ es! do ! cap ítulo, ! uma ! discorre ! b revemente

!

!popularmente!criticada.! ! sobre ! como ! funciona! o

fluxo ! de ! dados! na ! Web, ! seguindo! a ! pilha! de ! protocolos! TCP/IP\! e ! outra ! explica ! como !

funciona! o ! fluxo ! de ! requisi çõ es! no ! servidor! Web, ! isto ! é ,! o ! que ! acontece! depois! que ! a !

requisi çã o !viaja !pela

!pilha!de !protocolos!TCP/IP !até che gar!no !servidor.!

pido.!

Entendemos! as! otimiza çõ es! feitas ! por! este ! mecanismo! e ! ainda! realizamos! v á rias! avaliaçõ es! de ! desempenho! com! outras! tecnologias,! para ! realmente! medir! se ! esse ! mecanismo !torna !a !execu çã o !de !c ó digo !JavaScript!mais!r á pida !que !outras!linguagens!de

! programaçã o.! Logo ! adiante,! no ! terceiro ! cap ítulo, ! fazemos! um! estudo ! tecnol ó gico ! da ! plataforma ! Node.js! propriamente! dita.! Come ç amos! abordando! o ! contexto ! histó rico ! e ! como ! o ! Node .js ! surgiu,! e ! seguimos! com! as! características! e ! arquitetura! da ! tecnologia! que ! a ! tornam! ú nica ! em! seus! benefícios.! Por! fim,! utilizamos! uma ! s é rie ! de ! benchmarks!

para ! comparar! a ! m é dia ! de ! requisiçõ es! por! segundo! e ! tempo ! m é dio ! por! requisi çã o ! da !

!

plataforma,!em!crité rios!como !servir!arquivos!está ticos,!opera çõ es!de !I/O!e !opera çõ es!de CPU.!

No ! Cap ítulo ! 2 ,! estudamos! o ! que ! é o ! V8 !

e ! como ! ele ! torna ! o ! JavaScript! tã o ! r á

O! cap ítulo ! seguinte! aborda! a ! aplica çã o ! desenvolvida,! no ! qual ! falamos! sobre ! a ! problemá tica ! e ! o ! nosso ! objetivo! com! o ! projeto.! Explicamos! tamb é m ! cada ! aspecto ! funcional! e ! n ã o F funcional! implementado,! de ! forma ! que ! focamos! o ! m á ximo ! possível ! em! tornar!a !intera çã o !do !usu á rio !com!o !sistema !uma !experi ê ncia !fluida !e !r á pida.!Terminamos! o ! cap ítulo ! quatro ! com! a ! arquitetura! da ! aplicaçã o ! e ! os! resultados! dos! testes! que !

ítulo, !discutimos!sobre !a !visã o !geral

realizamos!com!usu á rios!reais.!Por!fim,!no

! deste ! trabalho! e ! as! conclusõ es! que ! tiramos! com! a ! tecnologia! estudada,! assim! como ! as! mudan ç as!que !almejamos!implementar!no !futuro.

!ú ltimo !cap

11

1 4A 4WEB 4

Antes!de !estudarmos!o !Node.js!e !implementarmos!uma !aplicaçã o !utilizando!essa ! plataforma,! precisamos! entender! e ! relembrar! alguns! conceitos! importantes! da ! Web. ! Come ç amos! este ! cap ítulo ! falando ! um! pouco ! sobre ! como ! se ! deu ! a ! evolu çã o ! do ! desenvolvimento!Web, !desde !a !concep çã o !do !seu !primeiro !protocolo!até o !surgimento! das!primeiras!p á ginas!interativas.!Terminaremos!este !cap ítulo !explicando!brevemente! como ! funciona! o ! fluxo ! de ! comunicaçã o ! na ! Internet,! para ! poder! entã o ! discutir! os! passos! que ! cada ! requisi çã o ! segue ! desde ! que ! entra ! no ! servidor! até gerar! uma ! resposta ! ao ! cliente\! compararemos! dois! servidores! Web ! bastante ! utilizados! no ! mercado ! de ! tecnologia,! e ! um! deles! será utilizado! em! conjunto! com! nossa ! aplicaçã o ! para !alavancar!ainda!mais!o !desempenho!da !plataforma !desenvolvida!neste !trabalho.!

1.1!EVOLUÇÃO!DO!DESENVOLVIMENTO!WEB !

H á 60 !mil !anos,!construir!uma !casa !n ã o !era !tã o !simples!quanto!nos!dias!de !hoje.!

O! mundo ! n ã o ! era ! conectado.! As! informa çõ es! e ! té cnicas! que ! uma ! comunidade ! desenvolvia! para ! as! constru çõ es! n ã o ! eram! amplamente! conhecidas.! As ! pessoas! tinham !que !passar!pelo !mesmo !ciclo !de !descoberta!e !aprendizado!para !construir!suas! pró prias!ferramentas.!Com!o !passar!do !tempo,!as!informa çõ es!passaram!a !circular,!o ! homem! passou ! a ! vender! seus! servi ç os! e ! logo ! j á havia ! ind ú strias! especializadas! em! constru çõ es.! Algumas! ind ú strias! focavam! na ! fabrica çã o ! de ! furadeiras,! outras! na ! de ! tijolos,!mas!o !prop ó sito !era !comum:!auxiliar!na !constru çã o !de !uma !casa.!

ã o ! foi ! muito ! diferente .! No ! in ício ! dos! anos! 90,! quando! o ! protocolo!

! conte ú do ! de ! uma ! p á gina ! online,! ela ! s ó recebia! texto.! Suas! op çõ es! como !

desenvolvedor! eram! um! tanto ! limitada.!! Os ! desenvolvedores! passavam! pelo ! mesmo

ciclo ! de ! desenvolvimento! na ! concep çã o ! de ! uma ! aplicaçã o ! na ! Internet,! e ! muito ! pouco !

c ó digo ! era ! reaproveitado.! N ã o ! existiam! frameworks.! Mas! a ! comunidade! de !

programadores! ansiava! por! mais,! e ! era ! claro ! o ! horizonte! de ! op çõ es! que ! um! simples!

HTTP!foi !introduzido,!a !Internet!era !muito !está tica.!Quando !uma !pessoa !requisitava!o

Com! a ! Web ! n

!

12

H TML !está tico !abriu.!A !casa !a !que !nos!referimos!aqui !era !o !conte ú

de ! disponibilizar! online,! e ! as! ferramentas! viriam! a ! ser! uma ! s é rie ! de ! op çõ es! de ! desenvolvimento!que !surgiriam!nos!anos!seguintes.!

do !que !gostar amos!

No !come ç o !da !Web, !os!servidores!que !processavam!as!requisiçõ es!HTTP!eram! quase ! todos ! imple mentados! em! C 13 !e ! serviam! p á ginas! está ticas! correspondentes! ao ! diretó rio ! extra ído ! da ! URL 14 .! Se !! buscá ssemos! o ! endereç o ! www.foo.com/bar.html,! o ! servidor! seria ! re sponsá vel ! por! retornar! o ! arquivo! está tico ! bar.html.! Em ! 1993,! a ! Common ! Gateway ! Interface ! (CGI) 15 !foi ! introduzida! pelo ! Centro ! Nacional! de ! Aplica çõ es! em! Supercomputaçã o ! (NCSA) 16 ,! um! ó rg ã o ! estadounidense! focado ! em! pesquisas!em!informá tica !e !telecomunicaçõ es.!Ago ra,!a !funcionalidade!padrã o !de !um! servidor! Web ! poderia! ser! estendida! para ! que ! o ! diretó rio ! apontado! pela ! URL ! n ã o ! se ! limitasse ! apenas! ao ! HTML ! está tico,! mas! tamb é m ! pudesse! ser! um! script! executá vel.! Se !este !fosse !o !caso,!ao !invé s !de !retornar!o !arquivo,!este !seria !executado!e !a !resposta ! gerada! (geralmente! HTML)! seria ! retornada! ao ! servidor! para,! por! fim,! gerar! uma ! resposta !para !o !cliente.!E!assim!surgiram!as!primeiras!p á ginas!com!conte ú do !gerado! dinamicamente!na !Web. !

Uma ! s é rie ! de ! frameworks! para ! desenvolvimento! Web ! come ç aram! a ! surgir! nos! anos! seguintes,! em! diversas! linguagens! como,! por! exemplo,! Python,! PHP! e ! Java 17 .!

Alguns! surgiram! para ! suprir! a

grandes!oportunidades!de !neg ó cio !nessa !nova !era !virtual.!Alguns!outros!surgiram!com! comunidades! open ! source ! de ! programadores! que ! simplesmente! buscavam! resolver! seus! problemas.! Esses! frameworks! passaram! a ! abstrair! complexidades! subjacentes!

para ! ter ! um!

! necessidade! de ! grandes! corpora çõ es,! que ! visionavam!

da ! Web ! e ! c ó digos! boilerplate 18 !que ! todo ! desenvolvedor! deveria! escrever!

servidor! funcionando.! Eles! proveram! uma ! inversã o ! de ! controle ! nesse ! â mbito ! de !

!

l ó gico !de !sua !aplicaçã o,!e !n ã o !mais!com!os!protocolos!de !comunicaçã o.!

desenvolvimento,! no ! qual ! o ! desenvolvedor! s ó deveria! se ! preocupar! com! o ! aspecto

13 http://www.cprogramming.com/

14 Uniform Resource Locator é o padrão de endereço global para documentos e outros recursos na Web.

15 http://www.w3.org/CGI/

16 http://www.ncsa.illinois.edu/

17 https://www.java.com/

18 Seção de código que deve ser incluída em múltiplos lugares com nenhuma ou quase nenhuma alteração.

13

 

Em !2000,!ape nas!sete !anos!ap ó s !a !primeira !p á

PHP,! ASP 19 !e

! Java ! j á dominavam! a ! maior! parte ! de !

gina !din â mica,!tecnologias!como servidores! Web ! existentes.! Uma

! primeira ! versã o ! do ! Node.js.! No ! entanto,! para ! o ! Node.js! ser! concebido,! o ! JavaScript! precisava!nascer!antes.!

! se ! passar! e ! muitos! frameworks! ainda! iriam! surgir! até o ! lan ç amento ! da

d

é cada ! viria ! a

1.2!JAVASCRIPT:!WEB !INTERATIVA !

Em ! 1995,! numa ! tentativa ! de ! fazer! o ! recé m ! adicionado! suporte ! à Java ! applets 20 ! no ! navegador! da ! Netscape 21 !acessível ! para ! Web ! designers! e ! programadores! n ã o ! experientes! em! Java,! Brendan! Eich,! entã o ! recentemente! contratado! pela ! empresa,! desenvolveu! uma ! linguagem! de ! script! poderosa.! Chamada! inicialmente! de ! Mocha,! e ! posteriormente! de ! LiveScript,! foi ! nomeada! de ! Javascript! ap ó s ! a ! Sun 22 !torn á F la ! uma ! marca !registra da.!Em !pouco !tempo,!JavaScript!come ç ou !a !expandir!seu !prop ó sito,!que ! inicialmente! era ! apenas! manipular! Java ! applets.! Ela ! tornou ! o ! acesso ! aos! elementos! de ! HTML,! como ! formul á rios,! botõ es! e ! imagens! muito ! mais! fá cil ! para ! os! desenvolvedores! Web. ! A! linguagem! de ! programaçã o ! come ç ou ! a ! ser! usada ! para !

manipular! imagens! e ! o ! conte ú do ! das! p á ginas! e,! ao ! fim ! da ! d é cada ! de ! 90,! j ! havia !

scripts! que ! simplesmente! mudavam! uma ! imagem! para ! outra ! em! resposta ! a ! eventos! gerados!pela !movimenta çã o !do !mouse .!

JavaScript!é uma !linguagem!interpretada,!isto

!é ,!seu !c ó digo

lido !e

!interpretado!

por! outro ! programa,! chamado! de ! interpretador! (no ! nosso ! caso,! o

! pró prio

! navegador),!

e ! normalmente! n ã o ! é transformada! em! có digo ! de ! m á quina 23 .! Assim! sendo,! ela ! n ã o !

requer!um!compilador,!o !que !atra ía !bastante !entusiastas!da !filosofia !de !que !"o !quanto! mais! simples! as! coisas! s ã o ! no ! lado ! do ! cliente,! melhor” .! Isso ! fez ! com! que ! muitos! a ! considerassem! apenas! um! brinquedo,! ridicularizassem! e ! afirmassem! que ! n ã o ! se !

19 http://www.asp.net/

20 Tipo especial de programa Java que um navegador habilitado com a tecnologia Java pode baixar da internet e executar.

21 Empresa de serviços de computadores dos EUA, mais conhecida pelo seu navegador Web.

22 http://www.oracle.com/us/sun/

23 O Google Chrome foi implementado em cima do V8, um mecanismo de JavaScript que compila o script para código de máquina afim de potencializar a eficiência do mesmo.

14

precisava! de ! habilidade! alguma! para ! se ! programar ! JavaScript.! Eventua lmente,! uma ! sombra ! enorme ! de ! menosprezo! cobriu ! o ! extraordiná rio ! potencial! que ! esta ! linguagem! de ! programaçã o ! tinha ! a ! oferecer! para ! a ! Web. ! Muitos! anos! depois,! quando! o ! Node.js!

surgiu ! e ! corrigiu ! uma ! parte ! dos! “ lados! ruins” de ! JavaScript,! uma ! grande! comunidade!

de ! desenvolvedores! adotouF a ! em! seus! servidores! web ! e ! passou ! a ! considerá F la ! uma das! op çõ es! mais! vi á veis! e ! escal á veis! para ! desenvolvimento! de ! projetos,! mudando! a forma !como !muitos!programadores!pensavam!sobre !a !linguagem.!

!

!

Javascript! possu ía ! uma ! s é rie ! de ! falhas ! de ! seguranç a ! em! seus! primó rdios.! Ter ! sido ! desenvolvida! em! apenas! dez! dias! pode ! ter ! contribu ído ! para ! isso,! mas! isso ! n ã o ! impediu! de,! em! pouco ! tempo,! a Associa çã o ! Europ é ia ! de ! Fabricantes! de ! Computadores! (ECMA) 24 !criar! uma ! especificaçã o ! padrã o ! para ! ela ,! de ! forma ! que ! desenvolvedores! de ! outros! navegadores! pudessem! imple mentar! um! interpretador.! O! padrã o ! ficou ! conhecido! como ! ECMAScript! (1999).! Isso ! foi ! necessá rio ! principalmente!

devido! de ! compatibilidade! de ! c digo ! frontend ! entre ! m ltiplos! navegadores,! e !

mediante! à ado çã o ! em! massa ! de ! Javascript! por! desenvolvedores! Web, ! o ! que !

apressava!as!grandes!empresas!a !implementar!um!mecanismo!compat vel !com!essa !

linguagem!em!seus!navegadores.!

! pouco !tempo !para !ser!produzido,!e !por!conseguinte!nasceu !com!in ú meros!erros!e !m á s ! prá ticas.!Segundo!Crockford !(2008,!p.!1,!tradu çã o !nossa):!

Um!fato !bastante !disseminado!no !meio !tecnol ó gico !é !qu e !o !JavaScript!teve !muito

JavaScript ! ! uma ! linguagem ! com ! mais ! partes ! ruins ! do ! que ! o ! normal. ! Foi ! de ! uma ! n o F exist nci a ! ! ado o ! global ! em ! um ! alarmante ! pequeno ! per odo ! de ! tempo. ! Ela ! nunca ! passou ! por ! um ! per odo ! de ! teste ! em ! que ! pudesse ! ser ! experimentada ! e ! polida. ! Foi ! direto ! ao ! Netscape ! Navigator ! 2 ! do ! jeito ! que ! estava, ! e ! estava ! muito ! rudimentar. ! Quando ! os ! Java ! applets ! falhar am, ! JavaScript ! se ! tornou ! a ! Linguagem ! da ! Web ! por ! padr o. ! A ! popularidade ! do ! JavaScript ! ! quase ! completamente ! independente ! de ! suas ! qualidades ! como ! linguagem ! de ! programa o. !

Esses! erros! n ã o ! podiam! ser! consertados! pelo ! comitê de ! padronizaçã o,! pois! podiam!causar!uma !falha !em!s é rie !em!todos !os!scripts!na !Web !que !utilizavam!algo !de ! um!jeito!n ã o !recomendado.!O!melhor!que !os!comitê s !poderiam!fazer!é lan ç ar!alguma! mudan ç a ! que ! amenizasse! os! sintomas! de ! erros! cometidos! em! versõ es! antigas,! ou ! introduzisse! nova s ! formas! de ! se ! produzir! uma ! mesma ! tarefa \! em! ambos! os! casos,!

24 http://www.ecma-international.org/

15

muitas!vezes!essas!mudan ç as!acabavam!por!n ã o !se !dar!bem!com!as!partes!ruins!da linguagem,!o !que !eventualmente!gerava !mais!partes!ruins.!

!

Mas! nem! tudo ! s ã o ! coisas! ruins.! O! pró prio ! Crockford,! arquiteto! s ê nior! de !

!

(2006)! membro ! do ! comitê de ! ECMAScript,! afirma ! que ! toda ! linguagem! tem ! sua !

parcela! de ! partes! ruins,! mas! somos! n ó s ! responsá veis! por! usá F las! ou ! n ã o ! [ ].! As !

!

considerada!um!brinquedo!sem!gra ç a !e !incompetente !(2008 ,!p.2F 3 ) .!!

partes! boas! de ! JavaScript! estã o ! tã o ! escondidas! que ! por! muitos! anos! a ! linguagem! foi

JavaScript!no !PayPal 25 ,!conhecido!por!introduzir!o !JSON !( JavaScript!Object!Notation)

Aprender! a ! programar! bem! em! JavaScript,! ao ! invé s ! de ! dedicar! o ! mesmo ! tempo ! aprendendo! outras! linguagens! n ã o ! tã o ! criticadas! no ! mercado,! tem ! tr ê s ! grandes! razõ es:! a ! primeira,! e ! mais! ó bvia,! é que ! se ! o ! objetivo! for ! desenvolver! para ! frontend ! Web ! (a ! camada ! visível ! ou ! que ! interage! de ! perto ! com! o ! usu á rio),! esta ! é a ! ú nica ! possibilidade.! A! Web ! se ! tornou ! uma ! grande! plataforma ! de ! desenvolvimento,! e ! JavaScript!se !tornou !o !ú nico !padrã o !encontrado!em!todos !os!navegadores.!Segundo,! porque! mesmo ! para ! um! desenvolvedor! de ! backend,! Node.js! é uma ! excelente! op çã o ! a ! se ! considerar! na ! hora ! de ! come ç ar! o ! projeto,! como ! veremos! mais! à frente.! Node.js! n ã o ! s egue ! à risca ! o ! padrã o ! ECMAScript! — até porque! ele ! n ã o ! foi ! feito ! para ! navegadores!— e !eliminou!alguns!dos!piores!aspectos!da !linguagem,!como !a !natureza! global!das!vari á veis.!Terceiro,!que !independente!do !tipo !de !desenvolvedor,!JavaScript! na ! verdade! é uma ! excelente! linguagem! quando! quem! a ! utiliza,! realmente! a ! domina.!

É leve,!expressiva!e !funcional,!e !segue !o !modelo!orientado!a !eventos!que ideal!tanto !

para !o !servidor,!quanto!para !o !cliente.!

1.3!FLUXO!DE!COMUNICAÇÃO!NA!WEB !

! s é rie ! de ! passos! e ! protocolos! até se ! transformar! em! uma ! resposta ! visível ! no !

Quando ! visitamos! um! determinado ! endereç o ! na ! Web, ! a ! requisi çã o ! segue ! uma

! comunicaçã o ! na ! Web, ! que ! vai ! desde ! o ! encapsulamento! de ! sua ! requisiçã o ! em! uma !

navegador.!

N ã o ! estamos! interessados! neste ! trabalho! em! estudar! a ! fundo ! o ! fluxo ! de

25 https://www.paypal.com

16

mensagem! HTTP! até a ! divisã o ! dos! dados! em! meio ! físico\! estamos! interessados! em!

entender! os! passos! que ! a ! requisi çã o ! segue ! desde ! o ! momento ! em! que ! chega ! na ! aplicaçã o ! do ! servidor.! Mas! antes! disso,! precisamos! relembrar! alguns! conceitos!

b á sicos!sobre !a !Internet.!

Figur a 41: ! Pilha !de !protocolos ! TCP/IP. ! Fonte: !O ! Autor !
Figur a
41: ! Pilha !de
!protocolos ! TCP/IP. !
Fonte: !O ! Autor !

Quem ! entende! um! pouco ! sobre ! a ! infraestrutura! da ! Internet,! deve ! conhecer! a !

pilha! de ! protocolos! TCP/IP ! (Figura ! 1).! Essa ! pilha! define! as! diversas! etapas! que ! uma

requisi çã o

! passa ! para ! chegar! da ! aplicaçã o ! cliente ! (no ! nosso

! caso,! o ! navegador)! até

a

! aplicaçã

o ! destino ! (o ! servidor! web).! Estamos! acostumados!

a ! definir! as! camadas! da

seguinte!maneira:!

Aplicaçã o!F !processos!nessa !camada !s ã o !específicos!da !aplica çã o,!e !os!dados!

s ã o !codificados!por!algum!protocolo!padrã o !como !HTTP,!FTP !(POSTEL,!1985),!SMTP (POSTEL,!1982),!entre !outros.!O!pacote !nessa !camada !é chamado!de !mensagem.!

!

Transporte ! F ! camada ! responsá vel ! por! determinar! se ! as! mensagens! sempre ! chegam! (confiabilidade)! e ! se ! chegam! na ! ordem! correta ! (integridade).! Distingue! as!

aplicaçõ es!subjacentes!por!um!n ú mero !de !porta !e !utiliza !algum!protocolo!de !transporte como ! TCP ! (POSTEL,! 1981)! ou ! UDP! (POSTEL,! 1980).! O! pacote ! nessa ! camada ! é chamado!de !segmento.!

!

Rede! F ! camada ! responsá vel ! por! transmitir! os! segmentos! entre ! pontos! físicos! distintos,!para !fazer!os!dados!chegarem!da !fonte !ao !destino,!por!meio !de !um!processo !

!IP.!É o !principal!

denominado!roteamento.!Distingue!os!sistemas!utilizando!o !endereç o

protocolo! na ! pilha! de ! protocolos! TCP/IP.! O! pacote ! nessa ! camada ! é chamado! de !

datagrama.!

17

sica! F ! é a ! camada ! de ! n ível ! mais! baixo ! na ! pilha,! e ! é dependente! do ! sistema físico ! no ! qual ! opera.! Trata ! das! tecnologias! de ! comunicaçã o ! em! meio ! físico,! com! fio ! ou !sem!fio .!É responsá vel !tamb é m !pela !tradu çã o !de !endereç os!l ó gicos!e m !endereç os! físicos.!

!

! ao ! destino.! O! protocolo! mais! perto ! da ! aplicaçã o ! está ,! obviamente,! na ! camada ! de !

aplicaçã o\! FTP ! é o ! protocolo! utilizado!

!

! apli ca çõ es! no ! modelo! cliente F servidor! para ! requisi çã o ! e ! resposta ! de ! conte ú do ! da !

Web. ! HTTP! é o ! protocolo! de ! aplicaçã o ! mais! conhecido! da ! Internet,! pois! é ele ! o ! responsá vel !por!permitir!que !acessemos!p á ginas!online.!

! de ! estudo,! pois! é utilizado! para

por! aplica çõ es! de ! transferê ncias! de ! arquivos!

entre !computadores!da !rede\!SMTP !é o !protocolo!utilizado!por!algumas!aplicaçõ es!de

email\! HTTP! é o ! protocolo! usado ! no ! nosso ! escopo

Uma ! requisi çã o ! segue ! essa ! pilha! de ! protocolos! para ! conseguir! chegar! da ! fonte

Figura 42: ! Diagrama !de !sequência !de requisição ! GET. ! !uma !simples ! Fonte:
Figura 42: ! Diagrama !de !sequência !de
requisição ! GET. !
!uma !simples !
Fonte: !O ! Autor !

O! modelo! simplificado! da ! Figura ! 2 ! mostra ! uma ! re quisi çã o ! HTTP.! Nesse ! protocolo,!h á alguns!m é todos !diferentes!de !requisi çã o.!Os !mais!conhecidos!s ã o !GET!

e ! POST! (BERNERSF LEE! at! al.,! 1997).! O! objetivo! do ! GET! é simplesmente! recuperar!

dados,!e !n ã o !deve !ter !efeito!colateral!no !cliente.!Na !maior!parte !das!vezes,!o !conte ú do !

que ! se ! deseja! reaver! está definido! no ! pró prio ! endereç o ! URL ! da ! requisiçã o,! muitas! vezes! junto! com! query! strings,! que ! é uma ! forma ! de ! se ! passar! parâ metros! na !

requisi çã o.! Por!

endereç o ! fictício !

http://www.foo.com/r/bar.html?year=2015,! a ! primeira ! parte ! ( www.foo.com) ! forma ! o ! domínio,! e ! serve ! para ! identificar! o ! h ó spede ! do ! servidor! na ! Internet\! a ! segunda! parte !

exemplo,!

no !

18

( /r/bar.html) ! forma ! o ! caminho! do ! conte ú do ! dentro ! do ! diretó rio ! do ! servidor\! e ! a ! ú ltima !

parte ! ( ?year=2015) ! é a ! query! string ,! e ! fun ciona ! como ! um! refinamento! da ! requisi çã o.! Se ! esse ! endereç o ! retornasse ! uma ! s é rie ! de ! notícias! marcadas! com! uma ! data,! esse ! refinamento! poderia! servir! para ! retornar! apenas! as! notícias! de ! 2015.! Outras! vezes,! poré m,! estes! parâ metros! podem! estar! escondidos! no ! corp o ! da ! mensagem\! esta ! abordagem! é utilizada! principalmente! em! websites! que ! possuem! sistemas! de ! autenticaçã o,! nos! quais! determinados! recursos! s ã o ! acessíveis! apenas! para ! usu á rios! específicos.!

çã o !

! uso.!A!RFC!2616,!que !especifica!o !protocolo!HTTP!1.1,!define!que !“ o método POST é!

utilizado para requisitar ao servidor destino que este aceite a entidade anexada na requisição

como um novo subordinado do recurso identificado pela Request-URI … (BERNERSF

LEE!et!al.,!1997,!tradu çã o !nossa).!Em !outras!palavras,!o !conte ú do !do !POST,!que !pode !

! !se !deseje! o ! servidor!

! para ! fazer! qualquer! tipo ! de ! processamento! — que ! pode ! ser!

uma ! simp les! autenticaçã o ! de ! usu á rio,! sem! efeitos! colaterais! no ! servidor,! ou ! uma ! opera çã o !mais!complexa,!como !modificar!o !banco !de !dados!da !aplicaçã o.!

transmitir! ao ! servidor,! ter á livre F acesso ! a ! ele

d e !dados!contendo!a !resposta !de !um!formul á rio !ou !qualquer!outro !dado !que

ser!uma !anotaçã o !de !recursos!existentes,!uma !postagem!a !um!fó rum!online,!um!bloco

de !armazenamento!ou

!seja !feita !no !servidor.!Poré m,!esse !n ã o !é seu !ú nico

O! m é todo ! POST! é utilizado!

!modifica çã o

principalmente! quando! queremos! que ! alguma!

a

é utilizado! como ! um! dos! recursos! da ! requisi çã o,! e !

Relembramos! até aqui ! alguns! conceitos! b á sicos! da ! Internet,! e ! focamos! no ! protocolo! que ! estamos! mais! interessados:! H TTP.! A! partir! de ! agora,! precisamos!

entender! o ! que ! um! servidor! faz ! com! uma ! requisi çã o ! HTTP,! dado ! que ! esta ! chega ! no

servidor.! Com! isso,! conseguiremos! entender! as!

diferentes! abordagens! utilizadas! no

d esenvolvimento!Web !para,!ent o ,!introduzir!a !que !estudaremos !neste !trabalho.!

1.4!FLUXO!DE!REQUISIÇÃO!NOS!SERVIDORES!

Assim! como ! a ! rede ! mundial! de ! computadores! opera ! sobre ! uma ! pilha! de ! protocolos,!os!servidores!web !tamb é m !definem!sua !pró pria !pilha!de !etapas.!Esta !pilha!

é conhecida!como !Web !stack!(pilha !da !Web) ,!ou !H TTP !service !stack!(pilha !de !servi ç os!

19

HTTP).!Uma !das!pilhas!de !software !mais!conhecidas!é LAMP,!acrô nimo !para !Linux 26 ,!

Apache 27 ,!MySQL 28 !e !alguma!linguagem!de !script!dentre !PHP,!Perl !e !Python.!H á outra

variante,!denominada!LEMP,!que

!ao !invé s !de !utilizar!o !servidor!Apache,!usa !o !Nginx 29

(pronunciaF se !engineG x ).!No !fluxo

!que !estamos!interessados,!podemos!abstrair!qual !o

sistema !operacional!utilizado!e !qual !o !modelo!de !banco !de !dados!da !aplica çã o.!O!que

precisamos! notar! aqui ! s ã o ! dois! fatos ! importantes:! o ! servid or! Web ! e ! a ! linguagem! de

programaçã o.! Veremos,! no ! Cap ítulo ! 3,! que ! o ! Node.js! por! si ! s ó j á é um! servidor! Web, mas! que ! podemos! integrá F lo ! com! servidores! Web ! mais! robustos,! como ! os! dois! citados,!para !aumentar!ainda!mais!o !poder!da !plataforma.!

Figura 43: ! Fluxograma !simplificado !de !requisição !entre ! o !navegador !e !o !se rvidor. !

Fonte: !O ! Autor !
Fonte:
!O ! Autor !

A!Figura !3 !ilustra !simplificadamente!o !fluxo !de !uma !requisi çã o !dentro !do !servidor! utilizando! o ! modelo! LAMP.! Dizemos! que ! este ! fluxo ! é simplificado! pois! ignora! que ! o ! servidor! m uito! provavelmente! ter á um! sistema ! de ! cache ,! servirá com! arquivos! está ticos! independente! ao ! interpretador! subjacente! e ! tamb é m ! poderá ser! intermediado! por! um! sistema ! de ! balanceamento! de ! cargas\! uma ! grande! aplicaçã o ! Web ! muito ! provavelmente! ter á todas ! essas! c aracterísticas,! mas! elas! s ã o ! opcionais! para !sistemas!menores.!

Neste !modelo,!o !navegador!faz !uma !requisi çã o !ao !servidor.!O!recurso !solicitado!

!

segundo! caso,! o ! servidor! é responsá vel ! por! chamar! o ! m ó dulo ! interpretador.! Este !

do ! banco ! de ! dados.!

! um! arquivo! de ! script.! No

pode ! ser! um! arquivo! está tico,! como ! uma ! p á gina

HTML,! ou

!

m ó dulo ! pode ! fazer! altera çõ es! ou ! simplesmente! recuperar! dados!

26 Sistema operacional open source baseado em Unix.

27 http://www.apache.org

28 https://www.mysql.com

29 http://nginx.org

20

No ! final, ! ele ! gera ! uma ! resposta,! que ! pode ! ser! um! arquivo! HTML,! uma ! imagem,! ou ! qualquer! outra ! coisa ! que ! você considere! que ! um! servido r ! possa ! retornar.! Esta ! resposta ! entã o ! é devolvida! ao ! servidor! Web, ! que ! se ! responsabiliza! por! encapsulá F la em!uma !mensagem!HTTP!e !devolver!ao !cliente.!

!

! fluxo:!lidar!com!o !recebimento!e !o !envio !de !mensagens,!servir!arquivos!está ticos,!lidar! com! a ! cache,! entre ! outros.! É como ! se ! o ! servidor! Web ! fosse ! o ! recepcionista! de ! uma empresa.!Nesse !caso,!os!c ó digos!desenvolvidos!s ã o !os!escritó rios.!Eles!que !dizem!o

Com! isso,! percebemos! que ! o ! servidor! é responsá vel ! pela ! parte ! burocrá tica ! do

!

! que,! quando! e ! como ! a ! empresa ! faz ! o ! que ! faz.! Eles! dirigem! o ! servidor! e ! controlam! toda ! a ! l ó gica ! da ! aplicaçã o.! Mas! eles! precisam! de ! um! seguranç a ! (isto ! é ,! o ! servidor!

Web) !para !deixar!entrar!no !pré dio !e !guiar!ao !escritó rio !correto.!

Tanto !o !Nginx!quanto!o !Apache !s ã o !ó timos!servidores!Web, !e !estã o !no !mercado ! h á muitos! anos.! O! Apache ! foi ! criado ! em! 1995 ! por! Robert! McCool,! um! desenvolvedor! de