SlideShare a Scribd company logo
ASYNCHRONOUS AND 

NON-BLOCKING I/O
WITH JRUBY
Joe Kutner
Joe Kutner
@codefinger
"Deploying with JRuby 9k"
"The Healthy Programmer"
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER DATABASE
BLOCKING

WAIT
BLOCKING IS BAD
▸ Each thread consumes resources
▸ Memory, Stack frames
▸ OS context switching
▸ GC has to walk the stack frames
▸ More $$$
ASYCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER DATABASE
ASYNC

WAIT
MULTIPLE CLIENTS
CLIENT CLIENT SERVERCLIENT
MULTIPLE BACKING SERVICES
CLIENT SERVER DATABASE REDIS
TEXT
ASYNC IS GOOD
▸ Each request uses fewer resources
▸ Fewer threads
▸ Fewer servers
▸ Less $$$
TEXT
WHO'S DOING ASYNC
▸ Apple
▸ Google
▸ Twitter
▸ Facebook
▸ eBay
Async and Non-blocking IO w/ JRuby
NETTY @ APPLE
https://speakerdeck.com/normanmaurer/connectivity
Async and Non-blocking IO w/ JRuby
Ratpack
Netty
Sinatra
Rack
~=
Synchronous and Blocking (Sinatra)
REQUEST
REQUEST
REQUEST
REQUEST
REQUEST
EVENT 

LOOP
REQUEST
REQUEST
REQUEST
Asynchronous and Non-blocking (Ratpack)
Events
Event
result
Event

Loop
Event
handler
Event
emitters
PROMISES
promise = Blocking.get do
# execution segment
end

promise.then do |result|
# execution segment
end
PROMISES
promise = Blocking.get do
# execution segment
end
promise.then do |result|
# execution segment
end
EVENT

LOOP
EBAY SEARCH
A SYNTHETIC DEMO
EBAY
Search term(s)
CLIENT
SERVER
(RATPACK)
Async and Non-blocking IO w/ JRuby
SYNCHRONOUS EXAMPLE
results = terms.map do |item|
url = rest_url(item)
response = Net ::HTTP.get(url)
JSON.parse(response)["Item"]
end.flatten
render(results)
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER EBAY
BLOCKING

WAIT
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
Promise
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER EBAY
ASYNCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER EBAY
ASYNC, SERIAL
Events Event
handler
Event
emitters
EVENT 

LOOP
ASYNC, PARALLEL
EVENT 

LOOPEVENT 

LOOP
Events
Event
handler
Event
emitters
EVENT 

LOOPS
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
Promise
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
ASYNCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER EBAY
ASYNCHRONOUS WAIT (NON-BLOCKING) AND PARALLEL
CLIENT SERVER EBAY
Async and Non-blocking IO w/ JRuby
HOW TO ASSEMBLE A JRUBY + RATPACK APP
Async and Non-blocking IO w/ JRuby
Gemfile
source 'https: //rubygems.org'
ruby '2.3.3', engine: 'jruby', engine_version: '9.1.12.0'
gem 'jbundler'
Jarfile
jar 'io.ratpack:ratpack-core', '1.4.6'
jar 'org.slf4j:slf4j-simple', '1.7.25'
INSTALL DEPENDENCIES
$ bundle install
$ jbundle install

...



jbundler runtime classpath:

------------------------

.../ratpack-core-1.4.6.jar

.../netty-common-4.1.6.Final.jar

...



jbundle complete !
lib/server.rb
require 'java'
require 'bundler/setup'
Bundler.require
java_import 'ratpack.server.RatpackServer'
RatpackServer.start do |b|
b.handlers do |chain|
chain.get("async") do |ctx|
# async request handling
end
chain.get("sync") do |ctx|
# sync request handling
end
end
end
RUN THE APP
$ bundle exec ruby lib/server.rb

[main] INFO ratpack.server.RatpackServer - Starting server ...

[main] INFO ratpack.server.RatpackServer - Building registry ...

[main] INFO ratpack.server.RatpackServer - Ratpack started ...
FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-async-demo
BOOKS EXAMPLE
A REAL-WORLD DEMO
BOOKSTORE OR LIBRARY MANAGEMENT APP
DB
HTTP
Local Inventory
isbndb.com
BOOK
Ruby object
RATPACK INTEGRATES WITH JAVA LIBRARIES
▸ RxJava
▸ compose & transform asynchronous operations

▸ Hystrix
▸ fault tolerance
▸ caching
▸ de-duping
▸ batching
Promise Observable~=
MAP(F)
TIMEOUT( )
ZIP
Jarfile
jar 'io.ratpack:ratpack-core', '1.4.6'
jar 'io.ratpack:ratpack-rx', '1.4.6'
jar 'io.ratpack:ratpack-hystrix', '1.4.6'
jar 'org.slf4j:slf4j-simple', '1.7.25'
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
Observable Subscription
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
OBSERVABLES
▸ all: 

Observable that will emit items
▸ flat_map: 

Applies a function to each item, and returns an Observable
that emits items
▸ to_list: 

Returns an Observable that emits an Array of items
▸ subscribe: 

Returns a Subscription to the Observable
operation
OBSERVABLE
operation
OBSERVABLE
subsribe
OBSERVABLE
SUBSCRIPTION
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-books-example
IN RUBY…
WAYS TO DO ASYNC
▸ Netty (via Ratpack)
▸ Servlet 3.1 Async (via Warbler)
▸ Vert.x
▸ EventMachine
TEXT
EVENTMACHINE
▸ Difficult to avoid callback hell
▸ Not integrated into your web framework
TEXT
WHY NOT ASYC?
▸ Bottleneck is often the DB
▸ Async is hard
▸ Non-deterministic
▸ Callback hell
▸ Error handling/propagation
LINKS
▸ http://jruby.org
▸ https://ratpack.io
▸ https://netty.io
▸ http://reactivex.io
▸ https://github.com/jkutner/jruby-ratpack-async-demo
▸ https://github.com/jkutner/jruby-ratpack-books-example
JOE KUTNER

@codefinger
THANKS!

More Related Content

What's hot (20)

Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
Claus Ibsen
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
NAVER D2
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
Open Source Consulting
 
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Shirshanka Das
 
Apache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whaleApache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whale
Henryk Konsek
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lisp
fukamachi
 
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
confluent
 
ApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration libraryApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration library
Claus Ibsen
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
zeeg
 
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Mitsunori Komatsu
 
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Marcus Barczak
 
How to improve ELK log pipeline performance
How to improve ELK log pipeline performanceHow to improve ELK log pipeline performance
How to improve ELK log pipeline performance
Steven Shim
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data stores
Tomas Doran
 
Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
Claus Ibsen
 
Data Processing and Ruby in the World
Data Processing and Ruby in the WorldData Processing and Ruby in the World
Data Processing and Ruby in the World
SATOSHI TAGOMORI
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02
Jinho Shin
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use it
Michael Klishin
 
Scripting Embulk Plugins
Scripting Embulk PluginsScripting Embulk Plugins
Scripting Embulk Plugins
Sadayuki Furuhashi
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parser
fukamachi
 
Docker.io
Docker.ioDocker.io
Docker.io
Ladislav Prskavec
 
Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
Claus Ibsen
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
NAVER D2
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
Open Source Consulting
 
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Shirshanka Das
 
Apache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whaleApache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whale
Henryk Konsek
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lisp
fukamachi
 
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
confluent
 
ApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration libraryApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration library
Claus Ibsen
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
zeeg
 
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Mitsunori Komatsu
 
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Marcus Barczak
 
How to improve ELK log pipeline performance
How to improve ELK log pipeline performanceHow to improve ELK log pipeline performance
How to improve ELK log pipeline performance
Steven Shim
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data stores
Tomas Doran
 
Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
Claus Ibsen
 
Data Processing and Ruby in the World
Data Processing and Ruby in the WorldData Processing and Ruby in the World
Data Processing and Ruby in the World
SATOSHI TAGOMORI
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02
Jinho Shin
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use it
Michael Klishin
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parser
fukamachi
 

Similar to Async and Non-blocking IO w/ JRuby (20)

Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0
Oscar Renalias
 
Ratpack for Real
Ratpack for RealRatpack for Real
Ratpack for Real
TomAkehurst
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
Daniel Woods
 
Real Time Web - What's that for?
Real Time Web - What's that for?Real Time Web - What's that for?
Real Time Web - What's that for?
Martyn Loughran
 
Meteor - not just for rockstars
Meteor - not just for rockstarsMeteor - not just for rockstars
Meteor - not just for rockstars
Stephan Hochhaus
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
Omer Gazit
 
Where is my scalable API?
Where is my scalable API?Where is my scalable API?
Where is my scalable API?
Juan Pablo Genovese
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparison
Hiroshi Nakamura
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Kyle Drake
 
Ratpack the story so far
Ratpack the story so farRatpack the story so far
Ratpack the story so far
Phill Barber
 
2017年のLINEのマイクロサービスを支えるSpring
2017年のLINEのマイクロサービスを支えるSpring2017年のLINEのマイクロサービスを支えるSpring
2017年のLINEのマイクロサービスを支えるSpring
LINE Corporation
 
Concurrency in ruby
Concurrency in rubyConcurrency in ruby
Concurrency in ruby
Marco Borromeo
 
TorqueBox at DC:JBUG - November 2011
TorqueBox at DC:JBUG - November 2011TorqueBox at DC:JBUG - November 2011
TorqueBox at DC:JBUG - November 2011
bobmcwhirter
 
When Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the EnterpriseWhen Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the Enterprise
benbrowning
 
OSGi Asynchronous Services: more than RPC
OSGi Asynchronous Services: more than RPCOSGi Asynchronous Services: more than RPC
OSGi Asynchronous Services: more than RPC
Michael Dürig
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...
Chris Richardson
 
Where is my scalable api?
Where is my scalable api?Where is my scalable api?
Where is my scalable api?
Altoros
 
Socket applications
Socket applicationsSocket applications
Socket applications
João Moura
 
Devignition 2011
Devignition 2011Devignition 2011
Devignition 2011
tobiascrawley
 
Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009
pauldix
 
Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0
Oscar Renalias
 
Ratpack for Real
Ratpack for RealRatpack for Real
Ratpack for Real
TomAkehurst
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
Daniel Woods
 
Real Time Web - What's that for?
Real Time Web - What's that for?Real Time Web - What's that for?
Real Time Web - What's that for?
Martyn Loughran
 
Meteor - not just for rockstars
Meteor - not just for rockstarsMeteor - not just for rockstars
Meteor - not just for rockstars
Stephan Hochhaus
 
Scaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby undergroundScaling Ruby with Evented I/O - Ruby underground
Scaling Ruby with Evented I/O - Ruby underground
Omer Gazit
 
Ruby HTTP clients comparison
Ruby HTTP clients comparisonRuby HTTP clients comparison
Ruby HTTP clients comparison
Hiroshi Nakamura
 
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::SynchronyFast, concurrent ruby web applications with EventMachine and EM::Synchrony
Fast, concurrent ruby web applications with EventMachine and EM::Synchrony
Kyle Drake
 
Ratpack the story so far
Ratpack the story so farRatpack the story so far
Ratpack the story so far
Phill Barber
 
2017年のLINEのマイクロサービスを支えるSpring
2017年のLINEのマイクロサービスを支えるSpring2017年のLINEのマイクロサービスを支えるSpring
2017年のLINEのマイクロサービスを支えるSpring
LINE Corporation
 
TorqueBox at DC:JBUG - November 2011
TorqueBox at DC:JBUG - November 2011TorqueBox at DC:JBUG - November 2011
TorqueBox at DC:JBUG - November 2011
bobmcwhirter
 
When Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the EnterpriseWhen Two Worlds Collide: Java and Ruby in the Enterprise
When Two Worlds Collide: Java and Ruby in the Enterprise
benbrowning
 
OSGi Asynchronous Services: more than RPC
OSGi Asynchronous Services: more than RPCOSGi Asynchronous Services: more than RPC
OSGi Asynchronous Services: more than RPC
Michael Dürig
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...
Chris Richardson
 
Where is my scalable api?
Where is my scalable api?Where is my scalable api?
Where is my scalable api?
Altoros
 
Socket applications
Socket applicationsSocket applications
Socket applications
João Moura
 
Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009
pauldix
 
Ad

More from Joe Kutner (20)

Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find ThemFantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find Them
Joe Kutner
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star Party
Joe Kutner
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make
Joe Kutner
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps Expo
Joe Kutner
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space Apps
Joe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipster
Joe Kutner
 
What the Struts?
What the Struts?What the Struts?
What the Struts?
Joe Kutner
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copyMeasuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copy
Joe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
Joe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
Joe Kutner
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jruby
Joe Kutner
 
Java 20
Java 20Java 20
Java 20
Joe Kutner
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor Scala
Joe Kutner
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with Jitescript
Joe Kutner
 
jdays 2015
jdays 2015jdays 2015
jdays 2015
Joe Kutner
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
Joe Kutner
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment
Joe Kutner
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on HerokuCreating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on Heroku
Joe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy Programmer
Joe Kutner
 
Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find ThemFantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find Them
Joe Kutner
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star Party
Joe Kutner
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make
Joe Kutner
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps Expo
Joe Kutner
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space Apps
Joe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipster
Joe Kutner
 
What the Struts?
What the Struts?What the Struts?
What the Struts?
Joe Kutner
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copyMeasuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copy
Joe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
Joe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
Joe Kutner
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jruby
Joe Kutner
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor Scala
Joe Kutner
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with Jitescript
Joe Kutner
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
Joe Kutner
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment
Joe Kutner
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on HerokuCreating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on Heroku
Joe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy Programmer
Joe Kutner
 
Ad

Recently uploaded (20)

Maxx nft market place new generation nft marketing place
Maxx nft market place new generation nft marketing placeMaxx nft market place new generation nft marketing place
Maxx nft market place new generation nft marketing place
usersalmanrazdelhi
 
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 ADr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr. Jimmy Schwarzkopf
 
Gihbli AI and Geo sitution |use/misuse of Ai Technology
Gihbli AI and Geo sitution |use/misuse of Ai TechnologyGihbli AI and Geo sitution |use/misuse of Ai Technology
Gihbli AI and Geo sitution |use/misuse of Ai Technology
zainkhurram1111
 
Grannie’s Journey to Using Healthcare AI Experiences
Grannie’s Journey to Using Healthcare AI ExperiencesGrannie’s Journey to Using Healthcare AI Experiences
Grannie’s Journey to Using Healthcare AI Experiences
Lauren Parr
 
New Ways to Reduce Database Costs with ScyllaDB
New Ways to Reduce Database Costs with ScyllaDBNew Ways to Reduce Database Costs with ScyllaDB
New Ways to Reduce Database Costs with ScyllaDB
ScyllaDB
 
Agentic AI - The New Era of Intelligence
Agentic AI - The New Era of IntelligenceAgentic AI - The New Era of Intelligence
Agentic AI - The New Era of Intelligence
Muzammil Shah
 
AI Emotional Actors: “When Machines Learn to Feel and Perform"
AI Emotional Actors:  “When Machines Learn to Feel and Perform"AI Emotional Actors:  “When Machines Learn to Feel and Perform"
AI Emotional Actors: “When Machines Learn to Feel and Perform"
AkashKumar809858
 
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Peter Bittner
 
AI Trends - Mary Meeker
AI Trends - Mary MeekerAI Trends - Mary Meeker
AI Trends - Mary Meeker
Razin Mustafiz
 
Evaluation Challenges in Using Generative AI for Science & Technical Content
Evaluation Challenges in Using Generative AI for Science & Technical ContentEvaluation Challenges in Using Generative AI for Science & Technical Content
Evaluation Challenges in Using Generative AI for Science & Technical Content
Paul Groth
 
European Accessibility Act & Integrated Accessibility Testing
European Accessibility Act & Integrated Accessibility TestingEuropean Accessibility Act & Integrated Accessibility Testing
European Accessibility Act & Integrated Accessibility Testing
Julia Undeutsch
 
LSNIF: Locally-Subdivided Neural Intersection Function
LSNIF: Locally-Subdivided Neural Intersection FunctionLSNIF: Locally-Subdivided Neural Intersection Function
LSNIF: Locally-Subdivided Neural Intersection Function
Takahiro Harada
 
UiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPath Community Berlin: Studio Tips & Tricks and UiPath InsightsUiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPathCommunity
 
Contributing to WordPress With & Without Code.pptx
Contributing to WordPress With & Without Code.pptxContributing to WordPress With & Without Code.pptx
Contributing to WordPress With & Without Code.pptx
Patrick Lumumba
 
6th Power Grid Model Meetup - 21 May 2025
6th Power Grid Model Meetup - 21 May 20256th Power Grid Model Meetup - 21 May 2025
6th Power Grid Model Meetup - 21 May 2025
DanBrown980551
 
Introducing the OSA 3200 SP and OSA 3250 ePRC
Introducing the OSA 3200 SP and OSA 3250 ePRCIntroducing the OSA 3200 SP and OSA 3250 ePRC
Introducing the OSA 3200 SP and OSA 3250 ePRC
Adtran
 
Microsoft Build 2025 takeaways in one presentation
Microsoft Build 2025 takeaways in one presentationMicrosoft Build 2025 takeaways in one presentation
Microsoft Build 2025 takeaways in one presentation
Digitalmara
 
Droidal: AI Agents Revolutionizing Healthcare
Droidal: AI Agents Revolutionizing HealthcareDroidal: AI Agents Revolutionizing Healthcare
Droidal: AI Agents Revolutionizing Healthcare
Droidal LLC
 
Introducing FME Realize: A New Era of Spatial Computing and AR
Introducing FME Realize: A New Era of Spatial Computing and ARIntroducing FME Realize: A New Era of Spatial Computing and AR
Introducing FME Realize: A New Era of Spatial Computing and AR
Safe Software
 
Kubernetes Cloud Native Indonesia Meetup - May 2025
Kubernetes Cloud Native Indonesia Meetup - May 2025Kubernetes Cloud Native Indonesia Meetup - May 2025
Kubernetes Cloud Native Indonesia Meetup - May 2025
Prasta Maha
 
Maxx nft market place new generation nft marketing place
Maxx nft market place new generation nft marketing placeMaxx nft market place new generation nft marketing place
Maxx nft market place new generation nft marketing place
usersalmanrazdelhi
 
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 ADr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr Jimmy Schwarzkopf presentation on the SUMMIT 2025 A
Dr. Jimmy Schwarzkopf
 
Gihbli AI and Geo sitution |use/misuse of Ai Technology
Gihbli AI and Geo sitution |use/misuse of Ai TechnologyGihbli AI and Geo sitution |use/misuse of Ai Technology
Gihbli AI and Geo sitution |use/misuse of Ai Technology
zainkhurram1111
 
Grannie’s Journey to Using Healthcare AI Experiences
Grannie’s Journey to Using Healthcare AI ExperiencesGrannie’s Journey to Using Healthcare AI Experiences
Grannie’s Journey to Using Healthcare AI Experiences
Lauren Parr
 
New Ways to Reduce Database Costs with ScyllaDB
New Ways to Reduce Database Costs with ScyllaDBNew Ways to Reduce Database Costs with ScyllaDB
New Ways to Reduce Database Costs with ScyllaDB
ScyllaDB
 
Agentic AI - The New Era of Intelligence
Agentic AI - The New Era of IntelligenceAgentic AI - The New Era of Intelligence
Agentic AI - The New Era of Intelligence
Muzammil Shah
 
AI Emotional Actors: “When Machines Learn to Feel and Perform"
AI Emotional Actors:  “When Machines Learn to Feel and Perform"AI Emotional Actors:  “When Machines Learn to Feel and Perform"
AI Emotional Actors: “When Machines Learn to Feel and Perform"
AkashKumar809858
 
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Nix(OS) for Python Developers - PyCon 25 (Bologna, Italia)
Peter Bittner
 
AI Trends - Mary Meeker
AI Trends - Mary MeekerAI Trends - Mary Meeker
AI Trends - Mary Meeker
Razin Mustafiz
 
Evaluation Challenges in Using Generative AI for Science & Technical Content
Evaluation Challenges in Using Generative AI for Science & Technical ContentEvaluation Challenges in Using Generative AI for Science & Technical Content
Evaluation Challenges in Using Generative AI for Science & Technical Content
Paul Groth
 
European Accessibility Act & Integrated Accessibility Testing
European Accessibility Act & Integrated Accessibility TestingEuropean Accessibility Act & Integrated Accessibility Testing
European Accessibility Act & Integrated Accessibility Testing
Julia Undeutsch
 
LSNIF: Locally-Subdivided Neural Intersection Function
LSNIF: Locally-Subdivided Neural Intersection FunctionLSNIF: Locally-Subdivided Neural Intersection Function
LSNIF: Locally-Subdivided Neural Intersection Function
Takahiro Harada
 
UiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPath Community Berlin: Studio Tips & Tricks and UiPath InsightsUiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPath Community Berlin: Studio Tips & Tricks and UiPath Insights
UiPathCommunity
 
Contributing to WordPress With & Without Code.pptx
Contributing to WordPress With & Without Code.pptxContributing to WordPress With & Without Code.pptx
Contributing to WordPress With & Without Code.pptx
Patrick Lumumba
 
6th Power Grid Model Meetup - 21 May 2025
6th Power Grid Model Meetup - 21 May 20256th Power Grid Model Meetup - 21 May 2025
6th Power Grid Model Meetup - 21 May 2025
DanBrown980551
 
Introducing the OSA 3200 SP and OSA 3250 ePRC
Introducing the OSA 3200 SP and OSA 3250 ePRCIntroducing the OSA 3200 SP and OSA 3250 ePRC
Introducing the OSA 3200 SP and OSA 3250 ePRC
Adtran
 
Microsoft Build 2025 takeaways in one presentation
Microsoft Build 2025 takeaways in one presentationMicrosoft Build 2025 takeaways in one presentation
Microsoft Build 2025 takeaways in one presentation
Digitalmara
 
Droidal: AI Agents Revolutionizing Healthcare
Droidal: AI Agents Revolutionizing HealthcareDroidal: AI Agents Revolutionizing Healthcare
Droidal: AI Agents Revolutionizing Healthcare
Droidal LLC
 
Introducing FME Realize: A New Era of Spatial Computing and AR
Introducing FME Realize: A New Era of Spatial Computing and ARIntroducing FME Realize: A New Era of Spatial Computing and AR
Introducing FME Realize: A New Era of Spatial Computing and AR
Safe Software
 
Kubernetes Cloud Native Indonesia Meetup - May 2025
Kubernetes Cloud Native Indonesia Meetup - May 2025Kubernetes Cloud Native Indonesia Meetup - May 2025
Kubernetes Cloud Native Indonesia Meetup - May 2025
Prasta Maha
 

Async and Non-blocking IO w/ JRuby