123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- \section{N2O: Application Server}
- N2O was started as the first Erlang Web Framework
- that uses WebSocket protocol only. We saved great compatibility with Nitrogen
- and added many improvements, such as binary page construction,
- binary data transfer, minimized process spawns, transmission of all events over the WebSocket
- and work within Cowboy processes. N2O renders pages several times faster than Nitrogen.
- \subsection{Wide Coverage}
- N2O is unusual in that it solves problems in different web development domains
- and stays small and concise at the same time. Started as a Nitrogen concept
- of server-side framework it can also build offline client-side applications
- using the same source code. This became possible with powerful Erlang JavaScript Parse
- Transform which enables running Erlang on JavaScript platform and brings in Erlang and JavaScript
- interoperability. You can use Elixir, LFE and Joxa languages for backend development as well.
- \paragraph{}
- N2O supports DSL and HTML templates. It lets you build JavaScript
- control elements in Erlang and perform inline rendering with DSL using
- the same code base for both client and server-side.
- How to use N2O is up to you. You can build mobile applications using server-side rendering
- for both HTML and JavaScript thus reducing CPU cycles and saving the battery of a mobile device.
- Or you can create rich offline desktop applications using Erlang JavaScript compiler.
- \newpage
- \subsection*{Why Erlang in Web?}
- We have benchmarked all the existing modern web frameworks that were built using functional
- languages and Cowboy was still the winner. The chart below shows raw HTTP
- performance of functional and C-based languages with concurrent
- primitives (Go, D and Rust) on a VAIO Z notebook with i7640M processor.
- \includeimage{n2o_benchmark.png}{Web-Servers raw performance grand congregation}
- \paragraph{}
- Erlang was built for low latency streaming of binary data in telecom systems.
- It's fundamental design goal included high manageability, scalability
- and extreme concurrency. Thinking of WebSocket channels as binary
- telecom streams and web pages as user binary sessions
- helps to get an understanding reasons behind choosing Erlang
- over other alternatives for web development.
- \paragraph{}
- Using Erlang for web allows you to unleash the full power of telecom systems for
- building web-scale, event-driven, message-passing, NoSQL, asynchronous, non-blocking,
- reliable, highly-available, performant, secure, real-time, distributed applications.
- See Erlang: The Movie II.
- \paragraph{}
- N2O outperforms full Nitrogen stack with only 2X raw HTTP Cowboy
- performance downgrade thus upgrading rendering performance several
- times compared to any other functional web framework. And
- sure it's faster than raw HTTP performance of Node.js.
- \subsection{Rich and Lightweight Applications}
- There are two approaches for designing client/server communication.
- The first one is called 'data-on-wire'. With this approach only JSON, XML or binary
- data are transferred over RPC and REST channels. All HTML rendering
- is performed on the client-side. This is the most suitable approach for building desktop
- applications. Examples include React, Meteor and ClojureScript.
- This approach can also be used for building mobile clients.
- \paragraph{}
- Another approach is sending pre-rendered parts of pages and JS
- and then replacing HTML and executing JavaScript on the client-side. This approach
- is better suited for mobile web development since the
- client doesn't have much resources.
- \paragraph{}
- With N2O you can create both types of applications. You can use N2O REST framework
- for desktop applications based on Cowboy REST API along with DTL
- templates for initial HTML rendering for mobile applications.
- You can also use Nitrogen DSL-based approach for modeling parts of pages
- as widgets and control elements, thanks to Nitrogen
- rich collection of elements provided by Nitrogen community.
- \paragraph{}
- In cases when your system is built around Erlang infrastructure, N2O
- is the best choice for fast web prototyping, bringing simplicity
- of use and clean codebase. Despite HTML being transfered over the wire,
- you still have access to all your Erlang services directly.
- \paragraph{}
- You can also create offline applications using Erlang JavaScript compiler
- just the way you would use ClojureScript, Scala.js, Elm, WebSharper
- or any other similar tool. N2O includes: REST micro frameworks,
- server-side and client-side rendering engines,
- WebSocket events streaming, JavaScript generation
- and JavaScript macro system along with {\bf AVZ} authorization
- library (Facebook, Google, Twitter, Github, Microsoft), key-value storages
- access library {\bf KVS} and {\bf MQS} Message Bus client library (gproc, emqttd).
- \subsection{JSON and BERT}
- N2O uses JSON and BERT. All messages passed over
- WebSockets are encoded in native Erlang External Term Format.
- It is easy to parse it in JavaScript with {\bf dec(msg)}
- and it helps to avoid complexity on the server-side. Please refer
- to \footahref{http://bert-rpc.org}{http://bert-rpc.org} for detailed information.
- \subsection{DSL and Templates}
- We like Nitrogen for the simple and elegant way it constructs typed
- HTML with internal DSL. This is analogous to Scala Lift,
- OCaml Ocsigen and Haskell Blaze approach. It lets you develop reusable control
- elements and components in the host language.
- \paragraph{}
- Template-based approach (Yesod, ASP, PHP, JSP, Rails, Yaws and ChicagoBoss)
- requires developers to deal with raw HTML. It allows
- defining pages in terms of top-level controls, placeholders
- and panels. N2O also support this approach by proving bindings
- to DTL and ET template engines.
- \paragraph{}
- The main N2O advantage is its suitability for large-scale projects
- without sacrificing simplicity and comfort of prototyping solutions
- in fast and dynamic manner. Below is an example of complete Web Chat
- implementation using WebSockets that shows how Templates, DSL and
- asynchronous inter-process communication work in N2O.
- \newpage
- \vspace{1\baselineskip}
- \begin{lstlisting}[caption=chat.erl]
- -module(chat).
- -include_lib("nitro/include/nitro.hrl").
- -compile(export_all).
- main() ->
- #dtl { file = "login",
- app = review,
- bindings = [ { body, body() } ] }.
- body() ->
- [ #span { id=title, body="Your nickname: " },
- #textbox { id=user, body="Anonymous" },
- #panel { id=history },
- #textbox { id=message },
- #button { id=send, source=[user,message],
- body="Send",
- postback=chat } ].
- event(init) -> wf:reg(room), wf:async("looper",fun loop/1);
- event(chat) -> User = wf:q(user),
- Message = wf:q(message),
- n2o_async:send("looper",{chat,User,Message}).
- loop({chat,User,Message}) ->
- Terms = #panel { body = [
- #span { body = User }, ": ",
- #span { body = Message } ]},
- wf:insert_bottom(history, Terms),
- wf:flush(room).
- \end{lstlisting}
- \vspace{1\baselineskip}
- Just try to build the similar functionality with your favorite
- language/framework and feel the difference! Here are one message bus,
- one async {\bf gen\_server} worker under supervision, NITRO DSL, DTL template,
- WebSockets, HTML and JavaScript generation in a simple file that you can
- put in your N2O application directory tree without restart and
- manual compilation. Also you can create single-file bundle
- which is able to run in Windows, Linux and Mac. Moreover this
- application is ready to run under multiplatform LING Erlang virtual machine.
- \newpage
- \subsection*{Changes from Nitrogen}
- We took a liberty to break some compatibility with the original
- Nitrogen framework, mostly because we wanted to have a clean codebase
- and achieve better performance. However, it's still possible to port
- Nitrogen web sites to N2O quite easily. E.g., N2O returns id and
- class semantics of HTML and not {\bf html\_id}.
- We simplified HTML rendering without using
- {\bf html\_encode} which should be handled by application layer.
- \paragraph{}
- Nitrogen.js, originally created by Rusty Klophaus, was removed
- because of the pure WebSocket nature of N2O which doesn't
- require jQuery on the client-side anymore. In terms of lines of code
- we have impressive showing. New {\bf xhr.js} 25 LOC and {\bf bullet.js} 18 LOC
- was added as the replacement, also {\bf nitrogen.js} takes only 45 LOC.
- UTF-8 {\bf utf8.js} 38 LOC could be plugged separately only when you're
- using {\bf bert.js} 200 LOC formatter. {\bf n2o.js} protocol handler is about 20 LOC.
- \paragraph{}
- We also removed {\bf simple\_bridge} and optimized N2O on each level to
- unlock maximum performance and simplicity. We hope you will enjoy
- using N2O. We are fully convinced it is the most efficient way to
- build Web applications in Erlang.
- \paragraph{}
- Original Nitrogen was already tested in production under high load and we
- decided to remove {\bf nprocreg} process registry along
- with {\bf action\_comet} heavy process creation. N2O creates a single
- process for an async WebSocket handler, all operations
- are handled within Cowboy processes.
- \paragraph{}
- Also, we introduced new levels of abstraction. You can extend
- the set of available protocols (Nitrogen, Heartbeat, Binary),
- change protocol formatters to BERT, JSON or MessagePack, inject
- your code on almost any level. The code structure
- is clean and Nitrogen compatibility layer NITRO is fully detachable
- from N2O and lives in a separate {\bf synrc/nitro} application.
|