RPC/RMI in Perl
Kaoru
kaoru at slackwise.net
Tue Oct 14 16:47:37 BST 2008
Hey guys,
I've been looking through CPAN for some sort of RPC/RMI (Remote
Procedure Call/Remote Method Invocation) module that will let us pass
objects and data structures from machine to machine via network
connections. We're looking for something similar to the regular
client-server module, except the client and server need to be able to
pass objects around and maintain state. So far I've tried the
following:
* Event::RPC
So close, but unfortunately it doesn't seem to pass objects around
quite how I was hoping. Whenever an object on the server side returns
an object to the client it instead creates the new object as a new
_remote_ object, which unfortunately makes it difficult to access
internal data stored in that object. In the case I was trying the
object returned stored data like so:
sub new { bless { 'var' => '' }, shift }
sub var {
my $self = shift;
my $var = shift;
if ($var) {
$self->{'var'} = $var;
}
return $self->{'var'};
}
Which didn't work because when you call $remote_object->var("new
value"); the scalar passed into var() is _not_ the object but the
handle to the object, ie it looked like this:
bless( do{\(my $o = 'Name::Of::Module=HASH(0xbce5a0)')}, 'Name::Of::Module' );
not this:
bless( { 'var' => '' }, 'Name::Of::Module' );
I think the "make the object on the server side and pass back a
handle" is close to what Java RMI does, but it seems broken in Perl.
* RPC::Serialized
Again pretty close. This passes objects around using the
Data::Serializer module and uses Net::Server for its network
connections, seems very customisable. Unfortunately it also has
trouble keeping state since it uses the Net::Server::PreFork
"personality"... State is kept fine as long as you keep talking to the
same process, but the second you switch to a different process all
your state is lost. I might end up using this with only one (zero?)
forked process and see how that goes.
* GRID::Machine
Calls over SSH and passes all the code from the client to the
server(s) in string form. Not really what we're looking for.
---------
Is there anything obvious I'm missing? Is there a book out there on
RPC/RMI in Perl? Any hint and tips would be greatly appreciated :)
Thanks in advance,
- Alex
More information about the london.pm
mailing list