Created
December 31, 2014 20:50
-
-
Save tylertreat/9ae814508985a7217f4b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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