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