[파이썬] Tornado에서의 서비스 발견

Tornado은 파이썬으로 작성된 비동기 웹 프레임워크입니다. 이런 프레임워크에서는 서비스 발견이 중요한 요소 중 하나입니다. 서비스 발견은 다른 서비스와의 통신을 위해 서비스의 위치 정보를 알아내는 과정을 뜻합니다.

Tornado와 서비스 발견

Tornado는 기본적으로 단일 서버 운영을 지원하지만, 실제 환경에서는 여러 호스트와 서비스가 연결되어 있을 수 있습니다. 그러므로 다른 서비스를 찾는 기능이 필요합니다. 물론 다른 라이브러리나 서비스 디스커버리 툴을 사용할 수도 있지만, Tornado에서 직접 서비스 발견을 구현하는 것도 가능합니다.

Zookeeper와의 통합

Zookeeper는 Apache Software Foundation에서 개발된 분산 코디네이터 서비스로서, 고가용성과 확장성을 제공합니다. Tornado와 Zookeeper를 통합하여 서비스 발견 기능을 구현하는 것은 간단합니다.

import tornado.ioloop
import tornado.web
import tornado.gen
from kazoo.client import KazooClient

class ServiceDiscovery:
    def __init__(self):
        self.zk = KazooClient(hosts='127.0.0.1:2181')
        self.zk.start()

    def discover_service(self, service_name):
        @tornado.gen.coroutine
        def get_service_hosts():
            hosts = yield self.zk.get_children(f'/services/{service_name}')
            raise tornado.gen.Return(hosts)

        return tornado.gen.convert_yielded(get_service_hosts())

class MainHandler(tornado.web.RequestHandler):
    def initialize(self, service_discovery):
        self.service_discovery = service_discovery

    @tornado.gen.coroutine
    def get(self):
        service_name = self.get_argument('service_name')
        hosts = yield self.service_discovery.discover_service(service_name)
        self.write(f"Discovered {len(hosts)} hosts for service {service_name}")

def make_app():
    service_discovery = ServiceDiscovery()
    return tornado.web.Application([
        (r'/', MainHandler, dict(service_discovery=service_discovery)),
    ])

if __name__ == '__main__':
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위의 예시 코드에서 ServiceDiscovery 클래스는 Zookeeper와 연결하고 discover_service 메서드를 통해 서비스를 발견합니다. MainHandler 클래스에서는 ServiceDiscovery 인스턴스를 인자로 받아서 해당 인스턴스를 사용하여 서비스를 발견하고 결과를 반환합니다.

결론

Tornado에서의 서비스 발견은 분산 환경에서 여러 서비스 간의 원활한 통신을 위해 매우 중요합니다. Zookeeper와의 통합을 통해 Tornado에서 간단하게 서비스 발견 기능을 구현할 수 있습니다. 이를 통해 Tornado 애플리케이션을 보다 유연하고 확장 가능하게 만들 수 있습니다.