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