SlideShare a Scribd company logo
1 of 77
Download to read offline
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
NETTY @ APPLE
https://speakerdeck.com/normanmaurer/connectivity
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)
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
HOW TO ASSEMBLE A JRUBY + RATPACK APP
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

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 containersClaus 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 whaleHenryk 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 Lispfukamachi
 
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 libraryClaus Ibsen
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disquszeeg
 
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) 2013Marcus 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 performanceSteven 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 storesTomas 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 containersClaus 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 WorldSATOSHI TAGOMORI
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02Jinho 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 itMichael Klishin
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parserfukamachi
 

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
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
 
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...
 
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
 
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
 
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 ...
 
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
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
 
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)
 
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
 
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
 
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
 
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
 
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
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02
 
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
 
Scripting Embulk Plugins
Scripting Embulk PluginsScripting Embulk Plugins
Scripting Embulk Plugins
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parser
 
Docker.io
Docker.ioDocker.io
Docker.io
 

Similar to Async and Non-blocking IO w/ JRuby

Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011tobiascrawley
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxbobmcwhirter
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneidermfrancis
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jscacois
 
Concurrency at the Database Layer
Concurrency at the Database Layer Concurrency at the Database Layer
Concurrency at the Database Layer mcwilson1
 
Building Go Web Apps
Building Go Web AppsBuilding Go Web Apps
Building Go Web AppsMark
 
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...NETWAYS
 
Php assíncrono com_react_php
Php assíncrono com_react_phpPhp assíncrono com_react_php
Php assíncrono com_react_phpRenato Lucena
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Deadnoamt
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous JavascriptGarrett Welson
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Baruch Sadogursky
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Spring data iii
Spring data iiiSpring data iii
Spring data iii명철 강
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 

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

Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBox
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneider
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.js
 
Concurrency at the Database Layer
Concurrency at the Database Layer Concurrency at the Database Layer
Concurrency at the Database Layer
 
Building Go Web Apps
Building Go Web AppsBuilding Go Web Apps
Building Go Web Apps
 
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
 
Php assíncrono com_react_php
Php assíncrono com_react_phpPhp assíncrono com_react_php
Php assíncrono com_react_php
 
London HUG 12/4
London HUG 12/4London HUG 12/4
London HUG 12/4
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Dead
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
RxSwift to Combine
RxSwift to CombineRxSwift to Combine
RxSwift to Combine
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Spring data iii
Spring data iiiSpring data iii
Spring data iii
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Riak with Rails
Riak with RailsRiak with Rails
Riak with Rails
 

More from 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 ThemJoe Kutner
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star PartyJoe 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 MakeJoe Kutner
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps ExpoJoe Kutner
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space AppsJoe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipsterJoe 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 MicroservicesJoe 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 copyJoe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web FrameworksJoe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJoe Kutner
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jrubyJoe Kutner
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor ScalaJoe Kutner
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptJoe Kutner
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM BytecodeJoe 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 DeploymentJoe 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 HerokuJoe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy ProgrammerJoe Kutner
 

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
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star Party
 
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
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps Expo
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space Apps
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipster
 
What the Struts?
What the Struts?What the Struts?
What the Struts?
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
 
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
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jruby
 
Java 20
Java 20Java 20
Java 20
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor Scala
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with Jitescript
 
jdays 2015
jdays 2015jdays 2015
jdays 2015
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
 
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
 
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
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy Programmer
 

Recently uploaded

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 

Recently uploaded (20)

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 

Async and Non-blocking IO w/ JRuby