290 likes | 463 Views
Erlang Web Scalable & Reliable web framework. ErlLounge, Kraków Lipiec 2009 (wersja rozszerzona dla czytelników off-line;)). Dziś. Dlaczego? Kto? Co? Jak? Co dalej? Jak zacząć?. Dlaczego?. Naturalny frontend dla systemów napisanych w Erlang/OTP
E N D
Erlang WebScalable & Reliable web framework • ErlLounge, Kraków • Lipiec 2009 • (wersja rozszerzona dla czytelników off-line;))
Dziś • Dlaczego? • Kto? • Co? • Jak? • Co dalej? • Jak zacząć?
Dlaczego? • Naturalny frontend dla systemów napisanych w Erlang/OTP • Wsparcie dla skalowalności w każdej warstwie: • HTTP servers: Yaws and INETS… • Cache i dystrybucja sesji • Databases: Mnesia, CouchDB… • Zarządzanie kodem (Buildability, Integrity) • Paradygmat MVC • Nie ma Erlanga w templatach HTML • Rozszerzalność (plugins)
Kto? • ETC • SourceForge • BitBucket
Jak to działa? • Przetwarzanie requestu z serwera HTTP • Przetwarzanie danych • Rozwijanie dynamicznych danych w templatach (za pomocą wpart’ów lub DTL)
OUT IN
OUT • Dispatcher • Przyjazne URL na bazie regexp’ów • Controllers, Docroot, Templates • Dostępne za pomocą reguł dispatchera {rodzaj, URL pattern, {moduł, funkcja}}. {dynamic, "^/index.html$", {main, home}}. {dynamic, delegate, "^/user", "config/dispatcher/user.conf"}. {static, "^/about$", "about.html"}. {static, "^style.css$", enoent}.
OUT • Templates • Zgodne z XHTML • Budowane przez wtpl • Wparts • Dynamiczne znaczniki • Wtypes • Formatowanie wg. typu • <wpart:list select="map" as=”user_age" list=”all_users"> • <p><wpart:lookup key=”user_age" format=”integer"/></p> • </wpart:list>
OUT • Form builder • Generowane na podstawie typów • Caching • Binarna postać stron • i18n • Tłumaczenia • Wiele języków • config/languages/pl.conf file: {"pass", "Hasło"}. • template: <wpart:lang key="pass"/>
IN • Request dictionary & sesja • Podręczna pamięć o długości życia requestu • wpart:fget("post", "form_input"), • wpart:fget("session", "username"), • wpart:fset("node", node()) • And then in your template: <wpart:lookup key="node" format="atom"/> • Wtypes • - automatyczna walidacja
IN • Dataflow • - Funkcyjne szeregowanie przetwarzania requestu • Annotations • Meta opis dataflow’u • Distribution • Dwupoziomowa architektura – każdy z poziomów rozproszony horyzontalnie • e-Components • Mechanizm rozszerzeń i wtyczek (paypal, e_backup)
Annotations • Meta-language kontrolowania realizacji requestu • Definiują funkcje przed i po właściwym kontrolerze • Autoryzacja • Walidacja danych wejsciowych • Przykładowe zastosowania po zwroceniu tokenu dla servera • Invalidacja zawartości cache • Asynchroniczne (względem requestu) operacje np. na dysku lub w logach.
Annotations • -module(my_utils). • -export([logme/4]). • -include_lib("eptic/include/e_annotation.hrl"). • ?BEFORE. • logme(AnnArgs, Mod, Fun, ControllerArgs) -> • io:format("~s~n", [AnnArgs]), • {proceed, ControllerArgs}. -module(controller). -export([my_fun/0]). […] ?LOGME("Calling my_fun"). my_fun() -> wpart:fget("post", "id"), […]
Budowanie formularzy • Forularze z defaultowymi wartosciami (edycja) • Szkielet formularza oparty na: • HTML table - <table><tr><th/><td/> • Paragraph - <p id="…"><label><span> • List - <ul><li><label><span> • Div - <div id="…”><label><span>
Formularze • Reprezentacja typów I formularzy za pomocą recordów • article.hrl • -record(article, { • id, • text, • hide • }). • -record(article_types, { • id = {integer, […]}, • title = {string, […]}, • hide = {enum, […]} • }). templates/article.html <wpart:form type="article" action="/article/create" />
Caching • Caching – realizacja kontrolera, action caching • {dynamic, "^/blog/list", {blog, list}, [{cache, persistent]}. • Cache – strony statyczne • {static, "^/faq$", "doc/faq.html", [{cache, normal}]}. • Cache – template scope • <wpart:cache id="left_menu" groups="menus" type="persistent"> • SOME CONTENT • </wpart:cache>
Cache - Invalidacja • regexp • Precyzyjne działanie za pomocą anotacji • ?INVALIDATE(["^/blog/list"]). • update_blog() -> • [update your database here...] • {template, "blog.html"}. • ?INVALIDATE_GROUPS(["menus"]). • update_menu() -> • [update your database here...] • {template, "blog.html"}.
Distribution • Front End • HTTP server • Dispatcher • Cache tables • Static content • Back End • Invalidator • Controllers • Templates • Database
Stress testing • One machine for Erlang Web application and one for Tsung • Intel Core 2 Due 2.4 GHz • 3 GB DDR2 RAM • Erlang R12-5, no hipe • Suse 11 • Application implemented with • INETS 5.0.12 or Yaws 1.80 • Mnesia as database • dispatcher, template inheritance • Erlang Web cache or memcached (through merle)
Memcached through merle Inets server Tsung (HTTP 1.1 connections) 1000 pages / sec Stress testing • Erlang Web cache • Inets server • Tsung (HTTP 1.1 connections) • 1500 pages / sec
Plugins • bin/e_component.erl list - lists all the e_components • bin/e_component.erl search Keyword • bin/e_component.erl details Name • bin/e_component.erl install Name • bin/e_component.erl path Path install Name
Przykłady • erlang-consulting.com
Przykłady • erlang-consulting.com • umbria-rentals.com
Przykłady • erlang-consulting.com • umbria-rentals.com • protest-project.eu
Przykłady • erlang-consulting.com • umbria-rentals.com • protest-project.eu • erlang-web.org
Przykłady • erlang-consulting.com • umbria-rentals.com • protest-project.eu • erlang-web.org • erlang-factory.com
Zasoby • Projekt:http://www.erlang-web.org(przykładowe tworzenie aplikacji krok po kroku) • Wiki:http://wiki.erlang-web.org • Ropozytoriumhttp://bitbucket.org/etc/erlang-web
Więcej ->http://www.erlang-web.org • Dziękuję