[python] Tornado와 메시지 큐 시스템 연동

Tornado는 Python으로 작성된 비동기 웹 프레임워크로서, 고성능 네트워크 애플리케이션을 개발하는 데 사용됩니다. 메시지 큐 시스템은 분산 시스템 간의 통신을 위한 중간 매개체로 사용됩니다. Tornado와 메시지 큐 시스템을 연동하여 비동기 메시지 전송을 구현하는 방법에 대해 알아보겠습니다.

RabbitMQ와 Tornado 연동

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)을 지원하는 오픈소스 메시지 큐 시스템입니다. Tornado와 RabbitMQ를 연동하여 비동기 메시지 전송을 구현할 수 있습니다.

먼저, RabbitMQ의 Python 클라이언트인 pika를 설치해야 합니다:

pip install pika

다음은 Tornado와 RabbitMQ를 연동하여 메시지를 송신하는 예제 코드입니다:

import pika

class MainHandler(tornado.web.RequestHandler):
    def initialize(self, connection, channel):
        self.connection = connection
        self.channel = channel
        
    def get(self):
        self.channel.basic_publish(exchange='', routing_key='my_queue', body='Hello, Tornado!')

def make_app():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='my_queue')
    return tornado.web.Application([
        (r"/", MainHandler, dict(connection=connection, channel=channel)),
    ])

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

위 코드에서 MainHandler는 Tornado의 RequestHandler를 상속받은 클래스로, GET 요청을 처리하는 핸들러입니다. initialize 메서드에서는 RabbitMQ 연결과 채널을 초기화합니다. get 메서드에서는 channel.basic_publish를 호출하여 메시지를 송신합니다.

make_app 함수에서는 RabbitMQ에 연결된 connectionchannel을 인자로 받아 Tornado 애플리케이션을 초기화합니다. channel.queue_declare를 통해 큐를 선언하고, MainHandler를 URL 핸들러로 등록합니다.

마지막으로, app.listen을 통해 서버를 시작하고, tornado.ioloop.IOLoop.current().start()를 호출하여 이벤트 루프를 시작합니다.

Kafka와 Tornado 연동

Kafka는 대규모 분산 메시지 스트리밍 플랫폼입니다. Kafka와 Tornado를 연동하여 메시지를 송신하고 수신하는 방법을 알아보겠습니다.

먼저, Kafka의 Python 클라이언트인 kafka-python을 설치해야 합니다:

pip install kafka-python

다음은 Kafka와 Tornado를 연동하여 메시지를 송신하는 예제 코드입니다:

from kafka import KafkaProducer

class MainHandler(tornado.web.RequestHandler):
    def initialize(self, producer):
        self.producer = producer
        
    def get(self):
        self.producer.send('my_topic', b'Hello, Tornado!')

def make_app():
    producer = KafkaProducer(bootstrap_servers=['localhost:9092'])
    return tornado.web.Application([
        (r"/", MainHandler, dict(producer=producer)),
    ])

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

위 코드에서 MainHandler는 Tornado의 RequestHandler를 상속받은 클래스로, GET 요청을 처리하는 핸들러입니다. initialize 메서드에서는 Kafka 프로듀서를 초기화합니다. get 메서드에서는 producer.send를 호출하여 메시지를 송신합니다.

make_app 함수에서는 Kafka에 연결된 프로듀서를 인자로 받아 Tornado 애플리케이션을 초기화합니다. MainHandler를 URL 핸들러로 등록하고, app.listen을 통해 서버를 시작합니다.

결론

Tornado와 메시지 큐 시스템을 연동하는 것은 비동기 메시지 전송을 구현하는 데 매우 유용합니다. 이 글에서는 RabbitMQ와 Kafka를 예시로 들었지만, 다른 메시지 큐 시스템과도 마찬가지로 비슷한 방식으로 연동할 수 있습니다. Tornado와 메시지 큐 시스템을 연동하여 확장 가능하고 성능 좋은 웹 애플리케이션을 개발할 수 있습니다.