0

我正在尝试使用 pusher-client gem 从网站接收 Pusher(接近实时数据)。但是,脚本往往会死掉很多。

如果我将 Pusher 数据发布到我的屏幕上,那么只要我愿意让它运行,客户端就会运行。但是,如果我将 Pusher 数据保存到文件中,或者使用 gearman gem 将数据传递给 Gearman 作业,或者使用 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'

我不想深入研究 pusher-client gem 并弄清楚为什么会发生这种情况。我只是想继续前进,所以我很想使用rescue Exception. 我正在保存 Pusher 为下游逻辑和操作提供的数据。数据正在快速移动,我可以确定该作业是否真的到达了 Gearman,可能会错过下一次更新或延迟它,或者我可以简单地将当前存储的数据标记为过时/无效并等待来自 Pusher 的下一次更新。我的偏好是将其标记为陈旧/无效并等待。

我读过“为什么在 Ruby 中 `rescue Exception => e` 是一种不好的风格? ”并且知道这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在这种情况下使用是否安全?是否有一些我可以使用的异常子集来代替我丢失的?我可能忽略了任何更好的建议或陷阱?

4

1 回答 1

0

您应该只挽救实际引发的错误。在这种情况下Gearman::ProtocolError引发错误。所以使用:

rescue Gearman::ProtocolError
于 2014-06-30T19:33:42.883 回答