新手问题 Rainbows 该如何理解?

i5ting · 2013年09月15日 · 最后由 jimrokliu 回复于 2013年09月17日 · 3703 次阅读

Rainbows! - Unicorn for sleepy apps and slow clients

\Rainbows! is an HTTP server for sleepy Rack applications. It is based on Unicorn, but designed to handle applications that expect long request/response times and/or slow clients.

For Rack applications not heavily bound by slow external network dependencies, consider Unicorn instead as it simpler and easier to debug.

求解释

\彩虹!HTTP 服务器为困机架应用。它是基于 麒麟,而是设计用来处理应用程序,预计长 请求/响应时间和/或慢的客户端。

没有大量的约束外部网络缓慢机架应用 依赖性,考虑独角兽,而不是因为它更简单,更容易 调试。

expect long request/response times and/or slow clients. 处理请求/响应时间很长 and/or 慢的客户端?

别扭。。。。

#1 楼 @Rei google 翻译的吧?哈哈

针对长请求和慢请求优化,具体怎么做到的我也不清楚。

是不是说 rainbows 是多线程的,在有大量外部依赖的情况下,也就是 IO bound 的应用里,多个线程可以复用 IO 阻塞的时间,所以比较适用。

rainbows 可以基于 eventmachine,有多种并发模型可以选择。针对慢速的连接可以较好的处理。

#6 楼 @jimrokliu hi,何为慢速的链接啊?

#7 楼 @winnie 这个写的不太一样,只是说是多线程而已

如果你程序内有很多网络 IO 和磁盘 IO,Rainbows 才会有作用,不至于每个 request 因为 IO 卡在那,别的 request 进不来,CPU 运算无效,Ruby GIL

最近才把 Rainbows 从 production 换回 Unicorn 有几个问题

  1. 因为用的 Rainbows ThreadPool,造成许多奇怪的问题,奇怪的异常,你的程序也许 ThreadSafe 但用的 Gem 就不一定了
  2. 更多的 Mysql 连接,例如 5 Process * 20 Thread 那就是 100 个连接,会造成数据库服务器内存消耗过多,那么相对缓存的设置就会变小
  3. Thread 卡死,这个问题比较 tricky 也不好调试,如果多个很慢 request 进入 thread,而且是 CPU 运算类型的,那么这几个 request 互相竞争 CPU,导致响应时间过长
  4. 设置一定的 timeout 时间,不至于 request 都卡在那

换成回 Unicorn,就比较简单了,一个 CPU 一个 Process 正在考虑,把慢的 IO 的 request 发到 Rainbows,其他的发到 Unicorn,不知道有谁这么用过

#10 楼 @allenwei 谢谢 allen,当年 zig 真是没看错人

#8 楼 @i5ting 慢客户端的例子很多,例如手机的网络,移动的 2G 很慢,一次请求断断续续,拖累你的服务器不能为其他链接服务。当然,前提是你的服务器不是基于事件的并发模型。

#13 楼 @jimrokliu 为什么 unicorn 的自杀 worker 搞不定这个呢?

#14 楼 @i5ting 当然搞不定了。除非每个 worker 服务完后专心等待所有的慢连接关闭。这个等待时间不确定。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号