Распределение рабочей нагрузки resque несправедливо - PullRequest
1 голос
/ 02 марта 2011

У меня есть задание Resque, поддерживаемое ActiveRecord, которое сохраняет сообщение в базу данных. Работают 7 рабочих экземпляров. Я отправляю 20 тысяч записей в мою заявку на Синатру. Когда я запрашиваю базу данных redis, я вижу следующие результаты ...

redis> get resque:stat:processed:localhost:6929:default
"5696"
redis> get resque:stat:processed:localhost:6930:default
"1"
redis> get resque:stat:processed:localhost:6942:default
"1"
redis> get resque:stat:processed:localhost:6953:default
"10854"
redis> get resque:stat:processed:localhost:6959:default
"3446"
redis> get resque:stat:processed:localhost:6972:default
"1"
redis> get resque:stat:processed:localhost:6986:default
"1"

Может кто-нибудь прокомментировать, пожалуйста? 4 из 7 рабочих обработали только 1 работу за свою жизнь

1 Ответ

1 голос
/ 09 марта 2011

Наконец понял, когда я заменил ActiveRecord на RDBI.Я получал следующую ошибку, когда мои работники пытались подключиться к базе данных оракула

java.sql.SQLRecoverableException: I/O Exception: Connection reset
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:281)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:118)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:224)

После поиска в Google я наткнулся на этот пост http://kr.forums.oracle.com/forums/thread.jspa?messageID=3793101.Итак, я решил передать опцию -Djava.security.egd = file: /// dev / urandom в мой jvm.Я отредактировал настройки в параметрах jvm Glassfish, но это не сработало, поскольку эти настройки принесли пользу моему приложению sinatra, но не работникам resque, работающим в фоновом режиме.

Итак, мне пришлось запустить работников resque, передав jvmаргумент.Я написал грабли, чтобы сделать то же самое.

desc "Start multiple workers for JRUBY production environment which ocnnects to oracle database"
task :start_workers => :setup do

threads = []

ENV['COUNT'].to_i.times do
  threads << Thread.new do
    system "/usr/bin/java -Djdk.home= -Djava.security.egd=file:///dev/urandom -Djruby.home=/usr/local/rvm/rubies/jruby-1.6.0 -Djruby.script=jruby -Djruby.shell=/bin/bash -Djffi.boot.library.path=/usr/local/rvm/rubies/jruby-1.6.0/lib/native/ppc-Linux:/usr/local/rvm/rubies/jruby-1.6.0/lib/native/i386-Linux:/usr/local/rvm/rubies/jruby-1.6.0/lib/native/x86_64-Linux -Xmx500m -Xss1024k -Djruby.memory.max=500m -Djruby.stack.max=1024k -Dsun.java.command=org.jruby.Main -Djava.class.path=/usr/local/rvm/rubies/jruby-1.6.0/lib/mysql-connector-java-5.0.6-bin.jar:/usr/local/rvm/rubies/jruby-1.6.0/lib/ojdbc6.jar:/usr/local/rvm/rubies/jruby-1.6.0/lib/sqlitejdbc-v056.jar: -Xbootclasspath/a:/usr/local/rvm/rubies/jruby-1.6.0/lib/jruby.jar org/jruby/Main /usr/local/rvm/gems/jruby-1.6.0/bin/rake resque:work RACK_ENV=#{ENV['RACK_ENV']} QUEUE=#{ENV['QUEUE']} INTERVAL=#{ENV['INTERVAL']}"
  end
end

threads.each { |thread| thread.join }

end
...