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