local.mk.sample: fix isolate 2.0.0 path :x
[rainbows.git] / Documentation / comparison.haml
blobae3348a031c8905499cd8761f4b742c6c277d918
1 %h2 core features and compatibility
2 %br
3 %table.comp
4   %tr.comp_header
5     %th.mod module
6     %th.tee rack.input streaming
7     %th.r18 Ruby 1.8
8     %th.r19 Ruby 1.9
9     %th.rbx Rubinius
10     %th.slow slow clients
11   %tr.comp_base
12     %td.mod Unicorn/Base
13     %td.tee Yes
14     %td.r18 Yes
15     %td.r19 Yes
16     %td.rbx Yes
17     %td.slow No
18   %tr.comp_row
19     %td.mod Revactor
20     %td.tee Yes
21     %td.r18 No
22     %td.r19 Yes
23     %td.rbx No
24     %td.slow Yes
25   %tr.comp_row
26     %td.mod ThreadPool
27     %td.tee Yes
28     %td.r18 Yes
29     %td.r19 Yes
30     %td.rbx Yes
31     %td.slow OK
32   %tr.comp_row
33     %td.mod Rev
34     %td.tee No
35     %td.r18 Yes
36     %td.r19 Yes
37     %td.rbx No
38     %td.slow Yes
39   %tr.comp_row
40     %td.mod ThreadSpawn
41     %td.tee Yes
42     %td.r18 Yes
43     %td.r19 Yes
44     %td.rbx Yes
45     %td.slow OK
46   %tr.comp_row
47     %td.mod EventMachine
48     %td.tee No
49     %td.r18 Yes
50     %td.r19 Yes
51     %td.rbx No
52     %td.slow Yes
53   %tr.comp_row
54     %td.mod RevThreadSpawn
55     %td.tee No
56     %td.r18 Yes
57     %td.r19 Yes
58     %td.rbx No
59     %td.slow Yes
60   %tr.comp_row
61     %td.mod FiberSpawn
62     %td.tee Yes
63     %td.r18 No
64     %td.r19 Yes
65     %td.rbx No
66     %td.slow Yes
67   %tr.comp_row
68     %td.mod FiberPool
69     %td.tee Yes
70     %td.r18 No
71     %td.r19 Yes
72     %td.rbx No
73     %td.slow Yes
74   %tr.comp_base
75     %td.mod ActorSpawn
76     %td.tee Yes
77     %td.r18 Not yet
78     %td.r19 No
79     %td.rbx Yes
80     %td.slow Yes
81   %tr.comp_base
82     %td.mod NeverBlock
83     %td.tee No
84     %td.r18 Yes
85     %td.r19 Yes
86     %td.rbx No
87     %td.slow Yes
88   %tr.comp_row
89     %td.mod RevThreadPool
90     %td.tee No
91     %td.r18 Yes
92     %td.r19 Yes
93     %td.rbx No
94     %td.slow Yes
95   %tr.comp_row
96     %td.mod RevFiberSpawn
97     %td.tee Yes
98     %td.r18 No
99     %td.r19 Yes
100     %td.rbx No
101     %td.slow Yes
103   %li
104     RevThread* + 1.8 requires Rev >= 0.3.2 for reasonable performance
105   %li
106     waiting on Rubinius for better signal handling
107   %li
108     rack.input streaming is what makes
109     %a(href="http://upr.bogomips.org/") upload progress,
110     and BOSH possible
111   %li
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
119 %table.comp
120   %tr.comp_header
121     %th.mod module
122     %th.slowio slow I/O (backend, not client)
123     %th.thr thread safety
124     %th.reent single thread reentrant
125   %tr.comp_base
126     %td.mod Unicorn/Base
127     %td.slowio avoid
128     %td.thr No
129     %td.reent No
130   %tr.comp_row
131     %td.mod Revactor
132     %td.slowio
133       %a(href="http://rev.rubyforge.org/")Rev,
134       %a(href="http://revactor.org/")Revactor,
135       %b
136         not
137       %a(href="Rainbows/Fiber/IO.html")Fiber::IO
138     %td.thr No
139     %td.reent Yes
140   %tr.comp_row
141     %td.mod ThreadPool
142     %td.slowio thread-safe Ruby
143     %td.thr Yes
144     %td.reent No
145   %tr.comp_row
146     %td.mod Rev
147     %td.slowio
148       %a(href="http://rev.rubyforge.org/") Rev
149     %td.thr No
150     %td.reent No
151   %tr.comp_row
152     %td.mod ThreadSpawn
153     %td.slowio thread-safe Ruby
154     %td.thr Yes
155     %td.reent No
156   %tr.comp_row
157     %td.mod EventMachine
158     %td.slowio
159       %a(href="http://rubyeventmachine.com") EventMachine
160     %td.thr No
161     %td.reent No
162   %tr.comp_row
163     %td.mod RevThreadSpawn
164     %td.slowio
165       thread-safe Ruby,
166       %a(href="http://rev.rubyforge.org/") Rev
167     %td.thr Yes
168     %td.reent No
169   %tr.comp_row
170     %td.mod FiberSpawn
171     %td.slowio
172       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
173     %td.thr No
174     %td.reent Yes
175   %tr.comp_row
176     %td.mod FiberPool
177     %td.slowio
178       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
179     %td.thr No
180     %td.reent Yes
181   %tr.comp_base
182     %td.mod ActorSpawn
183     %td.slowio thread-safe Ruby
184     %td.thr Yes
185     %td.reent Yes
186   %tr.comp_base
187     %td.mod NeverBlock
188     %td.slowio
189       %a(href="http://www.espace.com.eg/neverblock") NeverBlock,
190       %a(href="http://rubyeventmachine.com") EventMachine
191     %td.thr No
192     %td.reent Yes
193   %tr.comp_row
194     %td.mod RevThreadPool
195     %td.slowio
196       thread-safe Ruby,
197       %a(href="http://rev.rubyforge.org/") Rev
198     %td.thr Yes
199     %td.reent No
200   %tr.comp_row
201     %td.mod RevFiberSpawn
202     %td.slowio
203       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
204     %td.thr No
205     %td.reent Yes
208   %li
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.
214   %li
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
221     uninterruptible.
223 %h2 middlewares and frameworks
226 %table.comp
227   %tr.comp_header
228     %th.mod model
229     %th.devfd
230       %a(href="Rainbows/DevFdResponse.html") DevFdResponse
231     %th.app_pool
232       %a(href="Rainbows/AppPool.html") AppPool
233     %th.lock
234       %a(href="http://rack.rubyforge.org/doc/Rack/Lock.html") Rack::Lock
235     %th.async async
236     %th.ws Web Sockets
237   %tr.comp_row
238     %td.mod Unicorn/Base
239     %td.devfd no-op
240     %td.app_pool no-op
241     %td.lock no-op
242     %td.async lots of RAM :P
243     %td.ws no
244   %tr.comp_row
245     %td.mod Revactor
246     %td.devfd no-op
247     %td.app_pool Yes
248     %td.lock No!
249     %td.async Revactor itself
250     %td.ws Sunshowers
251   %tr.comp_row
252     %td.mod ThreadPool
253     %td.devfd no-op
254     %td.app_pool Yes
255     %td.lock Yes
256     %td.async standard Ruby
257     %td.ws Sunshowers
258   %tr.comp_row
259     %td.mod Rev
260     %td.devfd Yes
261     %td.app_pool no-op
262     %td.lock no-op
263     %td.async DevFdResponse
264     %td.ws no
265   %tr.comp_row
266     %td.mod ThreadSpawn
267     %td.devfd no-op
268     %td.app_pool Yes
269     %td.lock Yes
270     %td.async standard Ruby
271     %td.ws Sunshowers
272   %tr.comp_row
273     %td.mod EventMachine
274     %td.devfd Yes
275     %td.app_pool no-op
276     %td.lock no-op
277     %td.async async_sinatra, Cramp, rack-fiber_pool
278     %td.ws no
279   %tr.comp_row
280     %td.mod RevThreadSpawn
281     %td.devfd Yes
282     %td.app_pool Yes
283     %td.lock Dumb
284     %td.async standard Ruby
285     %td.ws no
286   %tr.comp_row
287     %td.mod FiberSpawn
288     %td.devfd Yes
289     %td.app_pool Yes
290     %td.lock No!
291     %td.async Rainbows::Fiber::IO, Rainbows.sleep
292     %td.ws Sunshowers
293   %tr.comp_row
294     %td.mod FiberPool
295     %td.devfd Yes
296     %td.app_pool Yes
297     %td.lock No!
298     %td.async Rainbows::Fiber::IO, Rainbows.sleep
299     %td.ws Sunshowers
300   %tr.comp_row
301     %td.mod ActorSpawn
302     %td.devfd no-op
303     %td.app_pool Yes
304     %td.lock Yes
305     %td.async standard Ruby
306     %td.ws Sunshowers
307   %tr.comp_row
308     %td.mod NeverBlock
309     %td.devfd Yes
310     %td.app_pool Yes*
311     %td.lock Yes*
312     %td.async NeverBlock, async_sinatra
313     %td.ws no
314   %tr.comp_row
315     %td.mod RevThreadPool
316     %td.devfd Yes
317     %td.app_pool Yes
318     %td.lock Dumb
319     %td.async standard Ruby
320     %td.ws no
321   %tr.comp_row
322     %td.mod RevFiberSpawn
323     %td.devfd Yes
324     %td.app_pool Yes
325     %td.lock No!
326     %td.async Rainbows::Fiber::IO, Rainbows.sleep
329   %li
330     "No!" means it's fundamentally incompatible, use an
331     %a(href="Rainbows/AppPool.html") AppPool
332     %b :size
333     of one instead.
334   %li
335     NeverBlock also supports a :pool_size option which is one less
336     layer of complexity than using AppPool.
337   %li
338     NeverBlock can neuter the Mutex class so Rack::Lock effectively
339     becomes a no-op with:
340     %br
341     %code require "never_block/frameworks/rails"
342     (before Rails is loaded)
343   %li
344     Everything that's DevFdResponse-compatible can use it for passing
345     async responses through