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