为什么我的Rack应用程序挂起?

时间:2014-02-03 17:07:17

标签: ruby streaming rack

我已经编写了一个开源的Rack应用程序和核心文件来汇集Tradeking.com的股票报价。这是机架应用程序:https://github.com/chaddjohnson/trading_websocket_service。这是核心库:https://github.com/chaddjohnson/trading_core

我修改了trading_core / lib / trading_core / quote_streamer / tradeking.rb以将流数据输出到控制台,如下所示:

@http.stream do |data|
  puts data

经过几个小时的流式传输并输出到控制台后,它就会冻结。我完全不知道为什么。我已尽力确保任何循环都不是无限的。我已经调试了一个多星期了。

为什么会发生这种情况?

以下是我认为可能发生这种情况的主要文件:

2 个答案:

答案 0 :(得分:1)

首次查看代码时,我可以想象出两个原因:

  1. 您正在使用Tradeking达到速率限制(可能使用超过256个符号或脚本的多个实例(他们不喜欢这样)或更快地更新符号(更改它们)
  2. 当您解析每个传入的消息时,您可能会“阻塞”您的流。我看到很多人使用Twitter流,解析结果并将其写入数据库。它太慢了然后开始阻塞。

答案 1 :(得分:1)

很高兴我能把你推向正确的方向!

我的第一次预感是关于公开联系:

  

您可能需要确保关闭连接:@ http.close in   在您引用的方法结束时的确保块

接着进行一些取证:

  

听起来你必须深入研究你正在运行的红宝石过程   弄清楚是什么窒息了。取决于您所使用的操作系统   当然,在mac和linux上你可以使用像gdb,strace,dtrace这样的工具,   等。例如:   ruby.dzone.com/articles/debugging-stuck-ruby-processes

我们发现select被大量召唤,这使我们对连接产生了怀疑。 原来问题在于通过@api ||= ...init code...

重复使用死连接 很高兴你能找到它是什么!感谢您发布解决方案!