我正在尝试使用pusher-client gem从网站接收Pusher(接近实时数据)。但是,剧本往往会死很多。
如果我将Pusher数据发布到我的屏幕上,那么只要我愿意让它运行,客户端就会运行。但是,如果我将Pusher数据保存到文件,或者将数据传递给Gearman作业,使用gearman gem,或者使用dalli gem将数据放入Memcache,那么我的客户端脚本会崩溃。
我的服务器没有以任何方式超载。它有8个内核和24 GB的RAM。通常情况下,任何时候都没有单个核心处于100%且不超过6个,并且使用的RAM不超过12 GB。
我目前的客户端脚本化身试图将数据传递给Gearman作业,我希望这可以减轻数据的保存并防止错过Pusher提供的任何更新,这通常会非常快。这是脚本踢出的代表性错误:
ruby-2.1.1/gems/gearman-ruby-3.0.7/lib/gearman/taskset.rb:99:in `handle_job_created': Got unexpected job_created notification with handle H:hawk898
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/gearman-ruby-3.0.7/lib/gearman/taskset.rb:222:in `read_packet'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/gearman-ruby-3.0.7/lib/gearman/taskset.rb:67:in `add_task_internal'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/gearman-ruby-3.0.7/lib/gearman/taskset.rb:29:in `add_task'
from /var/www/.../utils/pusher_utils.rb:81:in `send_to_gearman'
from /var/www/.../utils/pusher_utils.rb:10:in `export_to_gearman'
from /var/www/.../async_pusher.rb:59:in `block in <main>'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/channel.rb:30:in `call'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/channel.rb:30:in `block in dispatch'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/channel.rb:29:in `each'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/channel.rb:29:in `dispatch'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/channel.rb:22:in `dispatch_with_all'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/socket.rb:201:in `send_local_event'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/socket.rb:73:in `block (2 levels) in connect'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/socket.rb:67:in `loop'
from /home/gabe/.rvm/gems/ruby-2.1.1/gems/pusher-client-0.4.0/lib/pusher-client/socket.rb:67:in `block in connect'
我不想深入了解推动客户宝石并弄清楚为什么会这样。我只是想继续前进,所以我很想使用rescue Exception
。我正在保存Pusher提供的下游逻辑和操作数据。数据正在快速移动,我可以确定作业是否真正进入Gearman,可能错过了下一次更新或延迟它,或者我可以简单地将当前存储的数据标记为陈旧/无效并等待Pusher的下一次更新。我的偏好是将其标记为陈旧/无效并等待。
我已阅读&#34; Why is it a bad style to `rescue Exception => e` in Ruby?&#34;并且知道rescue Exception
是不好的做法。但是,我没有这样做是为了掩盖代码中的错误 - 我已经查看了错误发生时传递给Gearman的工作负载,并且它们没问题。
我正在跑步:
Ubuntu 12.04
RVM and Ruby 2.1.1
以下是一些将心跳工作负载发送到Gearman作业服务器的示例代码:
def heartbeat(site, marketId, taskset)
startTime = timeID()
workload = myhash()
workload['marketId'] = marketId
workload['site'] = site
workload['src'] = 'pusher'
workload['time'] = startTime
workload['staleTime'] = startTime + 1
send_to_gearman('update_heartbeat', json_encode(workload), taskset)
endTime = timeID()
delta =endTime - startTime
puts sprintf("Heartbeat Task Handoff took: %9.4f msec", delta * 1E3)
end # def heartbeat
def send_to_gearman(wrkr, workload, taskset)
pp workload
begin
task = Gearman::Task.new(wrkr, workload, { :priority => :high, :background => true })
taskset.add_task(task)
taskset.wait
rescue => e
pp e
end # begin
end # def send_to_gearman
如果不是失败前几小时,整个代码运行良好几分钟。具体而言,除了rescue
之后的那些代码之外,每行代码都会被重复执行,而不会在handle_job_created
错误之前失败。
那么,在这种情况下使用rescue Exception
是否安全?是否有一些我可以使用的Exception子集,而我却错过了?我可能忽略了任何更好的建议或陷阱?
答案 0 :(得分:0)
您应该只抢救实际引发的错误。在这种情况下,Gearman::ProtocolError
是error being raised。所以使用:
rescue Gearman::ProtocolError