Bas A.Schulte wrote:
I don't want to use a database table for the sole purpose of sharing data, I mean, I run the Apache/mod_perl servers to handle different components of our system, some run on top of a database and some of them don't.
The thing is, if you need to share data reliably on a cluster of machines your choices are basically a database or NFS, and I suspect MySQL will be more effective than NFS in many cases.

I have been looking at some of the IPC::Share* modules, the one I think I can use is (not sure here) IPC::ShareLite, but that darned thing won't install on my dev. machine (iBook/OS X) so I've been postponing things a bit ;)
That will be slow. All of the shared-memory modules are slow except IPC::MM. They're probably slower than using a database in most cases. File-based ones like MLDBM::Sync are faster.

- what is a given child doing (to do things like: ok, I'm currently pushing data to some client in 5 children, and I don't want to have another child do this now so stuff this task in a queue somehere so I can process it later);
To keep track of what other processes are doing, you need to have them make entries in a shared data structure. IPC::MM would be good for this.

If you want to make a queue, and it needs to be robust (i.e. survive server crashes), I'd suggest using MLDBM::Sync or a RDBMS.

- application state. This is domain-specific so it's a bit hard to explain what I mean. I need serialized and *fast* access to this info so I would prefer not having this in my database.
The modules I mentioned above are generally your best bet.

NB: I posted a question on the first issue (look for "IPC suggestions sought/talking between children?" somewhere in the mod_perl mailinglist, I never seem to recall the proper archive site for it), didn't get any feedback on it as it probably goes beyond what someone would normally want from a web server.
That would be here:
http://marc.theaimsgroup.com/?l=apache-modperl&m=103538774616838&w=2

You could implement this with IPC::MM. It supports a hash structure, so you could make a hash with keys for the active clients to track how many are active for each client.

Again; I don't know exactly but when I read stuff about entity-, session- and message beans, JMS etc., it has a lot of resemblance with what I'm currently doing "by hand" i.e. implement functionality like that on top of a "bare" Apache/mod_perl server.
You'd have to be more specific, but in my experience people generally should not use Enterprise Java Beans unless they are doing something foolish like transactions across two databases. I think you're overestimating their value for common projects. If you just want a good way to do object persistence in an RDBMS, this isn't it.

A good example would be JMS: you get this "for free" (with JBoss anyway ;)) in a J2EE app. server but there's no obvious choice for us perl guys.
It kind of depends on what you want to use it for. If you want very safe message-passing, I would look at MQ Series. If you just want to have a queue, there's no need for messaging at all. If you want to pass asynchronous messages reliably between parts of a distributed system, you might get everything you need from qmail and something like Mail::Audit that can hand off incoming messages to a Perl program.

BTW: with the issue on data-sharing: the same thing: I have raw metal (Apache/mod_perl and IPC:MM) and need to implement an API on top of them before I have the needed functionality. Again I'm building stuff again before I can solve my actual business problems.
I think you are vastly over-estimating how much effort JMS/EJB/etc. would save you. The code that implements tracking what children are doing on top of IPC::MM is not much different from the code that would implement the same thing in Java threads. General-purpose APIs like JMS can't solve specific problems for you.

- Perrin

Reply via email to