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