SlideShare a Scribd company logo
1 of 58
Misultin
                      [pron.: Mee-sool-téen]



An Erlang library for building fast lightweight HTTP(S) servers




>-|-|(°>
  Erlang User Group London - May 16th, 2011
Who am I?
Technologist and Entrepreneur. I am
particularly interested in Erlang, Python,
scalability, research, development and
integration of the multiple technologies
behind the creation of ubiquitous
computing. I’m currently co-founder
and CTO of WideTag Inc [widetag.com].


e: roberto@ostinelli.net
t: @ostinelli
<1>
What are Misultins?
Misultin are a culinary specialty of the Lake of Como.
They are lake fishes that go by the latin name of Alosa
fallax lacustris, treated and cooked in a traditional
and specific way.
What is Misultin?
Misultin (pronounced mee-sool-téen) is an Erlang
library for building fast lightweight HTTP(S) servers,
which also supports websockets.




   >-|-|(°>
Why another lib?
When do programmers start a new lib?

  ‣ Nothing similar exists
  ‣ Different Approach / Focus
  ‣ Total Control / Knowledge
  ‣ Experiment/Hack/Academic
Features v0.7.1
‣ Embedded, not application
‣ ~ HTTP/1.1
‣ Support for GET, POST, HEAD, PUT, DELETE, TRACE and CONNECT
‣ SSL
‣ Output compression            [gzip, deflate]


‣ Chunked / Stream / File sending [attachment, visualization]
‣ Customizable parameters               [max_connections, post_max_size, get_url_max_size, ...]


‣ Multiple servers on a single node                [custom name / nameless]


‣ Websockets    [also on SSL]


‣ Trapping of client closing a browser in Comet applications
‣ With / without Parametrized Modules
</1>
<2>
Code | “Hello World”
Simple “Hello World” using parametrized modules.
Code | “Hello World”
Simple “Hello World” not using parametrized modules.
Code | File Sending
Simple file sending.
Code | REST
Code | Websocket
1. Start Misultin specifying a Websocket loop.
Code | Websocket
2. Send the HTML + Js page.
Code | Websocket
3. Handle Websocket Data on server.
Code | Websocket
Live Demo.
Code | Server Options
start_link(Options) -> Result

Options = [Option]
Option = {ip, list() | tuple()} |
 {port, integer()} |
 {name, atom()|false} |
 {max_connections, integer()} |
 {post_max_size, integer()} |
 {get_url_max_size, integer()} |
 {compress, true|false} |
 {loop, fun()} |
 {autoexit, true|false} |
 {ws_loop, fun()|none} |
 {ws_autoexit, true|false} |
 {backlog, integer()} |
 {acceptors_poolsize, integer()} |
 {recv_timeout, integer()} |
 {ssl, SslOptions}
  SslOptions = [SslOption(§)]
</2>
<3>
Design | Overview
                 proc_lib:spawn_link/3
   gen_server
                                          Acceptor          TCP Acceptor
    [misultin]
                                                        . erlang:spawn/1
                        Acceptor
                                                           . gen_tcp:controlling_process/2
Main gen_server                                             . call to gen_server to:
                                                                  - http_pid_ref_add/2: add new pid to ref
                                                                  - erlang:monitor/2: for gen_server count



                    Http Process         Http Process       Http Process        HTTP Logic



                                                                      erlang:spawn_link/1




                                                              HttpLoop          Application Logic
Design | Crash: Acceptor
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: Acceptor
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: Acceptor
                 proc_lib:spawn_link/3
   gen_server
                                          Acceptor       TCP Acceptor
    [misultin]
                    'EXIT' message:                  . erlang:spawn/1
                    gen_server respawns                 . gen_tcp:controlling_process/2
                    a new acceptor                         . call to gen_server to:
Main gen_server
                                                                 - http_pid_ref_add/2: add new pid to ref
                                                                 - erlang:monitor/2: for gen_server count



                                                         Http Process         HTTP Logic



                                                                    erlang:spawn_link/1




                                                           HttpLoop           Application Logic
Design | Crash: HttpProcess
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: HttpProcess
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count
                                                        1.


                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: HttpProcess
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count
                                                        1.


                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1

                                                       2.


                                                            HttpLoop         Application Logic
Design | Crash: HttpProcess
                 proc_lib:spawn_link/3
   gen_server
                                           Acceptor       TCP Acceptor
    [misultin]
                                                      . erlang:spawn/1
                                                         . gen_tcp:controlling_process/2
Main gen_server                                             . call to gen_server to:
                                                                  - http_pid_ref_add/2: add new pid to ref
                                                                  - erlang:monitor/2: for gen_server count
                     3. 'DOWN' message:
                                                          1.
                     decrease open
                     connections counter
                                                          Http Process         HTTP Logic



                                                                     erlang:spawn_link/1

                                                         2.


                                                              HttpLoop         Application Logic
Design | Crash: HttpLoop
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: HttpLoop
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: HttpLoop
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic

                                           'EXIT' message:
                                           HttpProcess sends
                                           HTTP 500 error          erlang:spawn_link/1
                                           message to client




                                                          HttpLoop           Application Logic
Design | Crash: gen_server
                 proc_lib:spawn_link/3
   gen_server
                                         Acceptor       TCP Acceptor
    [misultin]
                                                    . erlang:spawn/1
                                                       . gen_tcp:controlling_process/2
Main gen_server                                           . call to gen_server to:
                                                                - http_pid_ref_add/2: add new pid to ref
                                                                - erlang:monitor/2: for gen_server count



                                                        Http Process         HTTP Logic



                                                                   erlang:spawn_link/1




                                                          HttpLoop           Application Logic
Design | Crash: gen_server
  1.
                     proc_lib:spawn_link/3
       gen_server
                                             Acceptor       TCP Acceptor
        [misultin]
                                                        . erlang:spawn/1
                                                           . gen_tcp:controlling_process/2
Main gen_server                                               . call to gen_server to:
                                                                    - http_pid_ref_add/2: add new pid to ref
                                                                    - erlang:monitor/2: for gen_server count



                                                            Http Process         HTTP Logic



                                                                       erlang:spawn_link/1




                                                              HttpLoop           Application Logic
Design | Crash: gen_server
  1.                                         2.
                     proc_lib:spawn_link/3
       gen_server
                                                  Acceptor       TCP Acceptor
        [misultin]
                                                             . erlang:spawn/1
                                                                . gen_tcp:controlling_process/2
Main gen_server                                                    . call to gen_server to:
                                                                         - http_pid_ref_add/2: add new pid to ref
                                                                         - erlang:monitor/2: for gen_server count



                                                                 Http Process         HTTP Logic



                                                                            erlang:spawn_link/1




                                                                   HttpLoop           Application Logic
Design | Crash: gen_server
  1.                                          2.
                     proc_lib:spawn_link/3
       gen_server
                                                    Acceptor       TCP Acceptor
        [misultin]
                                                               . erlang:spawn/1
                                                                  . gen_tcp:controlling_process/2
Main gen_server                                                      . call to gen_server to:
                                                                           - http_pid_ref_add/2: add new pid to ref
                          terminate(_,_) ->                                - erlang:monitor/2: for gen_server count
                             exit(HttpPid, kill).                  3.


                                                                   Http Process         HTTP Logic



                                                                              erlang:spawn_link/1




                                                                     HttpLoop           Application Logic
Design | Crash: gen_server
  1.                                          2.
                     proc_lib:spawn_link/3
       gen_server
                                                    Acceptor       TCP Acceptor
        [misultin]
                                                               . erlang:spawn/1
                                                                  . gen_tcp:controlling_process/2
Main gen_server                                                      . call to gen_server to:
                                                                           - http_pid_ref_add/2: add new pid to ref
                          terminate(_,_) ->                                - erlang:monitor/2: for gen_server count
                             exit(HttpPid, kill).                  3.


                                                                   Http Process         HTTP Logic



                                                                              erlang:spawn_link/1

                                                                  4.



                                                                       HttpLoop         Application Logic
</3>
<4>
Benchmarks | Foreword
‣ No such thing as generic benchmarks: specific case
 [fast application times, loads of connections, small data]


‣ ‘Fast’ is only 1 of the ‘n’ features you want
 [stability, features, ease of maintenance, low standard deviation, code usability, ...]


‣ This is no ‘pissing’ contest. *Not* what I wanted to see:
Benchmarks | Test
‣ Not only Erlang

‣ Chosen libraries are all lightweight & dynamic
 [compare apple with apples: no Yaws, no Nginx]


‣ Periodically close down the TCP connection

‣ All tests run on a single CPU

‣ No RAM/CPU considerations
Benchmarks | Test
‣ ‘Dynamic’ tests: no “Hello world”

The test basically asks servers to:

 • check if a GET variable is set

 • if the variable is not set, reply with an XML stating the error:

   <http_test><error>no value specified</error></http_test>

 • if the variable is set, echo it inside an XML

   <http_test><value>MYVALUE</value></http_test>
Benchmarks | Setup
‣ Patched HttPerf
 [for higher file handling]


‣ Virtualized Up-to-date Ubuntu 10.04 LTS, 2CPU, 1.5G Ram
 [tuning of /etc/sysctl.conf and /etc/security/limits.conf]


‣ Libraries:

 •   Misultin 0.7.1 (Erlang R14B02)
 •   Mochiweb 1.5.2 (Erlang R14B02)
 •   Cowboy master 420f5ba (Erlang R14B02)
 •   NodeJS 0.4.7
 •   Tornadoweb 1.2.1 (Python 2.6.5)

‣ All the libraries have been run with the standard settings. Erlang
  was launched with Kernel Polling enabled, and with SMP
  disabled so that a single CPU was used by all the libraries.
Benchmarks | Results
Benchmarks | Results
Benchmarks | Results
Benchmarks | Results
</4>
<5>
Comet | Practical issues
       HTTP Logic



       Http Process




spawn_link/1




         HttpLoop



    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                        1. Building Req: {active, once} | gen_tcp:recv/3
                        2. Spawn HttpLoop, enter socket_loop/3


spawn_link/1




         HttpLoop



    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                         1. Building Req: {active, once} | gen_tcp:recv/3
                         2. Spawn HttpLoop, enter socket_loop/3
               Actual TCP
               sending
spawn_link/1



               Data to be Sent




         HttpLoop



    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                         1. Building Req: {active, once} | gen_tcp:recv/3
                         2. Spawn HttpLoop, enter socket_loop/3
               Actual TCP
               sending           => monitor Socket while in socket_loop?
spawn_link/1



               Data to be Sent




         HttpLoop



    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                         1. Building Req: {active, once} | gen_tcp:recv/3
                         2. Spawn HttpLoop, enter socket_loop/3
               Actual TCP
               sending           => monitor Socket while in socket_loop?
spawn_link/1                     => get data from Socket while in socket_loop?

               Data to be Sent




         HttpLoop



    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                         1. Building Req: {active, once} | gen_tcp:recv/3
                         2. Spawn HttpLoop, enter socket_loop/3
               Actual TCP
               sending           => monitor Socket while in socket_loop?
spawn_link/1                     => get data from Socket while in socket_loop?

               Data to be Sent           CONFLICT:

                                         • Catch Client’s Socket closed event
         HttpLoop                        • Support HTTP pipelining

    Application Logic
Comet | Practical issues
       HTTP Logic



       Http Process
                         1. Building Req: {active, once} | gen_tcp:recv/3
                         2. Spawn HttpLoop, enter socket_loop/3
               Actual TCP
               sending           => monitor Socket while in socket_loop?
spawn_link/1                     => get data from Socket while in socket_loop?

               Data to be Sent           CONFLICT:

                                         • Catch Client’s Socket closed event
         HttpLoop                        • Support HTTP pipelining
                                          SOLUTION:
    Application Logic
                                          handle_http(Req) ->
                                             Req:options([{comet, true}]),
                                             ...
</5>
Thank you
e: roberto@ostinelli.net
t: @ostinelli




   >-|-|(°>

More Related Content

Similar to Misultin 0.7.1 Presentation

Study2study#4 nginx conf_1_24
Study2study#4 nginx conf_1_24Study2study#4 nginx conf_1_24
Study2study#4 nginx conf_1_24Naoya Nakazawa
 
Fluentd and PHP
Fluentd and PHPFluentd and PHP
Fluentd and PHPchobi e
 
Creating Great REST and gRPC API Experiences (in Swift)
Creating Great REST and gRPC API Experiences (in Swift)Creating Great REST and gRPC API Experiences (in Swift)
Creating Great REST and gRPC API Experiences (in Swift)Tim Burks
 
Nginx internals
Nginx internalsNginx internals
Nginx internalsliqiang xu
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Puppet
 
Webinar: Draw a line between HTTP/2 client and HTTP Client
Webinar: Draw a line between HTTP/2 client and HTTP ClientWebinar: Draw a line between HTTP/2 client and HTTP Client
Webinar: Draw a line between HTTP/2 client and HTTP ClientKnoldus Inc.
 
Introduction enovy
Introduction enovyIntroduction enovy
Introduction enovy岩 夏
 
NGINX: HTTP/2 Server Push and gRPC – EMEA
NGINX: HTTP/2 Server Push and gRPC – EMEANGINX: HTTP/2 Server Push and gRPC – EMEA
NGINX: HTTP/2 Server Push and gRPC – EMEANGINX, Inc.
 
OpenShift/Kubernetes to Splunk log integration
OpenShift/Kubernetes to Splunk log integrationOpenShift/Kubernetes to Splunk log integration
OpenShift/Kubernetes to Splunk log integrationMichiel Kalkman
 
Vault Secrets Via API for the REST of Us
Vault Secrets Via API for the REST of UsVault Secrets Via API for the REST of Us
Vault Secrets Via API for the REST of UsMitchell Pronschinske
 
JDO 2019: Service mesh with Istio - Mariusz Gil
JDO 2019: Service mesh with Istio - Mariusz GilJDO 2019: Service mesh with Istio - Mariusz Gil
JDO 2019: Service mesh with Istio - Mariusz GilPROIDEA
 
Managing the logs of your (Rails) applications - Arrrrcamp 2011
Managing the logs of your (Rails) applications - Arrrrcamp 2011Managing the logs of your (Rails) applications - Arrrrcamp 2011
Managing the logs of your (Rails) applications - Arrrrcamp 2011lennartkoopmann
 
Observability tips for HAProxy
Observability tips for HAProxyObservability tips for HAProxy
Observability tips for HAProxyWilly Tarreau
 
Pandora FMS: Sun One webserver
Pandora FMS: Sun One webserverPandora FMS: Sun One webserver
Pandora FMS: Sun One webserverPandora FMS
 
NGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX, Inc.
 
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"Flink Forward
 
Monitoring Flink with Prometheus
Monitoring Flink with PrometheusMonitoring Flink with Prometheus
Monitoring Flink with PrometheusMaximilian Bode
 

Similar to Misultin 0.7.1 Presentation (20)

Study2study#4 nginx conf_1_24
Study2study#4 nginx conf_1_24Study2study#4 nginx conf_1_24
Study2study#4 nginx conf_1_24
 
Fluentd and PHP
Fluentd and PHPFluentd and PHP
Fluentd and PHP
 
Creating Great REST and gRPC API Experiences (in Swift)
Creating Great REST and gRPC API Experiences (in Swift)Creating Great REST and gRPC API Experiences (in Swift)
Creating Great REST and gRPC API Experiences (in Swift)
 
Nginx internals
Nginx internalsNginx internals
Nginx internals
 
Php version 5
Php version 5Php version 5
Php version 5
 
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
Performance Tuning Your Puppet Infrastructure - PuppetConf 2014
 
Webinar: Draw a line between HTTP/2 client and HTTP Client
Webinar: Draw a line between HTTP/2 client and HTTP ClientWebinar: Draw a line between HTTP/2 client and HTTP Client
Webinar: Draw a line between HTTP/2 client and HTTP Client
 
Introduction enovy
Introduction enovyIntroduction enovy
Introduction enovy
 
Running php on nginx
Running php on nginxRunning php on nginx
Running php on nginx
 
NGINX: HTTP/2 Server Push and gRPC – EMEA
NGINX: HTTP/2 Server Push and gRPC – EMEANGINX: HTTP/2 Server Push and gRPC – EMEA
NGINX: HTTP/2 Server Push and gRPC – EMEA
 
OpenShift/Kubernetes to Splunk log integration
OpenShift/Kubernetes to Splunk log integrationOpenShift/Kubernetes to Splunk log integration
OpenShift/Kubernetes to Splunk log integration
 
Vault Secrets Via API for the REST of Us
Vault Secrets Via API for the REST of UsVault Secrets Via API for the REST of Us
Vault Secrets Via API for the REST of Us
 
JDO 2019: Service mesh with Istio - Mariusz Gil
JDO 2019: Service mesh with Istio - Mariusz GilJDO 2019: Service mesh with Istio - Mariusz Gil
JDO 2019: Service mesh with Istio - Mariusz Gil
 
Managing the logs of your (Rails) applications - Arrrrcamp 2011
Managing the logs of your (Rails) applications - Arrrrcamp 2011Managing the logs of your (Rails) applications - Arrrrcamp 2011
Managing the logs of your (Rails) applications - Arrrrcamp 2011
 
Observability tips for HAProxy
Observability tips for HAProxyObservability tips for HAProxy
Observability tips for HAProxy
 
Pandora FMS: Sun One webserver
Pandora FMS: Sun One webserverPandora FMS: Sun One webserver
Pandora FMS: Sun One webserver
 
NGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPCNGINX: HTTP/2 Server Push and gRPC
NGINX: HTTP/2 Server Push and gRPC
 
Http2 kotlin
Http2   kotlinHttp2   kotlin
Http2 kotlin
 
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"
Flink Forward Berlin 2018: Maximilian Bode - "Monitoring Flink with Prometheus"
 
Monitoring Flink with Prometheus
Monitoring Flink with PrometheusMonitoring Flink with Prometheus
Monitoring Flink with Prometheus
 

Recently uploaded

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 

Recently uploaded (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 

Misultin 0.7.1 Presentation

  • 1. Misultin [pron.: Mee-sool-téen] An Erlang library for building fast lightweight HTTP(S) servers >-|-|(°> Erlang User Group London - May 16th, 2011
  • 2. Who am I? Technologist and Entrepreneur. I am particularly interested in Erlang, Python, scalability, research, development and integration of the multiple technologies behind the creation of ubiquitous computing. I’m currently co-founder and CTO of WideTag Inc [widetag.com]. e: roberto@ostinelli.net t: @ostinelli
  • 3. <1>
  • 4. What are Misultins? Misultin are a culinary specialty of the Lake of Como. They are lake fishes that go by the latin name of Alosa fallax lacustris, treated and cooked in a traditional and specific way.
  • 5. What is Misultin? Misultin (pronounced mee-sool-téen) is an Erlang library for building fast lightweight HTTP(S) servers, which also supports websockets. >-|-|(°>
  • 6. Why another lib? When do programmers start a new lib? ‣ Nothing similar exists ‣ Different Approach / Focus ‣ Total Control / Knowledge ‣ Experiment/Hack/Academic
  • 7. Features v0.7.1 ‣ Embedded, not application ‣ ~ HTTP/1.1 ‣ Support for GET, POST, HEAD, PUT, DELETE, TRACE and CONNECT ‣ SSL ‣ Output compression [gzip, deflate] ‣ Chunked / Stream / File sending [attachment, visualization] ‣ Customizable parameters [max_connections, post_max_size, get_url_max_size, ...] ‣ Multiple servers on a single node [custom name / nameless] ‣ Websockets [also on SSL] ‣ Trapping of client closing a browser in Comet applications ‣ With / without Parametrized Modules
  • 9. <2>
  • 10. Code | “Hello World” Simple “Hello World” using parametrized modules.
  • 11. Code | “Hello World” Simple “Hello World” not using parametrized modules.
  • 12. Code | File Sending Simple file sending.
  • 14. Code | Websocket 1. Start Misultin specifying a Websocket loop.
  • 15. Code | Websocket 2. Send the HTML + Js page.
  • 16. Code | Websocket 3. Handle Websocket Data on server.
  • 18. Code | Server Options start_link(Options) -> Result Options = [Option] Option = {ip, list() | tuple()} | {port, integer()} | {name, atom()|false} | {max_connections, integer()} | {post_max_size, integer()} | {get_url_max_size, integer()} | {compress, true|false} | {loop, fun()} | {autoexit, true|false} | {ws_loop, fun()|none} | {ws_autoexit, true|false} | {backlog, integer()} | {acceptors_poolsize, integer()} | {recv_timeout, integer()} | {ssl, SslOptions} SslOptions = [SslOption(§)]
  • 19. </2>
  • 20. <3>
  • 21. Design | Overview proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 Acceptor . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process Http Process Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 22. Design | Crash: Acceptor proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 23. Design | Crash: Acceptor proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 24. Design | Crash: Acceptor proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] 'EXIT' message: . erlang:spawn/1 gen_server respawns . gen_tcp:controlling_process/2 a new acceptor . call to gen_server to: Main gen_server - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 25. Design | Crash: HttpProcess proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 26. Design | Crash: HttpProcess proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count 1. Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 27. Design | Crash: HttpProcess proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count 1. Http Process HTTP Logic erlang:spawn_link/1 2. HttpLoop Application Logic
  • 28. Design | Crash: HttpProcess proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count 3. 'DOWN' message: 1. decrease open connections counter Http Process HTTP Logic erlang:spawn_link/1 2. HttpLoop Application Logic
  • 29. Design | Crash: HttpLoop proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 30. Design | Crash: HttpLoop proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 31. Design | Crash: HttpLoop proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic 'EXIT' message: HttpProcess sends HTTP 500 error erlang:spawn_link/1 message to client HttpLoop Application Logic
  • 32. Design | Crash: gen_server proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 33. Design | Crash: gen_server 1. proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 34. Design | Crash: gen_server 1. 2. proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref - erlang:monitor/2: for gen_server count Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 35. Design | Crash: gen_server 1. 2. proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref terminate(_,_) -> - erlang:monitor/2: for gen_server count exit(HttpPid, kill). 3. Http Process HTTP Logic erlang:spawn_link/1 HttpLoop Application Logic
  • 36. Design | Crash: gen_server 1. 2. proc_lib:spawn_link/3 gen_server Acceptor TCP Acceptor [misultin] . erlang:spawn/1 . gen_tcp:controlling_process/2 Main gen_server . call to gen_server to: - http_pid_ref_add/2: add new pid to ref terminate(_,_) -> - erlang:monitor/2: for gen_server count exit(HttpPid, kill). 3. Http Process HTTP Logic erlang:spawn_link/1 4. HttpLoop Application Logic
  • 37. </3>
  • 38. <4>
  • 39. Benchmarks | Foreword ‣ No such thing as generic benchmarks: specific case [fast application times, loads of connections, small data] ‣ ‘Fast’ is only 1 of the ‘n’ features you want [stability, features, ease of maintenance, low standard deviation, code usability, ...] ‣ This is no ‘pissing’ contest. *Not* what I wanted to see:
  • 40. Benchmarks | Test ‣ Not only Erlang ‣ Chosen libraries are all lightweight & dynamic [compare apple with apples: no Yaws, no Nginx] ‣ Periodically close down the TCP connection ‣ All tests run on a single CPU ‣ No RAM/CPU considerations
  • 41. Benchmarks | Test ‣ ‘Dynamic’ tests: no “Hello world” The test basically asks servers to: • check if a GET variable is set • if the variable is not set, reply with an XML stating the error: <http_test><error>no value specified</error></http_test> • if the variable is set, echo it inside an XML <http_test><value>MYVALUE</value></http_test>
  • 42. Benchmarks | Setup ‣ Patched HttPerf [for higher file handling] ‣ Virtualized Up-to-date Ubuntu 10.04 LTS, 2CPU, 1.5G Ram [tuning of /etc/sysctl.conf and /etc/security/limits.conf] ‣ Libraries: • Misultin 0.7.1 (Erlang R14B02) • Mochiweb 1.5.2 (Erlang R14B02) • Cowboy master 420f5ba (Erlang R14B02) • NodeJS 0.4.7 • Tornadoweb 1.2.1 (Python 2.6.5) ‣ All the libraries have been run with the standard settings. Erlang was launched with Kernel Polling enabled, and with SMP disabled so that a single CPU was used by all the libraries.
  • 47. </4>
  • 48. <5>
  • 49. Comet | Practical issues HTTP Logic Http Process spawn_link/1 HttpLoop Application Logic
  • 50. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 spawn_link/1 HttpLoop Application Logic
  • 51. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 Actual TCP sending spawn_link/1 Data to be Sent HttpLoop Application Logic
  • 52. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 Actual TCP sending => monitor Socket while in socket_loop? spawn_link/1 Data to be Sent HttpLoop Application Logic
  • 53. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 Actual TCP sending => monitor Socket while in socket_loop? spawn_link/1 => get data from Socket while in socket_loop? Data to be Sent HttpLoop Application Logic
  • 54. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 Actual TCP sending => monitor Socket while in socket_loop? spawn_link/1 => get data from Socket while in socket_loop? Data to be Sent CONFLICT: • Catch Client’s Socket closed event HttpLoop • Support HTTP pipelining Application Logic
  • 55. Comet | Practical issues HTTP Logic Http Process 1. Building Req: {active, once} | gen_tcp:recv/3 2. Spawn HttpLoop, enter socket_loop/3 Actual TCP sending => monitor Socket while in socket_loop? spawn_link/1 => get data from Socket while in socket_loop? Data to be Sent CONFLICT: • Catch Client’s Socket closed event HttpLoop • Support HTTP pipelining SOLUTION: Application Logic handle_http(Req) -> Req:options([{comet, true}]), ...
  • 56. </5>
  • 57.

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. Http Process survives to handle persistent connections\n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n