Slide 1

Slide 1 text

Let the others do the heavy lifting

Slide 2

Slide 2 text

Let the others do the heavy lifting - boost your Ruby app with Java -

Slide 3

Slide 3 text

max

Slide 4

Slide 4 text

max ! klappradla " klappradla # klappradla.me

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

limits

Slide 9

Slide 9 text

GIL

Slide 10

Slide 10 text

blocking IO

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

non-blocking IO

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

“…gain the performance and concurrency benefits of Java without writing any Java code or XML” -joe kutner-

Slide 17

Slide 17 text

# ratpack.io

Slide 18

Slide 18 text

“Ratpack is a set of Java libraries for building modern HTTP applications”

Slide 19

Slide 19 text

“It is built on Java 8, Netty and reactive principles" # netty.io

Slide 20

Slide 20 text

“It provides just enough for writing practical, high performance, apps.”

Slide 21

Slide 21 text

code

Slide 22

Slide 22 text

public class Main { public static void main(String... args) throws Exception { RatpackServer.start(server -> server .handlers(chain -> chain .get(ctx -> ctx.render("Hello World")) ) ); } } # https:/ /ratpack.io/manual/current/launching.html#launching

Slide 23

Slide 23 text

# Gemfile gem 'jbundler' # Jarfile jar 'io.ratpack:ratpack-core', '1.4.0' jar 'org.slf4j:slf4j-simple', '1.7.20'

Slide 24

Slide 24 text

$ bundle install

Slide 25

Slide 25 text

$ jbundle install

Slide 26

Slide 26 text

require 'java' require 'jruby/core_ext' require 'bundler/setup' Bundler.require java_import 'ratpack.server.RatpackServer' RatpackServer.start do |server| server.handlers do |chain| chain.get do |ctx| ctx.render 'Hello World from Ratpack / jRuby' end end end # github.com/klappradla/jruby_ratpack_examples/hello_world

Slide 27

Slide 27 text

# server.rb RatpackServer.start do |server| server.handlers do |chain| chain.get do |ctx| ctx.render 'Hello World from Ratpack / jRuby' end chain.all(Handler::Default) end end # handler/default.rb module Handler class Default def self.handle(ctx) ctx.render 'Nothing here, sorry ¯\_(ツ)_/¯' end end end # https:/ /ratpack.io/manual/current/api/ratpack/handling/Handler.html

Slide 28

Slide 28 text

blocking IO

Slide 29

Slide 29 text

java_import 'ratpack.server.RatpackServer' java_import 'ratpack.exec.Blocking' require 'json' RatpackServer.start do |server| server.handlers do |chain| chain.get('music') do |ctx| Blocking.get do DB[:albums].all end.then do |albums| ctx.render(JSON.dump(albums)) end end end end # https:/ /ratpack.io/manual/current/async.html#performing_blocking_operations_eg_io

Slide 30

Slide 30 text

# server RatpackServer.start do |server| server.handlers do |chain| chain.get('music', Handler::Music) end end # github.com/klappradla/jruby_ratpack_examples/db_example

Slide 31

Slide 31 text

module Handler class Music class << self def handle(ctx) get_data.then do |data| render(ctx, data) end end private def get_data Blocking.get { DB[:albums].all } end def render(ctx, data) ctx.render(Jackson.json(data)) end end end end # github.com/klappradla/jruby_ratpack_examples/db_example

Slide 32

Slide 32 text

non-blocking HTTP

Slide 33

Slide 33 text

class Server def self.run RatpackServer.start do |server| server.handlers do |chain| chain.all(RequestLogger.ncsa) chain.get('music', Handler::Music) chain.get('planets', Handler::Planets) chain.all(Handler::NotFound) end end end end # github.com/klappradla/jruby_ratpack_examples/http_example

Slide 34

Slide 34 text

module Handler class Base def self.handle(args) new(*args).handle end def initialize(ctx) @ctx = ctx end def handle raise NotImplementedError end private attr_reader :ctx def response @response ||= ctx.get_response end end end # github.com/klappradla/jruby_ratpack_examples/http_example

Slide 35

Slide 35 text

module Handler class Planets < Base URL = java.net.URI.new('http://swapi.co/api/planets') def handle call_api.then do |resp| render(resp) end end private def call_api client.get(URL) end def client ctx.get(HttpClient.java_class) end def render(resp) response.send(‘application/json;charset=UTF-8', resp.get_body.get_text) end end end # github.com/klappradla/jruby_ratpack_examples/http_example

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

# github.com/klappradla/jruby_ratpack_examples/sinatra

Slide 38

Slide 38 text

# sinatra Running 1m test @ http://localhost:5050 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 302.15ms 417.23ms 1.99s 84.58% Req/Sec 122.99 63.97 380.00 66.50% 29176 requests in 1.00m, 83.26MB read Socket errors: connect 0, read 0, write 0, timeout 552 Non-2xx or 3xx responses: 9735 Requests/sec: 485.58 Transfer/sec: 1.39MB # ratpack Running 1m test @ http://localhost:5050 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 183.24ms 255.69ms 1.97s 86.30% Req/Sec 328.76 141.23 830.00 68.23% 78379 requests in 1.00m, 200.23MB read Socket errors: connect 0, read 0, write 0, timeout 13 Non-2xx or 3xx responses: 26268 Requests/sec: 1305.99 Transfer/sec: 3.34MB # github.com/klappradla/jruby_ratpack_examples/benchmarks

Slide 39

Slide 39 text

# github.com/klappradla/jruby_ratpack_examples/benchmarks # sinatra Running 1m test @ http://localhost:5050 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 302.15ms 417.23ms 1.99s 84.58% Req/Sec 122.99 63.97 380.00 66.50% 29176 requests in 1.00m, 83.26MB read Socket errors: connect 0, read 0, write 0, timeout 552 Non-2xx or 3xx responses: 9735 Requests/sec: 485.58 Transfer/sec: 1.39MB # ratpack Running 1m test @ http://localhost:5050 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 183.24ms 255.69ms 1.97s 86.30% Req/Sec 328.76 141.23 830.00 68.23% 78379 requests in 1.00m, 200.23MB read Socket errors: connect 0, read 0, write 0, timeout 13 Non-2xx or 3xx responses: 26268 Requests/sec: 1305.99 Transfer/sec: 3.34MB

Slide 40

Slide 40 text

# github.com/jruby/jruby/wiki/AboutJRuby # github.com/klappradla/jruby_ratpack_examples # blog.heroku.com/reactive_ruby_building_real_time_apps_with_jruby_and_ratpack