Skip to content

Instantly share code, notes, and snippets.

@tylertreat
Created December 31, 2014 20:50
Show Gist options
  • Save tylertreat/9ae814508985a7217f4b to your computer and use it in GitHub Desktop.
Save tylertreat/9ae814508985a7217f4b to your computer and use it in GitHub Desktop.
from collections import defaultdict
import random
from nanomsg import NanoMsgAPIError
from nanomsg import Socket
from nanomsg import SURVEYOR
from nanomsg import SURVEYOR_DEADLINE
class ServiceDiscovery(object):
def __init__(self, port, deadline=5000):
self.socket = Socket(SURVEYOR)
self.port = port
self.deadline = deadline
self.services = defaultdict(set)
def bind(self):
self.socket.bind('tcp://*:%s' % self.port)
self.socket.set_int_option(SURVEYOR, SURVEYOR_DEADLINE, self.deadline)
def discover(self):
if not self.socket.is_open():
return self.services
self.services = defaultdict(set)
self.socket.send('service query')
while True:
try:
response = self.socket.recv()
except NanoMsgAPIError:
break
service, address = response.split('|')
self.services[service].add(address)
return self.services
def resolve(self, service):
providers = self.services[service]
if not providers:
return None
return random.choice(tuple(providers))
def close(self):
self.socket.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment