lets build-ruby-app-server: vineet tyagi

40
Let’s build a Ruby Application Server Team WebROaR [email protected]

Upload: thoughtworks

Post on 12-May-2015

2.570 views

Category:

Technology


2 download

DESCRIPTION

Would you like to know how to build an application server from scratch? This talk would provide an insight to the thought process and the key decisions made while building WebROaR from grounds up using C & Ruby. What enables this server to deliver high performance and also offer a rich bouquet of integrated features like Analytics, Exception Notifications etc? If gaining knowledge about design of a good software product interests you, do join us for this interactive session.

TRANSCRIPT

Page 1: Lets build-ruby-app-server: Vineet tyagi

Let’s build a

Ruby Application Server

Team WebROaR

[email protected]

Page 2: Lets build-ruby-app-server: Vineet tyagi

How do ‘you’ visualize an ‘Application Server’?

Page 3: Lets build-ruby-app-server: Vineet tyagi
Page 4: Lets build-ruby-app-server: Vineet tyagi

Or it could be like this …

Page 5: Lets build-ruby-app-server: Vineet tyagi
Page 6: Lets build-ruby-app-server: Vineet tyagi

Let’s define the specs

Page 7: Lets build-ruby-app-server: Vineet tyagi

Run all Ruby Web Applications

Rack Compliant

Page 8: Lets build-ruby-app-server: Vineet tyagi

And also ..

Provide run time performance numbers of

the deployed applications

Report exceptions

Page 9: Lets build-ruby-app-server: Vineet tyagi

Love to have …

Maximum performance

Simplicity

Page 10: Lets build-ruby-app-server: Vineet tyagi

Let’s start building it …

Page 11: Lets build-ruby-app-server: Vineet tyagi
Page 12: Lets build-ruby-app-server: Vineet tyagi

What does the server need to do?

Accept client connection

Parse HTTP request

Hand it over to the ruby web framework

Send its response back to the client

Page 13: Lets build-ruby-app-server: Vineet tyagi

Network Server Design

Evented vs Threaded

Page 14: Lets build-ruby-app-server: Vineet tyagi

Event Based I/O Libraries

libev (Written in C)

EventMachine (Ruby Module + Extension

Library written in C++)

Page 15: Lets build-ruby-app-server: Vineet tyagi

HTTP Parser

Mongrel’s Ragel Based Parser (written in C)

is ‘awesome’

Page 16: Lets build-ruby-app-server: Vineet tyagi

Accept client connection

Parse HTTP request

Hand it over to the ruby web

framework

Send its response back to the

client

libev/EventMachine

Mongrel’s Ragel based Parser

?

libev/EventMachine

OptionsServer Tasks

Page 17: Lets build-ruby-app-server: Vineet tyagi

More awesomeness - Libebb

Lightweight HTTP Library for C

libev + Mongrel’s Ragel based Parser

Implements HTTP/1.1 Grammar

Supports persistent, pipelined & chunked requests

Rejects invalid and malicious requests

Page 18: Lets build-ruby-app-server: Vineet tyagi

Accept client connection

Parse HTTP request

Hand it over to the ruby web

framework

Send its response back to the

client

libebb

libebb

?

libebb

OptionsServer Tasks

Page 19: Lets build-ruby-app-server: Vineet tyagi

Embedded Ruby Interpreter

#include <ruby.h>

int main(int argc, char **argv) {int state = 0;

ruby_init();

ruby_script("c-executable-name");

ruby_init_loadpath();

//Can use rb_gv_set() or rb_iv_set() methods to pass parameters to ruby land

rb_protect(RUBY_METHOD_FUNC(rb_require), (VALUE)"path-to-ruby-script", &state);

if(state != 0) {

// Exception Handling Code

return -1;

}

//Can use rub_funcall() to invoke methods in the ruby land

return 0;

}

Page 20: Lets build-ruby-app-server: Vineet tyagi

Accept client connection

Parse HTTP request

Hand it over to the ruby web

framework

Send its response back to the

client

libebb

libebb

Embedded Ruby Interpreter

libebb

OptionsServer Tasks

Page 21: Lets build-ruby-app-server: Vineet tyagi

Hola, we got a basic application server ready!

Page 22: Lets build-ruby-app-server: Vineet tyagi
Page 23: Lets build-ruby-app-server: Vineet tyagi

The Server – First Cut

libebb

Ruby Interpreter

Rack Web Application

Response

HTTP Request

Page 24: Lets build-ruby-app-server: Vineet tyagi

But it only processes one request at a time ..

Page 25: Lets build-ruby-app-server: Vineet tyagi

Let’s split up the server code and create more

ruby processing instances & static file

renderers (‘workers’)

Page 26: Lets build-ruby-app-server: Vineet tyagi

The more powerful server version …

Response

HTTP Request

libebb libev

Head

Ruby Interpreter

Rack Web Applicationlibev

Worker #1

Ruby Interpreter

Rack Web Applicationlibev

Worker #2

Static Files Rendererlibev

Worker #n

Asynchronous Non-blocking I/O

SCGI

Page 27: Lets build-ruby-app-server: Vineet tyagi
Page 28: Lets build-ruby-app-server: Vineet tyagi

Server can handle (very) high load with this

architecture

Page 29: Lets build-ruby-app-server: Vineet tyagi
Page 30: Lets build-ruby-app-server: Vineet tyagi

Let’s capture data for each request being

processed …

Page 31: Lets build-ruby-app-server: Vineet tyagi

The Server – Current Architecture

Response

HTTP Request

Head

Worker #n

Worker #1

DB

Message Queue

Request Analytics Data &

Exception Notifications

Analyzer DaemonAdmin Panel

Conf File

Page 32: Lets build-ruby-app-server: Vineet tyagi

Hurray, we can write all the new advanced

features in our favorite language ..

Page 33: Lets build-ruby-app-server: Vineet tyagi

Ruby makes life easier for …

Instrumentation

Messaging

Analyzer

Interacting with the Database

Admin Panel (It’s a Rails Application!)

Page 34: Lets build-ruby-app-server: Vineet tyagi
Page 35: Lets build-ruby-app-server: Vineet tyagi
Page 36: Lets build-ruby-app-server: Vineet tyagi

Takeaways

Use the best tool for the job

C – Network I/O, Ruby – Advanced Features

Do not reinvent the wheel. Use tried and

tested libraries

Page 37: Lets build-ruby-app-server: Vineet tyagi

Check it out

WebROaR – http://webroar.in

Page 38: Lets build-ruby-app-server: Vineet tyagi
Page 39: Lets build-ruby-app-server: Vineet tyagi

Photo Credits

All photographs used in this presentation are licensed under Creative Commons

Slide 3 – Stone House By Jsome1

Slide 5, 34 – Our House By Lee Coursey

Slide 11 – Willow Lane Construction By Lee Coursey

Slide 22 – Construction of our House – Framing By Lee Coursey

Slide 27 – Dead Lift By scarndp

Slide 29 – Willow Lane Construction By Lee Coursey

Slide 35 – Very Happy By Chris Winters

Slide 38 – Lion By auburnxc

Page 40: Lets build-ruby-app-server: Vineet tyagi

More Questions?