Re: asynchronous execution, was Re: implementing a set of queue-processing servers
[email protected] (Perrin Harkins) Tue, 19 Nov 2002 17:09:29 -0500
| Newsgroups | perl.p5ee |
|---|---|
| Message-ID | <[email protected]> |
Stephen Adkins wrote: > So what I think you are saying for option 2 is: > > * Apache children (web server processes with mod_perl) have two > personalities: > - user request processors > - back-end work processors > * When a user submits work to the queue, the child is acting in a > "user request" role and it returns the response quickly. > * After detaching from the user, however, it checks to see if fewer > than four children are processing the queue and if so, it logs into > the mainframe and starts processing the queue. > * When it finishes the request, it continues to work the queue until > no more work is available, at which time, it quits its "back-end > processor" personality and returns to wait for another HTTP request. > > > This just seems a bit odd (and unnecessarily complex). It does when you put it like that, but it doesn't have to be that way. I would separate the input (user or queue) from the processing part. You'd have a module that runs in mod_perl which knows how to process requests. You have a separate module which can provide a UI for placing requests. Synchronous ones go straight to processing, while asynch ones get added to the queue. You'd also have a controlling process that polls the queue and if it finds anything it uses LWP to send it to mod_perl for handling. I would make this a tiny script triggered from cron if possible, since cron is robust and can handle outages and error reporting nicely. > Why not let there be web server processes and queue worker processes > and they each do their own job? Web servers seem to me to be for > synchronous activity, where the user is waiting for the results. When I think of queue processing, I think of a system for handling tasks in parallel that provides a simple API for plugging in logic, a well-defined control interface, logging, easy configuration... sounds like Apache to me. You just need a tiny control process to trigger it via LWP. Apache is already a system for handling a queue of HTTP requests in parallel, so you just have to make your requests look like HTTP. You certainly could do this other ways, but you'd probably have to write a lot more code or else use something far less reliable than Apache. > P.S. Another limitation of the "use Apache servers for all server > processing" > philosophy seems to be scheduled events or system events (those not > initiated by an HTTP request, which are user events). Cron/at + LWP. - Perrin