Rainbows! 0.90.1
[rainbows.git] / Documentation / comparison.haml
blob49531f963d59107d57340e51e739386dacdd7896
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 Slow*
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 Slow*
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 performance is bad with Rev <= 0.3.1.
105     Rev 0.3.2 (when it is released) should be much faster under 1.8.
106   %li
107     waiting on Rubinius for better signal handling
108   %li
109     rack.input streaming is what makes
110     %a(href="http://upr.bogomips.org/") upload progress,
111     and BOSH possible
112   %li
113     rack.input streaming is NOT compatible with current versions of nginx
114     or any proxy that fully buffers request bodies before proxying.
115     Keep in mind request body buffering in nginx is a good thing in all
116     other cases where rack.input streaming is not needed.
118 %h2 application requirements
120 %table.comp
121   %tr.comp_header
122     %th.mod module
123     %th.slowio slow I/O (backend, not client)
124     %th.thr thread safety
125     %th.reent single thread reentrant
126   %tr.comp_base
127     %td.mod Unicorn/Base
128     %td.slowio avoid
129     %td.thr No
130     %td.reent No
131   %tr.comp_row
132     %td.mod Revactor
133     %td.slowio
134       %a(href="http://rev.rubyforge.org/")Rev,
135       %a(href="http://revactor.org/")Revactor,
136       %b
137         not
138       %a(href="Rainbows/Fiber/IO.html")Fiber::IO
139     %td.thr No
140     %td.reent Yes
141   %tr.comp_row
142     %td.mod ThreadPool
143     %td.slowio thread-safe Ruby
144     %td.thr Yes
145     %td.reent No
146   %tr.comp_row
147     %td.mod Rev
148     %td.slowio
149       %a(href="http://rev.rubyforge.org/") Rev
150     %td.thr No
151     %td.reent No
152   %tr.comp_row
153     %td.mod ThreadSpawn
154     %td.slowio thread-safe Ruby
155     %td.thr Yes
156     %td.reent No
157   %tr.comp_row
158     %td.mod EventMachine
159     %td.slowio
160       %a(href="http://rubyeventmachine.com") EventMachine
161     %td.thr No
162     %td.reent No
163   %tr.comp_row
164     %td.mod RevThreadSpawn
165     %td.slowio
166       thread-safe Ruby,
167       %a(href="http://rev.rubyforge.org/") Rev
168     %td.thr Yes
169     %td.reent No
170   %tr.comp_row
171     %td.mod FiberSpawn
172     %td.slowio
173       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
174     %td.thr No
175     %td.reent Yes
176   %tr.comp_row
177     %td.mod FiberPool
178     %td.slowio
179       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
180     %td.thr No
181     %td.reent Yes
182   %tr.comp_base
183     %td.mod ActorSpawn
184     %td.slowio thread-safe Ruby
185     %td.thr Yes
186     %td.reent Yes
187   %tr.comp_base
188     %td.mod NeverBlock
189     %td.slowio
190       %a(href="http://www.espace.com.eg/neverblock") NeverBlock,
191       %a(href="http://rubyeventmachine.com") EventMachine
192     %td.thr No
193     %td.reent Yes
194   %tr.comp_row
195     %td.mod RevThreadPool
196     %td.slowio
197       thread-safe Ruby,
198       %a(href="http://rev.rubyforge.org/") Rev
199     %td.thr Yes
200     %td.reent No
201   %tr.comp_row
202     %td.mod RevFiberSpawn
203     %td.slowio
204       %a(href="Rainbows/Fiber/IO.html") Rainbows::Fiber::IO
205     %td.thr No
206     %td.reent Yes
209   %li
210     Requirements for single thread reentrancy are loose in that there is
211     no risk of race conditions and potentially mutually exclusive to
212     thread-safety.  In the case where a Fiber yields while holding a
213     resource and another Fiber attempting to acquire it may raise
214     an error or worse, deadlock the entire process.
215   %li
216     Slow I/O means anything that can block/stall on sockets including
217     3rd-party APIs (OpenID providers included) or slow database queries.
218     Properly run Memcached (within the same LAN) is fast and not a blocker.
219     Slow I/O on POSIX filesystems only includes a few operations, namely
220     on UNIX domain sockets and named pipes.  Nearly all other operations
221     on POSIX filesystems can be considered "fast", or at least
222     uninterruptible.
224 %h2 middlewares and frameworks
227 %table.comp
228   %tr.comp_header
229     %th.mod model
230     %th.devfd
231       %a(href="Rainbows/DevFdResponse.html") DevFdResponse
232     %th.app_pool
233       %a(href="Rainbows/AppPool.html") AppPool
234     %th.lock
235       %a(href="http://rack.rubyforge.org/doc/Rack/Lock.html") Rack::Lock
236     %th.async async
237     %th.ws Web Sockets
238   %tr.comp_row
239     %td.mod Unicorn/Base
240     %td.devfd no-op
241     %td.app_pool no-op
242     %td.lock no-op
243     %td.async lots of RAM :P
244     %td.ws no
245   %tr.comp_row
246     %td.mod Revactor
247     %td.devfd no-op
248     %td.app_pool Yes
249     %td.lock No!
250     %td.async Revactor itself
251     %td.ws Sunshowers
252   %tr.comp_row
253     %td.mod ThreadPool
254     %td.devfd no-op
255     %td.app_pool Yes
256     %td.lock Yes
257     %td.async standard Ruby
258     %td.ws Sunshowers
259   %tr.comp_row
260     %td.mod Rev
261     %td.devfd Yes
262     %td.app_pool no-op
263     %td.lock no-op
264     %td.async DevFdResponse
265     %td.ws no
266   %tr.comp_row
267     %td.mod ThreadSpawn
268     %td.devfd no-op
269     %td.app_pool Yes
270     %td.lock Yes
271     %td.async standard Ruby
272     %td.ws Sunshowers
273   %tr.comp_row
274     %td.mod EventMachine
275     %td.devfd Yes
276     %td.app_pool no-op
277     %td.lock no-op
278     %td.async async_sinatra
279     %td.ws no
280   %tr.comp_row
281     %td.mod RevThreadSpawn
282     %td.devfd Yes
283     %td.app_pool Yes
284     %td.lock Dumb
285     %td.async standard Ruby
286     %td.ws no
287   %tr.comp_row
288     %td.mod FiberSpawn
289     %td.devfd Yes
290     %td.app_pool Yes
291     %td.lock No!
292     %td.async Rainbows::Fiber::IO, Rainbows.sleep
293     %td.ws Sunshowers
294   %tr.comp_row
295     %td.mod FiberPool
296     %td.devfd Yes
297     %td.app_pool Yes
298     %td.lock No!
299     %td.async Rainbows::Fiber::IO, Rainbows.sleep
300     %td.ws Sunshowers
301   %tr.comp_row
302     %td.mod ActorSpawn
303     %td.devfd no-op
304     %td.app_pool Yes
305     %td.lock Yes
306     %td.async standard Ruby
307     %td.ws Sunshowers
308   %tr.comp_row
309     %td.mod NeverBlock
310     %td.devfd Yes
311     %td.app_pool Yes*
312     %td.lock Yes*
313     %td.async NeverBlock, async_sinatra
314     %td.ws no
315   %tr.comp_row
316     %td.mod RevThreadPool
317     %td.devfd Yes
318     %td.app_pool Yes
319     %td.lock Dumb
320     %td.async standard Ruby
321     %td.ws no
322   %tr.comp_row
323     %td.mod RevFiberSpawn
324     %td.devfd Yes
325     %td.app_pool Yes
326     %td.lock No!
327     %td.async Rainbows::Fiber::IO, Rainbows.sleep
330   %li
331     "No!" means it's fundamentally incompatible, use an
332     %a(href="Rainbows/AppPool.html") AppPool
333     %b :size
334     of one instead.
335   %li
336     NeverBlock also supports a :pool_size option which is one less
337     layer of complexity than using AppPool.
338   %li
339     NeverBlock can neuter the Mutex class so Rack::Lock effectively
340     becomes a no-op with:
341     %br
342     %code require "never_block/frameworks/rails"
343     (before Rails is loaded)
344   %li
345     Everything that's DevFdResponse-compatible can use it for passing
346     async responses through