Re: asynchronous execution, was Re: implementing a set of queue-processing servers

[email protected] (Bas A . Schulte) Tue, 26 Nov 2002 10:04:32 +0100
Newsgroups perl.p5ee
Message-ID <[email protected]>
Hi all,

On Tuesday, November 19, 2002, at 11:09 PM, Perrin Harkins wrote:

> 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've implemented the exact thing Perrin describes in our SMS game 
platform (read a bit about it here: 
http://perl.apache.org/outstanding/success_stories/sms_server.html).

When synchronous requests come in that trigger some event that has to 
take place in the future *and* that runs in the same Apache server 
instance, I have an external (simple) daemon that reads timer events 
from a shared database table and posts HTTP requests to the Apache 
server instance.

The reason I did it like this is that I can easily (not to mention 
quickly) run perl code in Apache *and* it is quite a stable server, much 
more stable than something I could whip out in perl. I did try some perl 
preforking server code (from Lincoln D. Stein's book and 
Net::Server::PreFork as well as some self-programmed stuff) but none of 
them seemed to be stable/fast under heavy load even though I would have 
preferred that as it would allow me to do something to handle 
data-sharing between children via the parent which always seems to be in 
issue in Apache/mod_perl.

The only thing that now and then is problematic is that Apache child 
processes in which my perl code runs are not easily coordinated (at 
least I still haven't found a good way). So this situation (from 
Stephen's mail):

> We have a fixed number of mainframe login id's, so we can only run a
> limited number (say 4) of them at a time.

still is something I haven't figured out. Basically, I need some way to 
coordinate the children so each child can find out what the other 
children are doing.

BTW: I've been reading up a lot on J2EE lately and it appears more and 
more that a J2EE app server could quite nicely provide for my needs 
(despite all shortcomings and issues of course). Now if there only was a 
P5EE app server ;)

Regards,

Bas.