ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.47
Committed: Thu Aug 13 01:57:10 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.46: +3 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::MP - multi-processing/message-passing framework
4    
5     =head1 SYNOPSIS
6    
7     use AnyEvent::MP;
8    
9 root 1.22 $NODE # contains this node's noderef
10     NODE # returns this node's noderef
11     NODE $port # returns the noderef of the port
12 root 1.2
13 root 1.38 $SELF # receiving/own port id in rcv callbacks
14    
15     # ports are message endpoints
16    
17     # sending messages
18 root 1.2 snd $port, type => data...;
19 root 1.38 snd $port, @msg;
20     snd @msg_with_first_element_being_a_port;
21 root 1.2
22 root 1.38 # miniports
23     my $miniport = port { my @msg = @_; 0 };
24 root 1.22
25 root 1.38 # full ports
26     my $port = port;
27     rcv $port, smartmatch => $cb->(@msg);
28     rcv $port, ping => sub { snd $_[0], "pong"; 0 };
29     rcv $port, pong => sub { warn "pong received\n"; 0 };
30 root 1.2
31 root 1.38 # remote ports
32     my $port = spawn $node, $initfunc, @initdata;
33 root 1.2
34     # more, smarter, matches (_any_ is exported by this module)
35     rcv $port, [child_died => $pid] => sub { ...
36     rcv $port, [_any_, _any_, 3] => sub { .. $_[2] is 3
37    
38 root 1.35 # monitoring
39     mon $port, $cb->(@msg) # callback is invoked on death
40     mon $port, $otherport # kill otherport on abnormal death
41     mon $port, $otherport, @msg # send message on death
42    
43 root 1.45 =head1 CURRENT STATUS
44    
45     AnyEvent::MP - stable API, should work
46     AnyEvent::MP::Intro - outdated
47     AnyEvent::MP::Kernel - WIP
48     AnyEvent::MP::Transport - mostly stable
49    
50     stay tuned.
51    
52 root 1.1 =head1 DESCRIPTION
53    
54 root 1.2 This module (-family) implements a simple message passing framework.
55    
56     Despite its simplicity, you can securely message other processes running
57     on the same or other hosts.
58    
59 root 1.23 For an introduction to this module family, see the L<AnyEvent::MP::Intro>
60     manual page.
61    
62     At the moment, this module family is severly broken and underdocumented,
63 root 1.21 so do not use. This was uploaded mainly to reserve the CPAN namespace -
64 root 1.45 stay tuned!
65 root 1.6
66 root 1.2 =head1 CONCEPTS
67    
68     =over 4
69    
70     =item port
71    
72 root 1.29 A port is something you can send messages to (with the C<snd> function).
73    
74     Some ports allow you to register C<rcv> handlers that can match specific
75     messages. All C<rcv> handlers will receive messages they match, messages
76     will not be queued.
77 root 1.2
78 root 1.3 =item port id - C<noderef#portname>
79 root 1.2
80 root 1.29 A port id is normaly the concatenation of a noderef, a hash-mark (C<#>) as
81     separator, and a port name (a printable string of unspecified format). An
82 root 1.30 exception is the the node port, whose ID is identical to its node
83 root 1.29 reference.
84 root 1.2
85     =item node
86    
87     A node is a single process containing at least one port - the node
88 root 1.29 port. You can send messages to node ports to find existing ports or to
89     create new ports, among other things.
90 root 1.2
91 root 1.29 Nodes are either private (single-process only), slaves (connected to a
92     master node only) or public nodes (connectable from unrelated nodes).
93 root 1.2
94 root 1.5 =item noderef - C<host:port,host:port...>, C<id@noderef>, C<id>
95 root 1.2
96 root 1.29 A node reference is a string that either simply identifies the node (for
97     private and slave nodes), or contains a recipe on how to reach a given
98 root 1.2 node (for public nodes).
99    
100 root 1.29 This recipe is simply a comma-separated list of C<address:port> pairs (for
101     TCP/IP, other protocols might look different).
102    
103     Node references come in two flavours: resolved (containing only numerical
104     addresses) or unresolved (where hostnames are used instead of addresses).
105    
106     Before using an unresolved node reference in a message you first have to
107     resolve it.
108    
109 root 1.2 =back
110    
111 root 1.3 =head1 VARIABLES/FUNCTIONS
112 root 1.2
113     =over 4
114    
115 root 1.1 =cut
116    
117     package AnyEvent::MP;
118    
119 root 1.44 use AnyEvent::MP::Kernel;
120 root 1.2
121 root 1.1 use common::sense;
122    
123 root 1.2 use Carp ();
124    
125 root 1.1 use AE ();
126    
127 root 1.2 use base "Exporter";
128    
129 root 1.44 our $VERSION = $AnyEvent::MP::Kernel::VERSION;
130 root 1.43
131 root 1.8 our @EXPORT = qw(
132 root 1.22 NODE $NODE *SELF node_of _any_
133 root 1.31 resolve_node initialise_node
134 root 1.38 snd rcv mon kil reg psub spawn
135 root 1.22 port
136 root 1.8 );
137 root 1.2
138 root 1.22 our $SELF;
139    
140     sub _self_die() {
141     my $msg = $@;
142     $msg =~ s/\n+$// unless ref $msg;
143     kil $SELF, die => $msg;
144     }
145    
146     =item $thisnode = NODE / $NODE
147    
148     The C<NODE> function returns, and the C<$NODE> variable contains
149     the noderef of the local node. The value is initialised by a call
150     to C<become_public> or C<become_slave>, after which all local port
151     identifiers become invalid.
152    
153 root 1.33 =item $noderef = node_of $port
154 root 1.22
155     Extracts and returns the noderef from a portid or a noderef.
156    
157 root 1.34 =item initialise_node $noderef, $seednode, $seednode...
158    
159     =item initialise_node "slave/", $master, $master...
160    
161     Before a node can talk to other nodes on the network it has to initialise
162     itself - the minimum a node needs to know is it's own name, and optionally
163     it should know the noderefs of some other nodes in the network.
164    
165     This function initialises a node - it must be called exactly once (or
166     never) before calling other AnyEvent::MP functions.
167    
168     All arguments are noderefs, which can be either resolved or unresolved.
169    
170     There are two types of networked nodes, public nodes and slave nodes:
171    
172     =over 4
173    
174     =item public nodes
175    
176     For public nodes, C<$noderef> must either be a (possibly unresolved)
177     noderef, in which case it will be resolved, or C<undef> (or missing), in
178     which case the noderef will be guessed.
179    
180     Afterwards, the node will bind itself on all endpoints and try to connect
181     to all additional C<$seednodes> that are specified. Seednodes are optional
182     and can be used to quickly bootstrap the node into an existing network.
183    
184     =item slave nodes
185    
186     When the C<$noderef> is the special string C<slave/>, then the node will
187     become a slave node. Slave nodes cannot be contacted from outside and will
188     route most of their traffic to the master node that they attach to.
189    
190     At least one additional noderef is required: The node will try to connect
191     to all of them and will become a slave attached to the first node it can
192     successfully connect to.
193    
194     =back
195    
196     This function will block until all nodes have been resolved and, for slave
197     nodes, until it has successfully established a connection to a master
198     server.
199    
200     Example: become a public node listening on the default node.
201    
202     initialise_node;
203    
204     Example: become a public node, and try to contact some well-known master
205     servers to become part of the network.
206    
207     initialise_node undef, "master1", "master2";
208    
209     Example: become a public node listening on port C<4041>.
210    
211     initialise_node 4041;
212    
213     Example: become a public node, only visible on localhost port 4044.
214    
215     initialise_node "locahost:4044";
216    
217     Example: become a slave node to any of the specified master servers.
218    
219     initialise_node "slave/", "master1", "192.168.13.17", "mp.example.net";
220    
221 root 1.29 =item $cv = resolve_node $noderef
222    
223     Takes an unresolved node reference that may contain hostnames and
224     abbreviated IDs, resolves all of them and returns a resolved node
225     reference.
226    
227     In addition to C<address:port> pairs allowed in resolved noderefs, the
228     following forms are supported:
229    
230     =over 4
231    
232     =item the empty string
233    
234     An empty-string component gets resolved as if the default port (4040) was
235     specified.
236    
237     =item naked port numbers (e.g. C<1234>)
238    
239     These are resolved by prepending the local nodename and a colon, to be
240     further resolved.
241    
242     =item hostnames (e.g. C<localhost:1234>, C<localhost>)
243    
244     These are resolved by using AnyEvent::DNS to resolve them, optionally
245     looking up SRV records for the C<aemp=4040> port, if no port was
246     specified.
247    
248     =back
249    
250 root 1.22 =item $SELF
251    
252     Contains the current port id while executing C<rcv> callbacks or C<psub>
253     blocks.
254 root 1.3
255 root 1.22 =item SELF, %SELF, @SELF...
256    
257     Due to some quirks in how perl exports variables, it is impossible to
258     just export C<$SELF>, all the symbols called C<SELF> are exported by this
259     module, but only C<$SELF> is currently used.
260 root 1.3
261 root 1.33 =item snd $port, type => @data
262 root 1.3
263 root 1.33 =item snd $port, @msg
264 root 1.3
265 root 1.8 Send the given message to the given port ID, which can identify either
266     a local or a remote port, and can be either a string or soemthignt hat
267     stringifies a sa port ID (such as a port object :).
268    
269     While the message can be about anything, it is highly recommended to use a
270     string as first element (a portid, or some word that indicates a request
271     type etc.).
272 root 1.3
273     The message data effectively becomes read-only after a call to this
274     function: modifying any argument is not allowed and can cause many
275     problems.
276    
277     The type of data you can transfer depends on the transport protocol: when
278     JSON is used, then only strings, numbers and arrays and hashes consisting
279     of those are allowed (no objects). When Storable is used, then anything
280     that Storable can serialise and deserialise is allowed, and for the local
281     node, anything can be passed.
282    
283 root 1.22 =item $local_port = port
284 root 1.2
285 root 1.31 Create a new local port object that can be used either as a pattern
286     matching port ("full port") or a single-callback port ("miniport"),
287     depending on how C<rcv> callbacks are bound to the object.
288 root 1.3
289 root 1.33 =item $port = port { my @msg = @_; $finished }
290 root 1.10
291 root 1.33 Creates a "miniport", that is, a very lightweight port without any pattern
292     matching behind it, and returns its ID. Semantically the same as creating
293     a port and calling C<rcv $port, $callback> on it.
294 root 1.15
295     The block will be called for every message received on the port. When the
296     callback returns a true value its job is considered "done" and the port
297     will be destroyed. Otherwise it will stay alive.
298    
299 root 1.17 The message will be passed as-is, no extra argument (i.e. no port id) will
300 root 1.15 be passed to the callback.
301    
302     If you need the local port id in the callback, this works nicely:
303    
304 root 1.31 my $port; $port = port {
305 root 1.15 snd $otherport, reply => $port;
306     };
307 root 1.10
308     =cut
309    
310 root 1.33 sub rcv($@);
311    
312 root 1.22 sub port(;&) {
313     my $id = "$UNIQ." . $ID++;
314     my $port = "$NODE#$id";
315    
316     if (@_) {
317 root 1.33 rcv $port, shift;
318 root 1.22 } else {
319 root 1.33 $PORT{$id} = sub { }; # nop
320 root 1.22 }
321 root 1.10
322 root 1.22 $port
323 root 1.10 }
324    
325 root 1.33 =item reg $port, $name
326 root 1.8
327 root 1.36 =item reg $name
328    
329     Registers the given port (or C<$SELF><<< if missing) under the name
330     C<$name>. If the name already exists it is replaced.
331 root 1.8
332 root 1.22 A port can only be registered under one well known name.
333 root 1.8
334 root 1.22 A port automatically becomes unregistered when it is killed.
335 root 1.8
336     =cut
337    
338 root 1.22 sub reg(@) {
339 root 1.36 my $port = @_ > 1 ? shift : $SELF || Carp::croak 'reg: called with one argument only, but $SELF not set,';
340 root 1.8
341 root 1.36 $REG{$_[0]} = $port;
342 root 1.22 }
343 root 1.18
344 root 1.33 =item rcv $port, $callback->(@msg)
345 root 1.31
346 root 1.33 Replaces the callback on the specified miniport (after converting it to
347     one if required).
348 root 1.31
349 root 1.33 =item rcv $port, tagstring => $callback->(@msg), ...
350 root 1.3
351 root 1.33 =item rcv $port, $smartmatch => $callback->(@msg), ...
352 root 1.3
353 root 1.33 =item rcv $port, [$smartmatch...] => $callback->(@msg), ...
354 root 1.3
355 root 1.32 Register callbacks to be called on matching messages on the given full
356 root 1.36 port (after converting it to one if required) and return the port.
357 root 1.3
358     The callback has to return a true value when its work is done, after
359     which is will be removed, or a false value in which case it will stay
360     registered.
361    
362 root 1.33 The global C<$SELF> (exported by this module) contains C<$port> while
363 root 1.22 executing the callback.
364    
365 root 1.38 Runtime errors during callback execution will result in the port being
366 root 1.22 C<kil>ed.
367    
368 root 1.3 If the match is an array reference, then it will be matched against the
369     first elements of the message, otherwise only the first element is being
370     matched.
371    
372     Any element in the match that is specified as C<_any_> (a function
373     exported by this module) matches any single element of the message.
374    
375     While not required, it is highly recommended that the first matching
376     element is a string identifying the message. The one-string-only match is
377     also the most efficient match (by far).
378    
379 root 1.36 Example: create a port and bind receivers on it in one go.
380    
381     my $port = rcv port,
382     msg1 => sub { ...; 0 },
383     msg2 => sub { ...; 0 },
384     ;
385    
386     Example: create a port, bind receivers and send it in a message elsewhere
387     in one go:
388    
389     snd $otherport, reply =>
390     rcv port,
391     msg1 => sub { ...; 0 },
392     ...
393     ;
394    
395 root 1.3 =cut
396    
397     sub rcv($@) {
398 root 1.33 my $port = shift;
399     my ($noderef, $portid) = split /#/, $port, 2;
400 root 1.3
401 root 1.22 ($NODE{$noderef} || add_node $noderef) == $NODE{""}
402 root 1.33 or Carp::croak "$port: rcv can only be called on local ports, caught";
403 root 1.22
404 root 1.33 if (@_ == 1) {
405     my $cb = shift;
406     delete $PORT_DATA{$portid};
407     $PORT{$portid} = sub {
408     local $SELF = $port;
409     eval {
410     &$cb
411     and kil $port;
412     };
413     _self_die if $@;
414     };
415     } else {
416     my $self = $PORT_DATA{$portid} ||= do {
417     my $self = bless {
418     id => $port,
419     }, "AnyEvent::MP::Port";
420    
421     $PORT{$portid} = sub {
422     local $SELF = $port;
423    
424     eval {
425     for (@{ $self->{rc0}{$_[0]} }) {
426     $_ && &{$_->[0]}
427     && undef $_;
428     }
429    
430     for (@{ $self->{rcv}{$_[0]} }) {
431     $_ && [@_[1 .. @{$_->[1]}]] ~~ $_->[1]
432     && &{$_->[0]}
433     && undef $_;
434     }
435    
436     for (@{ $self->{any} }) {
437     $_ && [@_[0 .. $#{$_->[1]}]] ~~ $_->[1]
438     && &{$_->[0]}
439     && undef $_;
440     }
441     };
442     _self_die if $@;
443     };
444    
445     $self
446     };
447 root 1.22
448 root 1.33 "AnyEvent::MP::Port" eq ref $self
449     or Carp::croak "$port: rcv can only be called on message matching ports, caught";
450 root 1.22
451 root 1.33 while (@_) {
452     my ($match, $cb) = splice @_, 0, 2;
453    
454     if (!ref $match) {
455     push @{ $self->{rc0}{$match} }, [$cb];
456     } elsif (("ARRAY" eq ref $match && !ref $match->[0])) {
457     my ($type, @match) = @$match;
458     @match
459     ? push @{ $self->{rcv}{$match->[0]} }, [$cb, \@match]
460     : push @{ $self->{rc0}{$match->[0]} }, [$cb];
461     } else {
462     push @{ $self->{any} }, [$cb, $match];
463     }
464 root 1.22 }
465 root 1.3 }
466 root 1.31
467 root 1.33 $port
468 root 1.2 }
469    
470 root 1.22 =item $closure = psub { BLOCK }
471 root 1.2
472 root 1.22 Remembers C<$SELF> and creates a closure out of the BLOCK. When the
473     closure is executed, sets up the environment in the same way as in C<rcv>
474     callbacks, i.e. runtime errors will cause the port to get C<kil>ed.
475    
476     This is useful when you register callbacks from C<rcv> callbacks:
477    
478     rcv delayed_reply => sub {
479     my ($delay, @reply) = @_;
480     my $timer = AE::timer $delay, 0, psub {
481     snd @reply, $SELF;
482     };
483     };
484 root 1.3
485 root 1.8 =cut
486 root 1.3
487 root 1.22 sub psub(&) {
488     my $cb = shift;
489 root 1.3
490 root 1.22 my $port = $SELF
491     or Carp::croak "psub can only be called from within rcv or psub callbacks, not";
492 root 1.1
493 root 1.22 sub {
494     local $SELF = $port;
495 root 1.2
496 root 1.22 if (wantarray) {
497     my @res = eval { &$cb };
498     _self_die if $@;
499     @res
500     } else {
501     my $res = eval { &$cb };
502     _self_die if $@;
503     $res
504     }
505     }
506 root 1.2 }
507    
508 root 1.33 =item $guard = mon $port, $cb->(@reason)
509 root 1.32
510 root 1.36 =item $guard = mon $port, $rcvport
511    
512     =item $guard = mon $port
513 root 1.32
514 root 1.36 =item $guard = mon $port, $rcvport, @msg
515 root 1.32
516 root 1.42 Monitor the given port and do something when the port is killed or
517     messages to it were lost, and optionally return a guard that can be used
518     to stop monitoring again.
519    
520     C<mon> effectively guarantees that, in the absence of hardware failures,
521     that after starting the monitor, either all messages sent to the port
522     will arrive, or the monitoring action will be invoked after possible
523     message loss has been detected. No messages will be lost "in between"
524     (after the first lost message no further messages will be received by the
525     port). After the monitoring action was invoked, further messages might get
526     delivered again.
527 root 1.32
528 root 1.36 In the first form (callback), the callback is simply called with any
529     number of C<@reason> elements (no @reason means that the port was deleted
530 root 1.32 "normally"). Note also that I<< the callback B<must> never die >>, so use
531     C<eval> if unsure.
532    
533 root 1.43 In the second form (another port given), the other port (C<$rcvport>)
534 root 1.36 will be C<kil>'ed with C<@reason>, iff a @reason was specified, i.e. on
535     "normal" kils nothing happens, while under all other conditions, the other
536     port is killed with the same reason.
537 root 1.32
538 root 1.36 The third form (kill self) is the same as the second form, except that
539     C<$rvport> defaults to C<$SELF>.
540    
541     In the last form (message), a message of the form C<@msg, @reason> will be
542     C<snd>.
543 root 1.32
544 root 1.37 As a rule of thumb, monitoring requests should always monitor a port from
545     a local port (or callback). The reason is that kill messages might get
546     lost, just like any other message. Another less obvious reason is that
547     even monitoring requests can get lost (for exmaple, when the connection
548     to the other node goes down permanently). When monitoring a port locally
549     these problems do not exist.
550    
551 root 1.32 Example: call a given callback when C<$port> is killed.
552    
553     mon $port, sub { warn "port died because of <@_>\n" };
554    
555     Example: kill ourselves when C<$port> is killed abnormally.
556    
557 root 1.36 mon $port;
558 root 1.32
559 root 1.36 Example: send us a restart message when another C<$port> is killed.
560 root 1.32
561     mon $port, $self => "restart";
562    
563     =cut
564    
565     sub mon {
566     my ($noderef, $port) = split /#/, shift, 2;
567    
568     my $node = $NODE{$noderef} || add_node $noderef;
569    
570 root 1.41 my $cb = @_ ? shift : $SELF || Carp::croak 'mon: called with one argument only, but $SELF not set,';
571 root 1.32
572     unless (ref $cb) {
573     if (@_) {
574     # send a kill info message
575 root 1.41 my (@msg) = ($cb, @_);
576 root 1.32 $cb = sub { snd @msg, @_ };
577     } else {
578     # simply kill other port
579     my $port = $cb;
580     $cb = sub { kil $port, @_ if @_ };
581     }
582     }
583    
584     $node->monitor ($port, $cb);
585    
586     defined wantarray
587     and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
588     }
589    
590     =item $guard = mon_guard $port, $ref, $ref...
591    
592     Monitors the given C<$port> and keeps the passed references. When the port
593     is killed, the references will be freed.
594    
595     Optionally returns a guard that will stop the monitoring.
596    
597     This function is useful when you create e.g. timers or other watchers and
598     want to free them when the port gets killed:
599    
600     $port->rcv (start => sub {
601     my $timer; $timer = mon_guard $port, AE::timer 1, 1, sub {
602     undef $timer if 0.9 < rand;
603     });
604     });
605    
606     =cut
607    
608     sub mon_guard {
609     my ($port, @refs) = @_;
610    
611 root 1.36 #TODO: mon-less form?
612    
613 root 1.32 mon $port, sub { 0 && @refs }
614     }
615    
616 root 1.33 =item kil $port[, @reason]
617 root 1.32
618     Kill the specified port with the given C<@reason>.
619    
620     If no C<@reason> is specified, then the port is killed "normally" (linked
621     ports will not be kileld, or even notified).
622    
623     Otherwise, linked ports get killed with the same reason (second form of
624     C<mon>, see below).
625    
626     Runtime errors while evaluating C<rcv> callbacks or inside C<psub> blocks
627     will be reported as reason C<< die => $@ >>.
628    
629     Transport/communication errors are reported as C<< transport_error =>
630     $message >>.
631    
632 root 1.38 =cut
633    
634     =item $port = spawn $node, $initfunc[, @initdata]
635    
636     Creates a port on the node C<$node> (which can also be a port ID, in which
637     case it's the node where that port resides).
638    
639     The port ID of the newly created port is return immediately, and it is
640     permissible to immediately start sending messages or monitor the port.
641    
642     After the port has been created, the init function is
643 root 1.39 called. This function must be a fully-qualified function name
644 root 1.40 (e.g. C<MyApp::Chat::Server::init>). To specify a function in the main
645     program, use C<::name>.
646 root 1.38
647     If the function doesn't exist, then the node tries to C<require>
648     the package, then the package above the package and so on (e.g.
649     C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
650     exists or it runs out of package names.
651    
652     The init function is then called with the newly-created port as context
653     object (C<$SELF>) and the C<@initdata> values as arguments.
654    
655     A common idiom is to pass your own port, monitor the spawned port, and
656     in the init function, monitor the original port. This two-way monitoring
657     ensures that both ports get cleaned up when there is a problem.
658    
659     Example: spawn a chat server port on C<$othernode>.
660    
661     # this node, executed from within a port context:
662     my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
663     mon $server;
664    
665     # init function on C<$othernode>
666     sub connect {
667     my ($srcport) = @_;
668    
669     mon $srcport;
670    
671     rcv $SELF, sub {
672     ...
673     };
674     }
675    
676     =cut
677    
678     sub _spawn {
679     my $port = shift;
680     my $init = shift;
681    
682     local $SELF = "$NODE#$port";
683     eval {
684     &{ load_func $init }
685     };
686     _self_die if $@;
687     }
688    
689     sub spawn(@) {
690     my ($noderef, undef) = split /#/, shift, 2;
691    
692     my $id = "$RUNIQ." . $ID++;
693    
694 root 1.39 $_[0] =~ /::/
695     or Carp::croak "spawn init function must be a fully-qualified name, caught";
696    
697 root 1.38 ($NODE{$noderef} || add_node $noderef)
698     ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
699    
700     "$noderef#$id"
701     }
702    
703 root 1.8 =back
704    
705 root 1.4 =head1 NODE MESSAGES
706    
707 root 1.5 Nodes understand the following messages sent to them. Many of them take
708     arguments called C<@reply>, which will simply be used to compose a reply
709     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
710     the remaining arguments are simply the message data.
711 root 1.4
712 root 1.29 While other messages exist, they are not public and subject to change.
713    
714 root 1.4 =over 4
715    
716     =cut
717    
718 root 1.22 =item lookup => $name, @reply
719 root 1.3
720 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
721 root 1.3
722 root 1.7 =item devnull => ...
723    
724     Generic data sink/CPU heat conversion.
725    
726 root 1.4 =item relay => $port, @msg
727    
728     Simply forwards the message to the given port.
729    
730     =item eval => $string[ @reply]
731    
732     Evaluates the given string. If C<@reply> is given, then a message of the
733 root 1.5 form C<@reply, $@, @evalres> is sent.
734    
735     Example: crash another node.
736    
737     snd $othernode, eval => "exit";
738 root 1.4
739     =item time => @reply
740    
741     Replies the the current node time to C<@reply>.
742    
743 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
744     C<timereply> message.
745    
746     snd $NODE, time => $myport, timereply => 1, 2;
747     # => snd $myport, timereply => 1, 2, <time>
748    
749 root 1.2 =back
750    
751 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
752    
753 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
754     == aemp node, Erlang process == aemp port), so many of the documents and
755     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
756 root 1.27 sample:
757    
758 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
759     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
760     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
761     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
762 root 1.27
763     Despite the similarities, there are also some important differences:
764 root 1.26
765     =over 4
766    
767     =item * Node references contain the recipe on how to contact them.
768    
769     Erlang relies on special naming and DNS to work everywhere in the
770     same way. AEMP relies on each node knowing it's own address(es), with
771     convenience functionality.
772    
773 root 1.27 This means that AEMP requires a less tightly controlled environment at the
774     cost of longer node references and a slightly higher management overhead.
775    
776 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
777    
778     Erlang uses processes that selctively receive messages, and therefore
779     needs a queue. AEMP is event based, queuing messages would serve no useful
780     purpose.
781    
782 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
783 root 1.26
784     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
785    
786 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
787 root 1.26 sends are immediate, connection establishment is handled in the
788     background.
789    
790     =item * Erlang can silently lose messages, AEMP cannot.
791    
792     Erlang makes few guarantees on messages delivery - messages can get lost
793     without any of the processes realising it (i.e. you send messages a, b,
794     and c, and the other side only receives messages a and c).
795    
796     AEMP guarantees correct ordering, and the guarantee that there are no
797     holes in the message sequence.
798    
799 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
800 root 1.26 alive.
801    
802 root 1.35 In Erlang it can happen that a monitored process is declared dead and
803 root 1.26 linked processes get killed, but later it turns out that the process is
804     still alive - and can receive messages.
805    
806     In AEMP, when port monitoring detects a port as dead, then that port will
807     eventually be killed - it cannot happen that a node detects a port as dead
808     and then later sends messages to it, finding it is still alive.
809    
810     =item * Erlang can send messages to the wrong port, AEMP does not.
811    
812 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
813 root 1.26 ID known to other nodes for a completely different process, causing
814     messages destined for that process to end up in an unrelated process.
815    
816     AEMP never reuses port IDs, so old messages or old port IDs floating
817     around in the network will not be sent to an unrelated port.
818    
819     =item * Erlang uses unprotected connections, AEMP uses secure
820     authentication and can use TLS.
821    
822     AEMP can use a proven protocol - SSL/TLS - to protect connections and
823     securely authenticate nodes.
824    
825 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
826     communications.
827    
828 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
829 root 1.28 language-independent text-only protocols (good for debugging) and binary,
830     language-specific serialisers (e.g. Storable).
831    
832     It has also been carefully designed to be implementable in other languages
833     with a minimum of work while gracefully degrading fucntionality to make the
834     protocol simple.
835    
836 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
837    
838     In Erlang, you can chose to receive I<all> exit signals as messages
839     or I<none>, there is no in-between, so monitoring single processes is
840     difficult to implement. Monitoring in AEMP is more flexible than in
841     Erlang, as one can choose between automatic kill, exit message or callback
842     on a per-process basis.
843    
844 root 1.37 =item * Erlang tries to hide remote/local connections, AEMP does not.
845 root 1.35
846     Monitoring in Erlang is not an indicator of process death/crashes,
847 root 1.37 as linking is (except linking is unreliable in Erlang).
848    
849     In AEMP, you don't "look up" registered port names or send to named ports
850     that might or might not be persistent. Instead, you normally spawn a port
851     on the remote node. The init function monitors the you, and you monitor
852     the remote port. Since both monitors are local to the node, they are much
853     more reliable.
854    
855     This also saves round-trips and avoids sending messages to the wrong port
856     (hard to do in Erlang).
857 root 1.35
858 root 1.26 =back
859    
860 root 1.46 =head1 RATIONALE
861    
862     =over 4
863    
864     =item Why strings for ports and noderefs, why not objects?
865    
866     We considered "objects", but found that the actual number of methods
867     thatc an be called are very low. Since port IDs and noderefs travel over
868     the network frequently, the serialising/deserialising would add lots of
869     overhead, as well as having to keep a proxy object.
870    
871     Strings can easily be printed, easily serialised etc. and need no special
872     procedures to be "valid".
873    
874 root 1.47 And a a miniport consists of a single closure stored in a global hash - it
875     can't become much cheaper.
876    
877 root 1.46 =item Why favour JSON, why not real serialising format such as Storable?
878    
879     In fact, any AnyEvent::MP node will happily accept Storable as framing
880     format, but currently there is no way to make a node use Storable by
881     default.
882    
883     The default framing protocol is JSON because a) JSON::XS is many times
884     faster for small messages and b) most importantly, after years of
885     experience we found that object serialisation is causing more problems
886     than it gains: Just like function calls, objects simply do not travel
887     easily over the network, mostly because they will always be a copy, so you
888     always have to re-think your design.
889    
890     Keeping your messages simple, concentrating on data structures rather than
891     objects, will keep your messages clean, tidy and efficient.
892    
893     =back
894    
895 root 1.1 =head1 SEE ALSO
896    
897     L<AnyEvent>.
898    
899     =head1 AUTHOR
900    
901     Marc Lehmann <schmorp@schmorp.de>
902     http://home.schmorp.de/
903    
904     =cut
905    
906     1
907