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