ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.55
Committed: Fri Aug 14 23:17:17 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-0_7
Changes since 1.54: +1 -2 lines
Log Message:
*** empty log message ***

File Contents

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