Revert "epoll: fixes for Ruby 1.9.3dev"
[rainbows.git] / Documentation / comparison.haml
blob3289088875559147f61deffec2ab599d5bdf4f03
1 %h1 Rainbows! at a glance
2 %p
3   Confused by all the options we give you?  So are we!  Here's some tables
4   to help keep your head straight.  Remember, engineering is all about
5   trade-offs.
6 %h2 core features and compatibility
7 %br
8 %table.comp
9   %tr.comp_header
10     %th.mod module
11     %th.tee rack.input streaming
12     %th.r18 Ruby 1.8
13     %th.r19 Ruby 1.9
14     %th.rbx Rubinius
15     %th.slow slow clients
16   %tr.comp_base
17     %td.mod Unicorn/Base
18     %td.tee Yes
19     %td.r18 Yes
20     %td.r19 Yes
21     %td.rbx Yes
22     %td.slow No
23   %tr.comp_row
24     %td.mod Revactor
25     %td.tee Yes
26     %td.r18 No
27     %td.r19 Yes
28     %td.rbx No
29     %td.slow Yes
30   %tr.comp_row
31     %td.mod ThreadPool
32     %td.tee Yes
33     %td.r18 Yes
34     %td.r19 Yes
35     %td.rbx Yes
36     %td.slow Yes
37   %tr.comp_row
38     %td.mod Coolio
39     %td.tee No
40     %td.r18 Yes
41     %td.r19 Yes
42     %td.rbx No
43     %td.slow Yes
44   %tr.comp_row
45     %td.mod ThreadSpawn
46     %td.tee Yes
47     %td.r18 Yes
48     %td.r19 Yes
49     %td.rbx Yes
50     %td.slow Yes
51   %tr.comp_row
52     %td.mod EventMachine
53     %td.tee No
54     %td.r18 Yes
55     %td.r19 Yes
56     %td.rbx No
57     %td.slow Yes
58   %tr.comp_row
59     %td.mod CoolioThreadSpawn
60     %td.tee No
61     %td.r18 No
62     %td.r19 Yes
63     %td.rbx No
64     %td.slow Yes
65   %tr.comp_row
66     %td.mod FiberSpawn
67     %td.tee Yes
68     %td.r18 No
69     %td.r19 Yes
70     %td.rbx No
71     %td.slow Yes
72   %tr.comp_row
73     %td.mod FiberPool
74     %td.tee Yes
75     %td.r18 No
76     %td.r19 Yes
77     %td.rbx No
78     %td.slow Yes
79   %tr.comp_base
80     %td.mod ActorSpawn
81     %td.tee Yes
82     %td.r18 Not yet
83     %td.r19 No
84     %td.rbx Yes
85     %td.slow Yes
86   %tr.comp_base
87     %td.mod NeverBlock
88     %td.tee No
89     %td.r18 Yes
90     %td.r19 Yes
91     %td.rbx No
92     %td.slow Yes
93   %tr.comp_row
94     %td.mod CoolioThreadPool
95     %td.tee No
96     %td.r18 Yes
97     %td.r19 No
98     %td.rbx No
99     %td.slow Yes
100   %tr.comp_row
101     %td.mod CoolioFiberSpawn
102     %td.tee Yes
103     %td.r18 No
104     %td.r19 Yes
105     %td.rbx No
106     %td.slow Yes
107   %tr.comp_row
108     %td.mod WriterThreadPool
109     %td.tee Yes
110     %td.r18 Yes
111     %td.r19 Yes
112     %td.rbx Yes
113     %td.slow no
114   %tr.comp_row
115     %td.mod WriterThreadSpawn
116     %td.tee Yes
117     %td.r18 Yes
118     %td.r19 Yes
119     %td.rbx Yes
120     %td.slow no
121   %tr.comp_row
122     %td.mod Epoll
123     %td.tee no
124     %td.r18 Yes
125     %td.r19 Yes
126     %td.rbx Yes
127     %td.slow Yes
128   %tr.comp_row
129     %td.mod XEpoll
130     %td.tee no
131     %td.r18 Yes
132     %td.r19 Yes
133     %td.rbx Yes
134     %td.slow Yes
136   %li
137     Cool.io should also work with Rubinius (though we haven't had time to test).
138   %li
139     CoolioThread* and CoolioThread* requires Ruby 1.9 reasonable performance
140   %li
141     rack.input streaming is what makes
142     %a(href="http://upr.bogomips.org/") upload progress,
143     and BOSH possible
144   %li
145     rack.input streaming is NOT compatible with current versions of nginx
146     or any proxy that fully buffers request bodies before proxying.
147     Keep in mind request body buffering in nginx is a good thing in all
148     other cases where rack.input streaming is not needed.
150 %h2 application requirements
152 %table.comp
153   %tr.comp_header
154     %th.mod module
155     %th.slowio slow I/O (backend, not client)
156     %th.thr thread safety
157     %th.reent single thread reentrant
158   %tr.comp_base
159     %td.mod Unicorn/Base
160     %td.slowio avoid
161     %td.thr No
162     %td.reent No
163   %tr.comp_row
164     %td.mod Revactor
165     %td.slowio
166       %a(href="http://coolio.github.com/")Coolio,
167       %a(href="http://revactor.org/")Revactor,
168       %b
169         not
170       %a(href="Rainbows/Fiber/IO.html")Fiber::IO
171     %td.thr No
172     %td.reent Yes
173   %tr.comp_row
174     %td.mod ThreadPool
175     %td.slowio thread-safe Ruby
176     %td.thr Yes
177     %td.reent No
178   %tr.comp_row
179     %td.mod Coolio
180     %td.slowio
181       %a(href="http://coolio.github.com/") Coolio
182     %td.thr No
183     %td.reent No
184   %tr.comp_row
185     %td.mod ThreadSpawn
186     %td.slowio thread-safe Ruby
187     %td.thr Yes
188     %td.reent No
189   %tr.comp_row
190     %td.mod EventMachine
191     %td.slowio
192       %a(href="http://rubyeventmachine.com") EventMachine
193     %td.thr No
194     %td.reent No
195   %tr.comp_row
196     %td.mod CoolioThreadSpawn
197     %td.slowio
198       thread-safe Ruby,
199       %a(href="http://coolio.github.com/") Coolio
200     %td.thr Yes
201     %td.reent No
202   %tr.comp_row
203     %td.mod FiberSpawn
204     %td.slowio
205       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
206     %td.thr No
207     %td.reent Yes
208   %tr.comp_row
209     %td.mod FiberPool
210     %td.slowio
211       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
212     %td.thr No
213     %td.reent Yes
214   %tr.comp_base
215     %td.mod ActorSpawn
216     %td.slowio thread-safe Ruby
217     %td.thr Yes
218     %td.reent Yes
219   %tr.comp_base
220     %td.mod NeverBlock
221     %td.slowio
222       %a(href="http://www.espace.com.eg/neverblock") NeverBlock,
223       %a(href="http://rubyeventmachine.com") EventMachine
224     %td.thr No
225     %td.reent Yes
226   %tr.comp_row
227     %td.mod CoolioThreadPool
228     %td.slowio
229       thread-safe Ruby,
230       %a(href="http://coolio.github.com/") Coolio
231     %td.thr Yes
232     %td.reent No
233   %tr.comp_row
234     %td.mod CoolioFiberSpawn
235     %td.slowio
236       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
237     %td.thr No
238     %td.reent Yes
239   %tr.comp_base
240     %td.mod WriterThreadPool
241     %td.slowio avoid
242     %td.thr Maybe
243     %td.reent Maybe
244   %tr.comp_base
245     %td.mod WriterThreadSpawn
246     %td.slowio avoid
247     %td.thr Maybe
248     %td.reent Maybe
249   %tr.comp_base
250     %td.mod Epoll
251     %td.slowio No
252     %td.thr No
253     %td.reent No
254   %tr.comp_base
255     %td.mod XEpoll
256     %td.slowio No
257     %td.thr No
258     %td.reent No
260   %li
261     Requirements for single thread reentrancy are loose in that there is
262     no risk of race conditions and potentially mutually exclusive to
263     thread-safety.  In the case where a Fiber yields while holding a
264     resource and another Fiber attempting to acquire it may raise
265     an error or worse, deadlock the entire process.
266   %li
267     Slow I/O means anything that can block/stall on sockets including
268     3rd-party APIs (OpenID providers included) or slow database queries.
269     Properly run Memcached (within the same LAN) is fast and not a blocker.
270     Slow I/O on POSIX filesystems only includes a few operations, namely
271     on UNIX domain sockets and named pipes.  Nearly all other operations
272     on POSIX filesystems can be considered "fast", or at least
273     uninterruptible.
274   %li
275     WriterThread{Pool,Spawn} will require thread safety if your response
276     body is dynamically generated during the body#each call.
278 %h2 middlewares and frameworks
281 %table.comp
282   %tr.comp_header
283     %th.mod model
284     %th.devfd
285       %a(href="Rainbows/DevFdResponse.html") DevFdResponse
286     %th.app_pool
287       %a(href="Rainbows/AppPool.html") AppPool
288     %th.lock
289       %a(href="http://rack.rubyforge.org/doc/Rack/Lock.html") Rack::Lock
290     %th.async async
291     %th.ws Web Sockets
292   %tr.comp_row
293     %td.mod Unicorn/Base
294     %td.devfd no-op
295     %td.app_pool no-op
296     %td.lock no-op
297     %td.async lots of RAM :P
298     %td.ws no
299   %tr.comp_row
300     %td.mod Revactor
301     %td.devfd no-op
302     %td.app_pool Yes
303     %td.lock No!
304     %td.async Revactor itself
305     %td.ws no
306   %tr.comp_row
307     %td.mod ThreadPool
308     %td.devfd Yes
309     %td.app_pool Yes
310     %td.lock Yes
311     %td.async standard Ruby
312     %td.ws no
313   %tr.comp_row
314     %td.mod Coolio
315     %td.devfd Yes
316     %td.app_pool no-op
317     %td.lock no-op
318     %td.async DevFdResponse
319     %td.ws no
320   %tr.comp_row
321     %td.mod ThreadSpawn
322     %td.devfd Yes
323     %td.app_pool Yes
324     %td.lock Yes
325     %td.async standard Ruby
326     %td.ws no
327   %tr.comp_row
328     %td.mod EventMachine
329     %td.devfd Yes
330     %td.app_pool no-op
331     %td.lock no-op
332     %td.async async_sinatra, Cramp, rack-fiber_pool
333     %td.ws no
334   %tr.comp_row
335     %td.mod CoolioThreadSpawn
336     %td.devfd Yes
337     %td.app_pool Yes
338     %td.lock Dumb
339     %td.async standard Ruby
340     %td.ws no
341   %tr.comp_row
342     %td.mod FiberSpawn
343     %td.devfd Yes
344     %td.app_pool Yes
345     %td.lock No!
346     %td.async Rainbows::Fiber::IO, Rainbows.sleep
347     %td.ws no
348   %tr.comp_row
349     %td.mod FiberPool
350     %td.devfd Yes
351     %td.app_pool Yes
352     %td.lock No!
353     %td.async Rainbows::Fiber::IO, Rainbows.sleep
354     %td.ws no
355   %tr.comp_row
356     %td.mod ActorSpawn
357     %td.devfd no-op
358     %td.app_pool Yes
359     %td.lock Yes
360     %td.async standard Ruby
361     %td.ws no
362   %tr.comp_row
363     %td.mod NeverBlock
364     %td.devfd Yes
365     %td.app_pool Yes*
366     %td.lock Yes*
367     %td.async NeverBlock, async_sinatra
368     %td.ws no
369   %tr.comp_row
370     %td.mod CoolioThreadPool
371     %td.devfd Yes
372     %td.app_pool Yes
373     %td.lock Dumb
374     %td.async Coolio, standard Ruby
375     %td.ws no
376   %tr.comp_row
377     %td.mod CoolioFiberSpawn
378     %td.devfd Yes
379     %td.app_pool Yes
380     %td.lock No!
381     %td.async Coolio, Rainbows::Fiber::IO, Rainbows.sleep
382   %tr.comp_row
383     %td.mod WriterThreadPool
384     %td.devfd Yes
385     %td.app_pool no-op
386     %td.lock no-op
387     %td.async Standard Ruby in response body only
388     %td.ws response body only
389   %tr.comp_row
390     %td.mod WriterThreadSpawn
391     %td.devfd Yes
392     %td.app_pool no-op
393     %td.lock no-op
394     %td.async Standard Ruby in response body only
395     %td.ws response body only
396   %tr.comp_row
397     %td.mod Epoll
398     %td.devfd Yes
399     %td.app_pool no-op
400     %td.lock no-op
401     %td.async DevFdResponse
402     %td.ws no
403   %tr.comp_row
404     %td.mod XEpoll
405     %td.devfd Yes
406     %td.app_pool no-op
407     %td.lock no-op
408     %td.async DevFdResponse
409     %td.ws no
411   %li
412     "No!" means it's fundamentally incompatible, use an
413     %a(href="Rainbows/AppPool.html") AppPool
414     %b :size
415     of one instead.
416   %li
417     NeverBlock also supports a :pool_size option which is one less
418     layer of complexity than using AppPool.
419   %li
420     NeverBlock can neuter the Mutex class so Rack::Lock effectively
421     becomes a no-op with:
422     %br
423     %code require "never_block/frameworks/rails"
424     (before Rails is loaded)
425   %li
426     Everything that's DevFdResponse-compatible can use it for passing
427     async responses through