Stephen Weiss
2008-Mar-25 17:17 UTC
[Backgroundrb-devel] extending bdrb / running multiple servers
Hi, Thanks for the help getting the new backgroundrb working, things are working fabulously now. I have two questions: 1) I have a few basic methods I need available on all my workers in order to communicate properly with my application... it seems to make the most sense right now to subclass BackgrounDRb::MetaWorker, or make a mixin module, because I''m actually extending some of the base methods as well (like the exit method, which I have extended to update status information in a central queue monitor). Is there a proper place to put in custom code that extends BackgrounDrb, so that it is automatically loaded by the server before the workers are instantiated (sort of like an environment.rb)? 2) I have one application server that runs Rails and does all the user interface, but several (10+) servers running backgroundrb to do all the heavy lifting (we do a lot of hi-res image processing, requires many CPU''s). I have a central monitor that monitors what servers are available to run which tasks, and load balances the tasks across all the available backgroundrb servers, instantiating a MiddleMan for the correct server and then sending the job request to that server. Needless to say, this process is going a lot easier with the new version, except for one catch. With the old backgroundrb, I was able to connect to an arbitrary server like this: thisMiddleMan = DRbObject.new(nil, "druby://#{server_name}:22223"); Now this doesn''t work. So, I took a look at BackgrounDRb::WorkerProxy, and it seems like it can only connect to the server listed in the config file. Is there supposed to be a way to manage multiple backgroundrb servers? I''ve read the manual, it''s not in there. My solution so far is to subclass WorkerProxy, with a new init method that takes the host and port as parameters: class BackgrounDRb::CustomProxy < BackgrounDRb::WorkerProxy def self.init(ip, port) @@config = BackgrounDRb::Config.read_config("#{BACKGROUNDRB_ROOT}/ config/backgroundrb.yml") @@server_ip = ip @@server_port = port new end end But this doesn''t seem very elegant to me, I worry about future software updates... Is there a clean method for doing this or is this just not supported (yet)? Thanks for any insight, really appreciate it! -- Steve
hemant
2008-Mar-25 22:27 UTC
[Backgroundrb-devel] extending bdrb / running multiple servers
On Tue, Mar 25, 2008 at 10:47 PM, Stephen Weiss <sweiss at stylesight.com> wrote:> Hi, > > Thanks for the help getting the new backgroundrb working, things are > working fabulously now. > > I have two questions: > > 1) I have a few basic methods I need available on all my workers in > order to communicate properly with my application... it seems to make > the most sense right now to subclass BackgrounDRb::MetaWorker, or make > a mixin module, because I''m actually extending some of the base > methods as well (like the exit method, which I have extended to update > status information in a central queue monitor). Is there a proper > place to put in custom code that extends BackgrounDrb, so that it is > automatically loaded by the server before the workers are instantiated > (sort of like an environment.rb)?For the time being, you can put that file in lib folder of your rails application and require that file in environment.rb.> > 2) I have one application server that runs Rails and does all the > user interface, but several (10+) servers running backgroundrb to do > all the heavy lifting (we do a lot of hi-res image processing, > requires many CPU''s). I have a central monitor that monitors what > servers are available to run which tasks, and load balances the tasks > across all the available backgroundrb servers, instantiating a > MiddleMan for the correct server and then sending the job request to > that server. Needless to say, this process is going a lot easier with > the new version, except for one catch. With the old backgroundrb, I > was able to connect to an arbitrary server like this: > > thisMiddleMan = DRbObject.new(nil, "druby://#{server_name}:22223"); > > Now this doesn''t work. So, I took a look at > BackgrounDRb::WorkerProxy, and it seems like it can only connect to > the server listed in the config file. Is there supposed to be a way > to manage multiple backgroundrb servers? I''ve read the manual, it''s > not in there. My solution so far is to subclass WorkerProxy, with a > new init method that takes the host and port as parameters: > > class BackgrounDRb::CustomProxy < BackgrounDRb::WorkerProxy > def self.init(ip, port) > @@config = BackgrounDRb::Config.read_config("#{BACKGROUNDRB_ROOT}/ > config/backgroundrb.yml") > @@server_ip = ip > @@server_port = port > new > end > end > > But this doesn''t seem very elegant to me, I worry about future > software updates... Is there a clean method for doing this or is this > just not supported (yet)? >Since, each connection to BackgrounDRb server is nothing but a plain tcp socket connection. Now, before composing a reply to your message, I actually committed a little code change, which allows you do do: Loading development environment (Rails 2.0.2) server ip: 0.0.0.0 11006>> foo = BackgrounDRb::WorkerProxy.custom_connection("localhost",11006)server ip: localhost 11006 => #<BackgrounDRb::WorkerProxy:0xb7477e14 @mutex=#<Mutex:0xb7477dec>, @connection_status=true, @connection=#<TCPSocket:0xb7477ce8>>>> foo=> #<BackgrounDRb::WorkerProxy:0xb7477e14 @mutex=#<Mutex:0xb7477dec>, @connection_status=true, @connection=#<TCPSocket:0xb7477ce8>>>> foo.all_worker_info=> [{:job_key=>"", :status=>:running, :worker=>:log_worker}]>> foo.query_all_worker_infoNoMethodError: undefined method `query_all_worker_info'' for #<BackgrounDRb::WorkerProxy:0xb7477e14> from (irb):4>> foo.query_all_workers=> {:log_worker=>nil} So, update the code from git and use it. I hope this helps.