profile picture

HAppS

Það hefur runnið upp fyrir mér síðustu daga að lærdómskúrvan fyrir vefforritun í Haskell er mjög brött. Það er lítið til af skrifuðu efni. Mér sýnist þó eftir þessa rannsóknarvinnu að þrjár leiðir séu helst færar:

  1. Keyra kóðann sem CGI í vefþjóni
    Kostur: Ekki þarf að þýða Haskell kóðann.
    Galli: Hægvirkt
  2. Keyra kóðann sem FastCGI í vefþjóni
    Kostur: Getur keyrt á þekktum vefþjónum eins og Apache og LigHTTP.
    Galli: Þarf að endurræsa vefþjóninn til þess að breytingar taki gildi.
  3. Keyra kóðann í HAppSThe Haskell Application Server
    Kostur: Margir, sjá umfjöllun hér að neðan
    Galli: Nánst engar upplýsingar um HAppS


Þar sem ég er á höttunum eftir algjörlega nýrri hugsun (eins og fram kemur í fyrstu færslunni) ákvað ég að velja síðustu leiðina, þ.e. nota HAppS. Ég eyddi um klukkutíma í að horfa á fyrirlestur um HAppS sem Alex Jacobson, höfundur HAppS, hélt í október á síðasta ári. Þar sem ég hef lengi verið í vefforritun og sjálfur með hugmyndir um það hvernig mér finnist hluturnir eiga vera gerðir kom mér skemmtilega á óvart hvað Alex hafði skemmtilega og í raun mjög sambærilega sýn.

Í venjulegu vefumhverfi, oft nefnt N-laga umhverfi, skiptist umhverfið venjulega í þrjú lög:

  1. Gagnamódelslag
    Gögn eru í flestum tilfellum geymd í gagnagrunnum en til þess að gögnin séu nothæf þarf að módela gögnin í forritunarmálinu sem notað er.
  2. Aðgerðalag
    Hér er virkni vefjarins ákveðin.
  3. Framsetningarlag
    Þegar aðgerðarlagið er búið að vinna með gagnamódelin eru þau áframsend í þetta lag. Venjulega er það hér sem blanda af forritunarmáli og HTMLi skilar niðurstöðunum til vafrans.


Gallinn við þessa uppsetningu er oft á tíðum sá að mikil vinna er fólgin í því að koma gögnunum úr gagnagrunninum og í strúktúr sem nýtist í forritunarmálinu. Einnig getur verið erfitt að skala þetta umhverfi. Ég er því opinn fyrir þeim aðferðum sem HAppS leggur til:

Gögnin eru módeleruð frá upphafi í Haskell og litið er á vefinn sem stöðuvél. Staðan hverju sinni er geymd í minni en skrifuð út í svokallaða logga. Þannig getur þjónninn spólað í gegnum alla loggana til þess að flytja kerfið í síðustu stöðu ef endurræsa þarf þjóninn. Þetta hefur verið þekkt sem Prevayler-mynstrið. Til þess að koma í veg fyrir að þjónninn þurfi að lesa loggana frá örófi alda skrifar hann út millistöður (e. Check point) með reglulegu millibili. Eingöngu þarf þá að lesa loggana frá þeirri stöðu. Í fyrirlestrinum kemur Alex líka inn á nýjan fídus sem hleður viðeigandi hluta stöðuvélarinnar í minni ef hún kemst ekki öll fyrir í minninu - þetta þarf að gera handvirkt í dag.

Prevayler-mynstrið gerir HAppS kleyft að gera ýmsa sniðuga hluti, eins og keyra klasa af HAppS-þjónum og samræma stöðu á milli þeirra. Þannig er hægt að dreifa vinnslu á marga þjóna til þess að minnka álag á vélbúnað og koma í veg fyrir að vefir fari niður ef vélbúnaður deyr. Þetta þýðir líka að þegar uppfæra þarf hugbúnaðinn verða notendur ekki varir við neinn niðritíma. Annað sem mér fannst áhugavert við uppfærslur hugbúnaðarins og að koma þeim í rekstur er að þegar hugbúnaðurinn er þýddur verður til ein keyrsluskrá sem eingöngu þarf að afrita yfir á þá þjóna sem eiga að taka þátt í verkinu. Þjónarnir sjá alveg um að hlaða inn nýju útgáfunni.

Tegundakerfið (e. Type system) í Haskell er gríðarlega öflugt og mjög auðvelt og er það t.d. einsmóta XML. HAppS sér því um að flytja gögnin yfir í XML sjálfvirkt og því þarf eingöngu að umbreyta XML-inu, með hjálp XSL, yfir í annað birtingaform.

Mér finnst HAppS spennandi og ekki síður í því ljósi að HAppS virðist vera Haskell-leiðin í vefforritun. Hins vegar er ég hræddur um að þetta geti orðið erfið fæðing vegna lítillar skjölunar. Mér skilst að HAppS-liðið hangi á IRC-inu svo ég ætla að reyna að fá vísbendingar um hvernig er best að læra á græjuna.

@code