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