Great question, one we've been getting on IRC a lot. Say you're launching a simple netcat [1] service in Aurora. The config file might look something like this:
# netcat-service.aurora run_server = Process(name = 'run_server', cmdline = 'nc -l {{thermos.ports[netcat]}}') task = Task( processes = [run_server], resources = Resources(cpu = 1.0, ram = 128*MB, disk=64*MB)) service = Service( cluster = 'example', role = 'www-data', environment = 'test', name = 'netcat-service', instances = 2, task = task) jobs = [service] Since Aurora puts each instance somewhere in your Mesos cluster and can change where it's running in case of failure or preemption you can't hardcode a list of addresses into your client. Instead you need to use a service discovery mechanism. One way to do that is to have your service publish its current hostname and ports that it's listening on to ZooKeeper when it starts up and remove that information when it's torn down. Imagine for a second that we have a utility called "announcer" that does this. Then we could run "announcer" as a "container agent" alongside our service. Our config file might use it like this (changes bolded): # netcat-service-announced.aurora run_server = Process(name = 'run_server', cmdline = 'nc -l {{thermos.ports[netcat]}}') *announcer = Process(name = 'announcer',* * daemon = True,* * ephermeral = True,* * cmdline = ' '.join([* * 'announcer',* * '--zk_ensemble=zookeeper.example.com:2181 <http://zookeeper.example.com:2181>',* * '--zk_path=/service/netcat-service',* * '--port=netcat:{{thermos.ports[netcat]}}',* * ]))* task = Task( processes = [*announcer*, run_server], resources = Resources(cpu = 1.0, ram = *256**MB, disk=64*MB)) service = Service( cluster = 'example', role = 'www-data', environment = 'test', name = 'netcat-service', instances = 2, task = task) jobs = [service] Now whenever an instance of our netcat service is launched an announcer process will run alongside it, and will be terminated only when the netcat service terminates. How do we implement the announcer utility? One way would be to use one of the Twitter commons ServerSet [2] libraries. A minimal (Java) implementation of the utility using those libraries might be this (params bolded, arg-parsing omitted for clarity, assume aurora assigned "55555" as port "netcat"): public class AnnouncerMain { public static void main(String... args) throws Exception { Amount<Long, Time> zkTimeout = Amount.of(10L, Time.SECONDS); InetSocketAddress zkEnsembleAddress = new InetSocketAddress(*"zookeeper.example.com <http://zookeeper.example.com>"*, *2181*); ZooKeeperClient zkClient = new ZooKeeperClient(zkTimeout, zkEnsembleAddress); ServerSet serverSet = new ServerSetImpl(zkClient, *"/service/netcat-service"*); InetSocketAddress announcedAddress = new InetSocketAddress(InetAddress.getLocalHost().getHostName(), *55555*); serverSet.join(announcedAddress, Collections.emptyMap(), ALIVE); for(;;) Time.sleep(0.1); } } Then each active instance of our service will have a znode under /service/netcat-service containing the hostname and port number of the instance. The client can then use ServerSet#monitor to watch for changes. There's also a Python implementation that works relatively the same way and is interoperable [3]. [1] http://linux.die.net/man/1/nc [2] http://twitter.github.io/commons/apidocs/com/twitter/common/zookeeper/ServerSet.html [3] https://github.com/twitter/commons/blob/master/src/python/twitter/common/zookeeper/serverset/serverset.py On Mon, Jan 6, 2014 at 10:40 AM, vonPuh fonPuhendorf < vonpuhfonpuhend...@gmail.com> wrote: > hi some help with aurora announcing third party service with the help of > twitter commons libray >