웹 사이트 (실시간 데이터 근처)에서 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
을 사용해도 안전합니까? 내가 누락 된 대신 사용할 수있는 예외의 하위 집합이 있습니까? 내가 간과 해 버린 더 좋은 제안이나 잡았다?
더 나은 솔루션 인 것 같습니다. 대답으로 표시하기 전에 테스트 해보고 싶습니다. Gearman : ProtocolError를 어떻게 결정 했습니까? 나는 내가 제공 한 오류 라인에서 그것을 보지 못한다. 내가 뭐 놓친 거 없니? –
@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
내 푸시 클라이언트 스크립트가 12 시간 이상 실행되었습니다. 다른 어떤 시간보다 더 좋습니다. 나는 당신이 오류가 무엇인지 알아 낸 방법을 알고 싶었습니다. 그래서 나는 미래에 그것을 찾을 수있었습니다. 감사 –