2014-06-30 2 views
0

웹 사이트 (실시간 데이터 근처)에서 Pusher를 받기 위해 pusher-client gem을 사용하려고합니다. 그러나 스크립트는 많이 죽는 경향이 있습니다.보석 오류를 극복하기위한 구조 예외?

푸셔 데이터를 내 화면에 게시하면 클라이언트가 실행되도록 신경 쓰는 한 클라이언트가 실행됩니다. 그러나, 파일에 Pusher 데이터를 저장하거나 gearman gem을 사용하여 Gearman 작업에 데이터를 전달하거나 dalli gem을 사용하여 Memcache에 데이터를 저장하면 클라이언트 스크립트가 충돌합니다.

내 서버에 어떤 방식 으로든 과부하가 걸리지 않습니다. 그것은 8 개의 코어와 24GB의 RAM을 가지고 있습니다. 일반적으로 단일 코어는 100 %가 아니며 언제든지 6 개만 사용할 수 있으며 RAM은 12GB를 초과하여 사용하지 않습니다.

현재 클라이언트 스크립트의 생성자가 데이터를 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의 다음 업데이트를 기다리는 지 여부를 결정할 수 있습니다. 내 취향은 부실/무효로 표시하고 기다리는 것입니다.

나는 "Why is it a bad style to `rescue Exception => e` in Ruby?"을 읽었으며 rescue Exception은 나쁜 습관임을 알고 있습니다. 그러나 코드에서 버그를 은폐하기 위해이 작업을 수행하지 않습니다. 오류가 발생했을 때 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 

코드의 전체가 분하지 않을 경우에 잘 실행 : 여기

Ubuntu 12.04 
RVM and Ruby 2.1.1 

는 Gearman을 작업 서버에 하트 비트 작업 부하를 보내는 일부 샘플 코드 실패하기 몇 시간 전에. 특히 rescue 이후의 코드를 제외한 모든 코드 행은 handle_job_created 오류 이전에 반복적으로 실행됩니다.

따라서이 경우 rescue Exception을 사용해도 안전합니까? 내가 누락 된 대신 사용할 수있는 예외의 하위 집합이 있습니까? 내가 간과 해 버린 더 좋은 제안이나 잡았다?

답변

0

실제로 발생한 오류 만 해결해야합니다. 이 경우 Gearman::ProtocolErrorerror being raised입니다. 따라서 다음을 사용하십시오.

rescue Gearman::ProtocolError 
+0

더 나은 솔루션 인 것 같습니다. 대답으로 표시하기 전에 테스트 해보고 싶습니다. Gearman : ProtocolError를 어떻게 결정 했습니까? 나는 내가 제공 한 오류 라인에서 그것을 보지 못한다. 내가 뭐 놓친 거 없니? –

+0

@gabe, 나는 내 대답에 github에 라인에 연결되어 있습니다. 여기 제기 된 곳은 https://github.com/gearman-ruby/gearman-ruby/blob/master/lib/gearman/taskset.rb#L99이며 여기에 오류 클래스 정의 https://github.com/gearman이 있습니다. -ruby/gearman-ruby/blob/master/lib/gearman.rb # L70-L71 – infused

+0

내 푸시 클라이언트 스크립트가 12 시간 이상 실행되었습니다. 다른 어떤 시간보다 더 좋습니다. 나는 당신이 오류가 무엇인지 알아 낸 방법을 알고 싶었습니다. 그래서 나는 미래에 그것을 찾을 수있었습니다. 감사 –