Slide 1

Slide 1 text

MicroServices Friday, September 6, 13

Slide 2

Slide 2 text

0 500 1000 1500 2000 req/sec 1752 177 Service Microservice Friday, September 6, 13

Slide 3

Slide 3 text

i0rek Friday, September 6, 13

Slide 4

Slide 4 text

Disclaimer • Benchmarking is hard • Questions at the end Friday, September 6, 13

Slide 5

Slide 5 text

Fred George Friday, September 6, 13

Slide 6

Slide 6 text

Wunderpay Friday, September 6, 13

Slide 7

Slide 7 text

Wunderpay • Create Subscriptions Friday, September 6, 13

Slide 8

Slide 8 text

Wunderpay • Create Subscriptions • Get subscription for a user Friday, September 6, 13

Slide 9

Slide 9 text

Wunderpay • Create Subscriptions • Get subscription for a user Friday, September 6, 13

Slide 10

Slide 10 text

Rails 1 # app/controllers/s_controller.rb 2 class SController < ApplicationController 3 def show 4 if subscription = current_user.subscription 5 render json: subscription.as_json 6 else 7 render json: {} 8 end 9 end 10 end Friday, September 6, 13

Slide 11

Slide 11 text

AB Rails $ ab -n 1000 http://127.0.0.1/user/123A Requests per second: 177.88 [#/sec] Time per request: 5.622 [ms] Friday, September 6, 13

Slide 12

Slide 12 text

Rails - Y U SLOW?? 1 # app/controllers/s_controller.rb 2 class SController < ApplicationController 3 def show 4 if subscription = current_user.subscription 5 render json: subscription.as_json 6 else 7 render json: {} 8 end 9 end 10 end Friday, September 6, 13

Slide 13

Slide 13 text

Rails - Y U SLOW?? • Assumption: DB is the limiting factor Friday, September 6, 13

Slide 14

Slide 14 text

Rack Part 1 1 require 'sequel' 2 class Database 3 def self.connection 4 @connection ||= Sequel.connect( 5 'mysql: 6 //root@localhost/wunderpay_development' 7 ) 8 end 9 end 10 class Subscription 11 def self.exists_for(user_id) 12 Database.connection[ 13 "SELECT 1 14 FROM Subscriptions 15 WHERE user_id = '#{user_id}' 16 LIMIT 1" 17 ].count > 0 18 end 19 end Friday, September 6, 13

Slide 15

Slide 15 text

Rack Part 2 1 class MyApp 2 def call(env) 3 if env['REQUEST_PATH'] =~ /user\/(\w*)/ 4 unless Subscription.exists_for($1) 5 [200, {}, ["{}\n"]] 6 else 7 [ 301, 8 {"Location" => "http://wunderpay.de"}, 9 ["\n"] 10 ] 11 end 12 end 13 end 14 end Friday, September 6, 13

Slide 16

Slide 16 text

AB Rack $ ab -n 1000 http://127.0.0.1/user/123A Requests per second: 856.72 [#/sec] Time per request: 1.167 [ms] Friday, September 6, 13

Slide 17

Slide 17 text

Rack Y U SO FAST?? • Assumption was WRONG • 5times faster than Rails Friday, September 6, 13

Slide 18

Slide 18 text

Rack MicroService 1 class MyApp 2 def call(env) 3 if env['REQUEST_PATH'] =~ /user\/(\w*)/ 4 unless Subscription.exists_for($1) 5 [200, {}, ["{}\n"]] 6 else 7 [ 301, 8 {"Location" => "http://wunderpay.de"}, 9 ["\n"] 10 ] 11 end 12 end 13 end 14 end Friday, September 6, 13

Slide 19

Slide 19 text

Rack MicroService • Transparent • Throw away • Simple.Simple.Simple Friday, September 6, 13

Slide 20

Slide 20 text

Rack MicroService Friday, September 6, 13

Slide 21

Slide 21 text

How fast can we get? Friday, September 6, 13

Slide 22

Slide 22 text

Nginx & Lua Friday, September 6, 13

Slide 23

Slide 23 text

Nginx & Lua Part 1 1 worker_processes 1; 2 error_log logs/error.log; 3 events { 4 worker_connections 1024; 5 } 6 http { 7 server { 8 listen 8080; 9 location ~ /user/(\w*) { 10 set $user_id $1; 11 content_by_lua ''; 12 } 13 } 14 } Friday, September 6, 13

Slide 24

Slide 24 text

Nginx & Lua Part 2 1 local mysql = require "resty.mysql" 2 local db, err = mysql:new() 3 db:set_timeout(1000) 4 5 local ok, err, errno, sqlstate = db:connect{ 6 host = "127.0.0.1", 7 port = 3306, 8 database = "wunderpay_development", 9 user = "root" 10 } 11 12 res, err, errno, sqlstate = db:query( 13 "SELECT 1 " .. 14 "FROM subscriptions " .. 15 "WHERE user_id = \'"..ngx.var.user_id.. 16 "\'" 17 ) 18 if next(res) == nil then 19 ngx.say("{}") 20 else 21 ngx.redirect("http://wunderpay.de") 22 end Friday, September 6, 13

Slide 25

Slide 25 text

AB Nginx & Lua $ ab -n 1000 http://127.0.0.1/user/123A Requests per second: 1752.04 [#/sec] Time per request: 0.571 [ms] Friday, September 6, 13

Slide 26

Slide 26 text

Resources Friday, September 6, 13

Slide 27

Slide 27 text

Resources 1.Rails 2.Rack 3.Nginx & Lua Friday, September 6, 13

Slide 28

Slide 28 text

Q & A Friday, September 6, 13