ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.37
Committed: Fri Aug 7 16:47:23 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.36: +18 -31 lines
Log Message:
evangalism

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     snd $port, type => data...;
14    
15 root 1.22 $SELF # receiving/own port id in rcv callbacks
16    
17 root 1.2 rcv $port, smartmatch => $cb->($port, @msg);
18    
19     # examples:
20     rcv $port2, ping => sub { snd $_[0], "pong"; 0 };
21     rcv $port1, pong => sub { warn "pong received\n" };
22     snd $port2, ping => $port1;
23    
24     # more, smarter, matches (_any_ is exported by this module)
25     rcv $port, [child_died => $pid] => sub { ...
26     rcv $port, [_any_, _any_, 3] => sub { .. $_[2] is 3
27    
28 root 1.35 # monitoring
29     mon $port, $cb->(@msg) # callback is invoked on death
30     mon $port, $otherport # kill otherport on abnormal death
31     mon $port, $otherport, @msg # send message on death
32    
33 root 1.1 =head1 DESCRIPTION
34    
35 root 1.2 This module (-family) implements a simple message passing framework.
36    
37     Despite its simplicity, you can securely message other processes running
38     on the same or other hosts.
39    
40 root 1.23 For an introduction to this module family, see the L<AnyEvent::MP::Intro>
41     manual page.
42    
43     At the moment, this module family is severly broken and underdocumented,
44 root 1.21 so do not use. This was uploaded mainly to reserve the CPAN namespace -
45 root 1.23 stay tuned! The basic API should be finished, however.
46 root 1.6
47 root 1.2 =head1 CONCEPTS
48    
49     =over 4
50    
51     =item port
52    
53 root 1.29 A port is something you can send messages to (with the C<snd> function).
54    
55     Some ports allow you to register C<rcv> handlers that can match specific
56     messages. All C<rcv> handlers will receive messages they match, messages
57     will not be queued.
58 root 1.2
59 root 1.3 =item port id - C<noderef#portname>
60 root 1.2
61 root 1.29 A port id is normaly the concatenation of a noderef, a hash-mark (C<#>) as
62     separator, and a port name (a printable string of unspecified format). An
63 root 1.30 exception is the the node port, whose ID is identical to its node
64 root 1.29 reference.
65 root 1.2
66     =item node
67    
68     A node is a single process containing at least one port - the node
69 root 1.29 port. You can send messages to node ports to find existing ports or to
70     create new ports, among other things.
71 root 1.2
72 root 1.29 Nodes are either private (single-process only), slaves (connected to a
73     master node only) or public nodes (connectable from unrelated nodes).
74 root 1.2
75 root 1.5 =item noderef - C<host:port,host:port...>, C<id@noderef>, C<id>
76 root 1.2
77 root 1.29 A node reference is a string that either simply identifies the node (for
78     private and slave nodes), or contains a recipe on how to reach a given
79 root 1.2 node (for public nodes).
80    
81 root 1.29 This recipe is simply a comma-separated list of C<address:port> pairs (for
82     TCP/IP, other protocols might look different).
83    
84     Node references come in two flavours: resolved (containing only numerical
85     addresses) or unresolved (where hostnames are used instead of addresses).
86    
87     Before using an unresolved node reference in a message you first have to
88     resolve it.
89    
90 root 1.2 =back
91    
92 root 1.3 =head1 VARIABLES/FUNCTIONS
93 root 1.2
94     =over 4
95    
96 root 1.1 =cut
97    
98     package AnyEvent::MP;
99    
100 root 1.8 use AnyEvent::MP::Base;
101 root 1.2
102 root 1.1 use common::sense;
103    
104 root 1.2 use Carp ();
105    
106 root 1.1 use AE ();
107    
108 root 1.2 use base "Exporter";
109    
110 root 1.25 our $VERSION = '0.1';
111 root 1.8 our @EXPORT = qw(
112 root 1.22 NODE $NODE *SELF node_of _any_
113 root 1.31 resolve_node initialise_node
114 root 1.22 snd rcv mon kil reg psub
115     port
116 root 1.8 );
117 root 1.2
118 root 1.22 our $SELF;
119    
120     sub _self_die() {
121     my $msg = $@;
122     $msg =~ s/\n+$// unless ref $msg;
123     kil $SELF, die => $msg;
124     }
125    
126     =item $thisnode = NODE / $NODE
127    
128     The C<NODE> function returns, and the C<$NODE> variable contains
129     the noderef of the local node. The value is initialised by a call
130     to C<become_public> or C<become_slave>, after which all local port
131     identifiers become invalid.
132    
133 root 1.33 =item $noderef = node_of $port
134 root 1.22
135     Extracts and returns the noderef from a portid or a noderef.
136    
137 root 1.34 =item initialise_node $noderef, $seednode, $seednode...
138    
139     =item initialise_node "slave/", $master, $master...
140    
141     Before a node can talk to other nodes on the network it has to initialise
142     itself - the minimum a node needs to know is it's own name, and optionally
143     it should know the noderefs of some other nodes in the network.
144    
145     This function initialises a node - it must be called exactly once (or
146     never) before calling other AnyEvent::MP functions.
147    
148     All arguments are noderefs, which can be either resolved or unresolved.
149    
150     There are two types of networked nodes, public nodes and slave nodes:
151    
152     =over 4
153    
154     =item public nodes
155    
156     For public nodes, C<$noderef> must either be a (possibly unresolved)
157     noderef, in which case it will be resolved, or C<undef> (or missing), in
158     which case the noderef will be guessed.
159    
160     Afterwards, the node will bind itself on all endpoints and try to connect
161     to all additional C<$seednodes> that are specified. Seednodes are optional
162     and can be used to quickly bootstrap the node into an existing network.
163    
164     =item slave nodes
165    
166     When the C<$noderef> is the special string C<slave/>, then the node will
167     become a slave node. Slave nodes cannot be contacted from outside and will
168     route most of their traffic to the master node that they attach to.
169    
170     At least one additional noderef is required: The node will try to connect
171     to all of them and will become a slave attached to the first node it can
172     successfully connect to.
173    
174     =back
175    
176     This function will block until all nodes have been resolved and, for slave
177     nodes, until it has successfully established a connection to a master
178     server.
179    
180     Example: become a public node listening on the default node.
181    
182     initialise_node;
183    
184     Example: become a public node, and try to contact some well-known master
185     servers to become part of the network.
186    
187     initialise_node undef, "master1", "master2";
188    
189     Example: become a public node listening on port C<4041>.
190    
191     initialise_node 4041;
192    
193     Example: become a public node, only visible on localhost port 4044.
194    
195     initialise_node "locahost:4044";
196    
197     Example: become a slave node to any of the specified master servers.
198    
199     initialise_node "slave/", "master1", "192.168.13.17", "mp.example.net";
200    
201 root 1.29 =item $cv = resolve_node $noderef
202    
203     Takes an unresolved node reference that may contain hostnames and
204     abbreviated IDs, resolves all of them and returns a resolved node
205     reference.
206    
207     In addition to C<address:port> pairs allowed in resolved noderefs, the
208     following forms are supported:
209    
210     =over 4
211    
212     =item the empty string
213    
214     An empty-string component gets resolved as if the default port (4040) was
215     specified.
216    
217     =item naked port numbers (e.g. C<1234>)
218    
219     These are resolved by prepending the local nodename and a colon, to be
220     further resolved.
221    
222     =item hostnames (e.g. C<localhost:1234>, C<localhost>)
223    
224     These are resolved by using AnyEvent::DNS to resolve them, optionally
225     looking up SRV records for the C<aemp=4040> port, if no port was
226     specified.
227    
228     =back
229    
230 root 1.22 =item $SELF
231    
232     Contains the current port id while executing C<rcv> callbacks or C<psub>
233     blocks.
234 root 1.3
235 root 1.22 =item SELF, %SELF, @SELF...
236    
237     Due to some quirks in how perl exports variables, it is impossible to
238     just export C<$SELF>, all the symbols called C<SELF> are exported by this
239     module, but only C<$SELF> is currently used.
240 root 1.3
241 root 1.33 =item snd $port, type => @data
242 root 1.3
243 root 1.33 =item snd $port, @msg
244 root 1.3
245 root 1.8 Send the given message to the given port ID, which can identify either
246     a local or a remote port, and can be either a string or soemthignt hat
247     stringifies a sa port ID (such as a port object :).
248    
249     While the message can be about anything, it is highly recommended to use a
250     string as first element (a portid, or some word that indicates a request
251     type etc.).
252 root 1.3
253     The message data effectively becomes read-only after a call to this
254     function: modifying any argument is not allowed and can cause many
255     problems.
256    
257     The type of data you can transfer depends on the transport protocol: when
258     JSON is used, then only strings, numbers and arrays and hashes consisting
259     of those are allowed (no objects). When Storable is used, then anything
260     that Storable can serialise and deserialise is allowed, and for the local
261     node, anything can be passed.
262    
263 root 1.22 =item $local_port = port
264 root 1.2
265 root 1.31 Create a new local port object that can be used either as a pattern
266     matching port ("full port") or a single-callback port ("miniport"),
267     depending on how C<rcv> callbacks are bound to the object.
268 root 1.3
269 root 1.33 =item $port = port { my @msg = @_; $finished }
270 root 1.10
271 root 1.33 Creates a "miniport", that is, a very lightweight port without any pattern
272     matching behind it, and returns its ID. Semantically the same as creating
273     a port and calling C<rcv $port, $callback> on it.
274 root 1.15
275     The block will be called for every message received on the port. When the
276     callback returns a true value its job is considered "done" and the port
277     will be destroyed. Otherwise it will stay alive.
278    
279 root 1.17 The message will be passed as-is, no extra argument (i.e. no port id) will
280 root 1.15 be passed to the callback.
281    
282     If you need the local port id in the callback, this works nicely:
283    
284 root 1.31 my $port; $port = port {
285 root 1.15 snd $otherport, reply => $port;
286     };
287 root 1.10
288     =cut
289    
290 root 1.33 sub rcv($@);
291    
292 root 1.22 sub port(;&) {
293     my $id = "$UNIQ." . $ID++;
294     my $port = "$NODE#$id";
295    
296     if (@_) {
297 root 1.33 rcv $port, shift;
298 root 1.22 } else {
299 root 1.33 $PORT{$id} = sub { }; # nop
300 root 1.22 }
301 root 1.10
302 root 1.22 $port
303 root 1.10 }
304    
305 root 1.33 =item reg $port, $name
306 root 1.8
307 root 1.36 =item reg $name
308    
309     Registers the given port (or C<$SELF><<< if missing) under the name
310     C<$name>. If the name already exists it is replaced.
311 root 1.8
312 root 1.22 A port can only be registered under one well known name.
313 root 1.8
314 root 1.22 A port automatically becomes unregistered when it is killed.
315 root 1.8
316     =cut
317    
318 root 1.22 sub reg(@) {
319 root 1.36 my $port = @_ > 1 ? shift : $SELF || Carp::croak 'reg: called with one argument only, but $SELF not set,';
320 root 1.8
321 root 1.36 $REG{$_[0]} = $port;
322 root 1.22 }
323 root 1.18
324 root 1.33 =item rcv $port, $callback->(@msg)
325 root 1.31
326 root 1.33 Replaces the callback on the specified miniport (after converting it to
327     one if required).
328 root 1.31
329 root 1.33 =item rcv $port, tagstring => $callback->(@msg), ...
330 root 1.3
331 root 1.33 =item rcv $port, $smartmatch => $callback->(@msg), ...
332 root 1.3
333 root 1.33 =item rcv $port, [$smartmatch...] => $callback->(@msg), ...
334 root 1.3
335 root 1.32 Register callbacks to be called on matching messages on the given full
336 root 1.36 port (after converting it to one if required) and return the port.
337 root 1.3
338     The callback has to return a true value when its work is done, after
339     which is will be removed, or a false value in which case it will stay
340     registered.
341    
342 root 1.33 The global C<$SELF> (exported by this module) contains C<$port> while
343 root 1.22 executing the callback.
344    
345     Runtime errors wdurign callback execution will result in the port being
346     C<kil>ed.
347    
348 root 1.3 If the match is an array reference, then it will be matched against the
349     first elements of the message, otherwise only the first element is being
350     matched.
351    
352     Any element in the match that is specified as C<_any_> (a function
353     exported by this module) matches any single element of the message.
354    
355     While not required, it is highly recommended that the first matching
356     element is a string identifying the message. The one-string-only match is
357     also the most efficient match (by far).
358    
359 root 1.36 Example: create a port and bind receivers on it in one go.
360    
361     my $port = rcv port,
362     msg1 => sub { ...; 0 },
363     msg2 => sub { ...; 0 },
364     ;
365    
366     Example: create a port, bind receivers and send it in a message elsewhere
367     in one go:
368    
369     snd $otherport, reply =>
370     rcv port,
371     msg1 => sub { ...; 0 },
372     ...
373     ;
374    
375 root 1.3 =cut
376    
377     sub rcv($@) {
378 root 1.33 my $port = shift;
379     my ($noderef, $portid) = split /#/, $port, 2;
380 root 1.3
381 root 1.22 ($NODE{$noderef} || add_node $noderef) == $NODE{""}
382 root 1.33 or Carp::croak "$port: rcv can only be called on local ports, caught";
383 root 1.22
384 root 1.33 if (@_ == 1) {
385     my $cb = shift;
386     delete $PORT_DATA{$portid};
387     $PORT{$portid} = sub {
388     local $SELF = $port;
389     eval {
390     &$cb
391     and kil $port;
392     };
393     _self_die if $@;
394     };
395     } else {
396     my $self = $PORT_DATA{$portid} ||= do {
397     my $self = bless {
398     id => $port,
399     }, "AnyEvent::MP::Port";
400    
401     $PORT{$portid} = sub {
402     local $SELF = $port;
403    
404     eval {
405     for (@{ $self->{rc0}{$_[0]} }) {
406     $_ && &{$_->[0]}
407     && undef $_;
408     }
409    
410     for (@{ $self->{rcv}{$_[0]} }) {
411     $_ && [@_[1 .. @{$_->[1]}]] ~~ $_->[1]
412     && &{$_->[0]}
413     && undef $_;
414     }
415    
416     for (@{ $self->{any} }) {
417     $_ && [@_[0 .. $#{$_->[1]}]] ~~ $_->[1]
418     && &{$_->[0]}
419     && undef $_;
420     }
421     };
422     _self_die if $@;
423     };
424    
425     $self
426     };
427 root 1.22
428 root 1.33 "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.33 while (@_) {
432     my ($match, $cb) = splice @_, 0, 2;
433    
434     if (!ref $match) {
435     push @{ $self->{rc0}{$match} }, [$cb];
436     } elsif (("ARRAY" eq ref $match && !ref $match->[0])) {
437     my ($type, @match) = @$match;
438     @match
439     ? push @{ $self->{rcv}{$match->[0]} }, [$cb, \@match]
440     : push @{ $self->{rc0}{$match->[0]} }, [$cb];
441     } else {
442     push @{ $self->{any} }, [$cb, $match];
443     }
444 root 1.22 }
445 root 1.3 }
446 root 1.31
447 root 1.33 $port
448 root 1.2 }
449    
450 root 1.22 =item $closure = psub { BLOCK }
451 root 1.2
452 root 1.22 Remembers C<$SELF> and creates a closure out of the BLOCK. When the
453     closure is executed, sets up the environment in the same way as in C<rcv>
454     callbacks, i.e. runtime errors will cause the port to get C<kil>ed.
455    
456     This is useful when you register callbacks from C<rcv> callbacks:
457    
458     rcv delayed_reply => sub {
459     my ($delay, @reply) = @_;
460     my $timer = AE::timer $delay, 0, psub {
461     snd @reply, $SELF;
462     };
463     };
464 root 1.3
465 root 1.8 =cut
466 root 1.3
467 root 1.22 sub psub(&) {
468     my $cb = shift;
469 root 1.3
470 root 1.22 my $port = $SELF
471     or Carp::croak "psub can only be called from within rcv or psub callbacks, not";
472 root 1.1
473 root 1.22 sub {
474     local $SELF = $port;
475 root 1.2
476 root 1.22 if (wantarray) {
477     my @res = eval { &$cb };
478     _self_die if $@;
479     @res
480     } else {
481     my $res = eval { &$cb };
482     _self_die if $@;
483     $res
484     }
485     }
486 root 1.2 }
487    
488 root 1.33 =item $guard = mon $port, $cb->(@reason)
489 root 1.32
490 root 1.36 =item $guard = mon $port, $rcvport
491    
492     =item $guard = mon $port
493 root 1.32
494 root 1.36 =item $guard = mon $port, $rcvport, @msg
495 root 1.32
496 root 1.36 Monitor the given port and do something when the port is killed, and
497     optionally return a guard that can be used to stop monitoring again.
498 root 1.32
499 root 1.36 In the first form (callback), the callback is simply called with any
500     number of C<@reason> elements (no @reason means that the port was deleted
501 root 1.32 "normally"). Note also that I<< the callback B<must> never die >>, so use
502     C<eval> if unsure.
503    
504 root 1.36 In the second form (another port given), the other port (C<$rcvport)
505     will be C<kil>'ed with C<@reason>, iff a @reason was specified, i.e. on
506     "normal" kils nothing happens, while under all other conditions, the other
507     port is killed with the same reason.
508 root 1.32
509 root 1.36 The third form (kill self) is the same as the second form, except that
510     C<$rvport> defaults to C<$SELF>.
511    
512     In the last form (message), a message of the form C<@msg, @reason> will be
513     C<snd>.
514 root 1.32
515 root 1.37 As a rule of thumb, monitoring requests should always monitor a port from
516     a local port (or callback). The reason is that kill messages might get
517     lost, just like any other message. Another less obvious reason is that
518     even monitoring requests can get lost (for exmaple, when the connection
519     to the other node goes down permanently). When monitoring a port locally
520     these problems do not exist.
521    
522 root 1.32 Example: call a given callback when C<$port> is killed.
523    
524     mon $port, sub { warn "port died because of <@_>\n" };
525    
526     Example: kill ourselves when C<$port> is killed abnormally.
527    
528 root 1.36 mon $port;
529 root 1.32
530 root 1.36 Example: send us a restart message when another C<$port> is killed.
531 root 1.32
532     mon $port, $self => "restart";
533    
534     =cut
535    
536     sub mon {
537     my ($noderef, $port) = split /#/, shift, 2;
538    
539     my $node = $NODE{$noderef} || add_node $noderef;
540    
541 root 1.36 my $cb = @_ ? $_[0] : $SELF || Carp::croak 'mon: called with one argument only, but $SELF not set,';
542 root 1.32
543     unless (ref $cb) {
544     if (@_) {
545     # send a kill info message
546 root 1.36 my (@msg) = @_;
547 root 1.32 $cb = sub { snd @msg, @_ };
548     } else {
549     # simply kill other port
550     my $port = $cb;
551     $cb = sub { kil $port, @_ if @_ };
552     }
553     }
554    
555     $node->monitor ($port, $cb);
556    
557     defined wantarray
558     and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
559     }
560    
561     =item $guard = mon_guard $port, $ref, $ref...
562    
563     Monitors the given C<$port> and keeps the passed references. When the port
564     is killed, the references will be freed.
565    
566     Optionally returns a guard that will stop the monitoring.
567    
568     This function is useful when you create e.g. timers or other watchers and
569     want to free them when the port gets killed:
570    
571     $port->rcv (start => sub {
572     my $timer; $timer = mon_guard $port, AE::timer 1, 1, sub {
573     undef $timer if 0.9 < rand;
574     });
575     });
576    
577     =cut
578    
579     sub mon_guard {
580     my ($port, @refs) = @_;
581    
582 root 1.36 #TODO: mon-less form?
583    
584 root 1.32 mon $port, sub { 0 && @refs }
585     }
586    
587 root 1.33 =item kil $port[, @reason]
588 root 1.32
589     Kill the specified port with the given C<@reason>.
590    
591     If no C<@reason> is specified, then the port is killed "normally" (linked
592     ports will not be kileld, or even notified).
593    
594     Otherwise, linked ports get killed with the same reason (second form of
595     C<mon>, see below).
596    
597     Runtime errors while evaluating C<rcv> callbacks or inside C<psub> blocks
598     will be reported as reason C<< die => $@ >>.
599    
600     Transport/communication errors are reported as C<< transport_error =>
601     $message >>.
602    
603 root 1.8 =back
604    
605 root 1.4 =head1 NODE MESSAGES
606    
607 root 1.5 Nodes understand the following messages sent to them. Many of them take
608     arguments called C<@reply>, which will simply be used to compose a reply
609     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
610     the remaining arguments are simply the message data.
611 root 1.4
612 root 1.29 While other messages exist, they are not public and subject to change.
613    
614 root 1.4 =over 4
615    
616     =cut
617    
618 root 1.22 =item lookup => $name, @reply
619 root 1.3
620 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
621 root 1.3
622 root 1.7 =item devnull => ...
623    
624     Generic data sink/CPU heat conversion.
625    
626 root 1.4 =item relay => $port, @msg
627    
628     Simply forwards the message to the given port.
629    
630     =item eval => $string[ @reply]
631    
632     Evaluates the given string. If C<@reply> is given, then a message of the
633 root 1.5 form C<@reply, $@, @evalres> is sent.
634    
635     Example: crash another node.
636    
637     snd $othernode, eval => "exit";
638 root 1.4
639     =item time => @reply
640    
641     Replies the the current node time to C<@reply>.
642    
643 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
644     C<timereply> message.
645    
646     snd $NODE, time => $myport, timereply => 1, 2;
647     # => snd $myport, timereply => 1, 2, <time>
648    
649 root 1.2 =back
650    
651 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
652    
653 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
654     == aemp node, Erlang process == aemp port), so many of the documents and
655     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
656 root 1.27 sample:
657    
658 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
659     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
660     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
661     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
662 root 1.27
663     Despite the similarities, there are also some important differences:
664 root 1.26
665     =over 4
666    
667     =item * Node references contain the recipe on how to contact them.
668    
669     Erlang relies on special naming and DNS to work everywhere in the
670     same way. AEMP relies on each node knowing it's own address(es), with
671     convenience functionality.
672    
673 root 1.27 This means that AEMP requires a less tightly controlled environment at the
674     cost of longer node references and a slightly higher management overhead.
675    
676 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
677    
678     Erlang uses processes that selctively receive messages, and therefore
679     needs a queue. AEMP is event based, queuing messages would serve no useful
680     purpose.
681    
682 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
683 root 1.26
684     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
685    
686 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
687 root 1.26 sends are immediate, connection establishment is handled in the
688     background.
689    
690     =item * Erlang can silently lose messages, AEMP cannot.
691    
692     Erlang makes few guarantees on messages delivery - messages can get lost
693     without any of the processes realising it (i.e. you send messages a, b,
694     and c, and the other side only receives messages a and c).
695    
696     AEMP guarantees correct ordering, and the guarantee that there are no
697     holes in the message sequence.
698    
699 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
700 root 1.26 alive.
701    
702 root 1.35 In Erlang it can happen that a monitored process is declared dead and
703 root 1.26 linked processes get killed, but later it turns out that the process is
704     still alive - and can receive messages.
705    
706     In AEMP, when port monitoring detects a port as dead, then that port will
707     eventually be killed - it cannot happen that a node detects a port as dead
708     and then later sends messages to it, finding it is still alive.
709    
710     =item * Erlang can send messages to the wrong port, AEMP does not.
711    
712 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
713 root 1.26 ID known to other nodes for a completely different process, causing
714     messages destined for that process to end up in an unrelated process.
715    
716     AEMP never reuses port IDs, so old messages or old port IDs floating
717     around in the network will not be sent to an unrelated port.
718    
719     =item * Erlang uses unprotected connections, AEMP uses secure
720     authentication and can use TLS.
721    
722     AEMP can use a proven protocol - SSL/TLS - to protect connections and
723     securely authenticate nodes.
724    
725 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
726     communications.
727    
728 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
729 root 1.28 language-independent text-only protocols (good for debugging) and binary,
730     language-specific serialisers (e.g. Storable).
731    
732     It has also been carefully designed to be implementable in other languages
733     with a minimum of work while gracefully degrading fucntionality to make the
734     protocol simple.
735    
736 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
737    
738     In Erlang, you can chose to receive I<all> exit signals as messages
739     or I<none>, there is no in-between, so monitoring single processes is
740     difficult to implement. Monitoring in AEMP is more flexible than in
741     Erlang, as one can choose between automatic kill, exit message or callback
742     on a per-process basis.
743    
744 root 1.37 =item * Erlang tries to hide remote/local connections, AEMP does not.
745 root 1.35
746     Monitoring in Erlang is not an indicator of process death/crashes,
747 root 1.37 as linking is (except linking is unreliable in Erlang).
748    
749     In AEMP, you don't "look up" registered port names or send to named ports
750     that might or might not be persistent. Instead, you normally spawn a port
751     on the remote node. The init function monitors the you, and you monitor
752     the remote port. Since both monitors are local to the node, they are much
753     more reliable.
754    
755     This also saves round-trips and avoids sending messages to the wrong port
756     (hard to do in Erlang).
757 root 1.35
758 root 1.26 =back
759    
760 root 1.1 =head1 SEE ALSO
761    
762     L<AnyEvent>.
763    
764     =head1 AUTHOR
765    
766     Marc Lehmann <schmorp@schmorp.de>
767     http://home.schmorp.de/
768    
769     =cut
770    
771     1
772