amb-dns

ambassador for dynamically linking sockets across hosts using DNS SRV records

Ambassador can be used as a "jumper" to connect remote services within a cluster that have dynmically changing hosts/ports. It assumes services are registering their host and port with an available DNS service using SRV records.

For example, you might have a mongodb container running somewhere in your cluster. It registers its own host and port to a DNS service under an SRV entry such as _mongodb._tcp.domain.local when it starts/restarts.

Say you have an api-server that wants to talk to _mongodb._tcp.domain.local. You can link this API server to mongodb using a sidekick:

docker run -d -name dns-server jkingyens/helixdns
docker run -d -link dns-server:dns -name db-amb jkingyens/ambassador _mongodb._tcp.domain.local
docker run -d -link db-amb:db api-server

HelixDNS provides a DNS service on top of etcd. If you already have DNS service at a particular <ip:port>, then:

docker run -d -dns <ip:port> -name db-amb jkingyens/ambassador _mongodb._tcp.domain.local
docker run -d -link db-amb:db api-server

In either case, api-server only needs to be concerned with connecting to the jumper defined by the enviornment variables:

DB_PORT_3000_TCP_ADDR
DB_PORT_3000_TCP_PORT

Ambassador takes care of ensuring this socket connection routes to wherever _mongodb._tcp.domain.local is running. api-server should be designed to handle network failures. This way, if your monogdb instance is scheduled onto a different host or port, the ambassador should properly route traffic to its new location when api-server attempts to reconnect.

You can use the ambassador directly as a node.js module if you want to build this dynmically linking behaviour into your application. You define the name of the service (as advertised in your DNS) and a local port you want to talk to the service on:

var amb = require('amb-dns');
amb(3000, '_mongodb._tcp.required.local', function (err) {
  // mongo is now available at localhost:3000
});