ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.66
Committed: Fri Aug 28 01:07:24 2009 UTC (14 years, 8 months ago) by root
Branch: MAIN
Changes since 1.65: +8 -17 lines
Log Message:
*** empty log message ***

File Contents

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