Upgrade to Pro — share decks privately, control downloads, hide ads and more …

jRuby and Ratpack

F85cfa2c6c69d94bc48ece99b7b2cb59?s=47 Max Mulatz
January 05, 2017

jRuby and Ratpack

Slides for my talk about jRuby and Ratpack.io at the vienna.rb Ruby Usergroup.

F85cfa2c6c69d94bc48ece99b7b2cb59?s=128

Max Mulatz

January 05, 2017
Tweet

More Decks by Max Mulatz

Other Decks in Programming

Transcript

  1. Let the others do the heavy lifting

  2. Let the others do the heavy lifting - boost your

    Ruby app with Java -
  3. max

  4. max ! klappradla " klappradla # klappradla.me

  5. None
  6. None
  7. None
  8. limits

  9. GIL

  10. blocking IO

  11. None
  12. non-blocking IO

  13. None
  14. None
  15. None
  16. “…gain the performance and concurrency benefits of Java without writing

    any Java code or XML” -joe kutner-
  17. # ratpack.io

  18. “Ratpack is a set of Java libraries for building modern

    HTTP applications”
  19. “It is built on Java 8, Netty and reactive principles"

    # netty.io
  20. “It provides just enough for writing practical, high performance, apps.”

  21. code

  22. 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
  23. # Gemfile gem 'jbundler' # Jarfile jar 'io.ratpack:ratpack-core', '1.4.0' jar

    'org.slf4j:slf4j-simple', '1.7.20'
  24. $ bundle install

  25. $ jbundle install

  26. 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
  27. # 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
  28. blocking IO

  29. 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
  30. # server RatpackServer.start do |server| server.handlers do |chain| chain.get('music', Handler::Music)

    end end # github.com/klappradla/jruby_ratpack_examples/db_example
  31. 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
  32. non-blocking HTTP

  33. 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
  34. 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
  35. 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
  36. None
  37. # github.com/klappradla/jruby_ratpack_examples/sinatra

  38. # 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
  39. # 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
  40. # 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