1 %h2 core features and compatibility
6 %th.tee rack.input streaming
54 %td.mod RevThreadSpawn
104 RevThread* + 1.8 requires Rev >= 0.3.2 for reasonable performance
106 waiting on Rubinius for better signal handling
108 rack.input streaming is what makes
109 %a(href="http://upr.bogomips.org/") upload progress,
112 rack.input streaming is NOT compatible with current versions of nginx
113 or any proxy that fully buffers request bodies before proxying.
114 Keep in mind request body buffering in nginx is a good thing in all
115 other cases where rack.input streaming is not needed.
117 %h2 application requirements
122 %th.slowio slow I/O (backend, not client)
123 %th.thr thread safety
124 %th.reent single thread reentrant
133 %a(href="http://rev.rubyforge.org/")Rev,
134 %a(href="http://revactor.org/")Revactor,
137 %a(href="Rainbows/Fiber/IO.html")Fiber::IO
142 %td.slowio thread-safe Ruby
148 %a(href="http://rev.rubyforge.org/") Rev
153 %td.slowio thread-safe Ruby
159 %a(href="http://rubyeventmachine.com") EventMachine
163 %td.mod RevThreadSpawn
166 %a(href="http://rev.rubyforge.org/") Rev
172 %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
178 %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
183 %td.slowio thread-safe Ruby
189 %a(href="http://www.espace.com.eg/neverblock") NeverBlock,
190 %a(href="http://rubyeventmachine.com") EventMachine
194 %td.mod RevThreadPool
197 %a(href="http://rev.rubyforge.org/") Rev
201 %td.mod RevFiberSpawn
203 %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
209 Requirements for single thread reentrancy are loose in that there is
210 no risk of race conditions and potentially mutually exclusive to
211 thread-safety. In the case where a Fiber yields while holding a
212 resource and another Fiber attempting to acquire it may raise
213 an error or worse, deadlock the entire process.
215 Slow I/O means anything that can block/stall on sockets including
216 3rd-party APIs (OpenID providers included) or slow database queries.
217 Properly run Memcached (within the same LAN) is fast and not a blocker.
218 Slow I/O on POSIX filesystems only includes a few operations, namely
219 on UNIX domain sockets and named pipes. Nearly all other operations
220 on POSIX filesystems can be considered "fast", or at least
223 %h2 middlewares and frameworks
230 %a(href="Rainbows/DevFdResponse.html") DevFdResponse
232 %a(href="Rainbows/AppPool.html") AppPool
234 %a(href="http://rack.rubyforge.org/doc/Rack/Lock.html") Rack::Lock
242 %td.async lots of RAM :P
249 %td.async Revactor itself
256 %td.async standard Ruby
263 %td.async DevFdResponse
270 %td.async standard Ruby
277 %td.async async_sinatra, Cramp, rack-fiber_pool
280 %td.mod RevThreadSpawn
284 %td.async standard Ruby
291 %td.async Rainbows::Fiber::IO, Rainbows.sleep
298 %td.async Rainbows::Fiber::IO, Rainbows.sleep
305 %td.async standard Ruby
312 %td.async NeverBlock, async_sinatra
315 %td.mod RevThreadPool
319 %td.async standard Ruby
322 %td.mod RevFiberSpawn
326 %td.async Rainbows::Fiber::IO, Rainbows.sleep
330 "No!" means it's fundamentally incompatible, use an
331 %a(href="Rainbows/AppPool.html") AppPool
335 NeverBlock also supports a :pool_size option which is one less
336 layer of complexity than using AppPool.
338 NeverBlock can neuter the Mutex class so Rack::Lock effectively
339 becomes a no-op with:
341 %code require "never_block/frameworks/rails"
342 (before Rails is loaded)
344 Everything that's DevFdResponse-compatible can use it for passing
345 async responses through