ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.51
Committed: Fri Aug 14 14:07:44 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.50: +27 -10 lines
Log Message:
*** empty log message ***

File Contents

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