KS blog

killins.egloos.com

포토로그



RabbitMQ with Python #1/6 by KillinS

RabbitMQ를 지원하는 파이썬 라이브러리들에는 아래와 같은 것들이 있다.
  • py-amqplib
  • txAMQP
  • pika
RabbitMQ 공식 사이트에서 사용하는 파이썬용 라이브러리는 pika이므로, 이것을 이용해서 간단한 producer, queue, consumer 예제 프로그램(Hello world?)를 만들어보도록 한다. producer 프로그램은 send.py, consumer는 receive.py, 큐의 이름은 hello로 한다.


1. pika 설치

우선 아래와 같이 pika를 설치한다.

    $ sudo pip install pika


2. producer 작성

pika 설치가 끝나면 먼저 메시지를 생성할 producer를 작성한다. producer에서 해야 할 일은 브로커(exchange)와 연결하고, 메시지를 보낼 큐를 설정(또는 큐를 생성)한 뒤 메시지를 브로커로 보내면 된다.

우선 RabbitMQ 메시지 브로커와 연결을 설정한다. Producer와 consumer가 같은 서버에 존재한다고 가정하므로 localhost로 설정해주면 된다.

    import pika
    connection = pika.BlockingConnection(
                         pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()

다음으로 메시지를 전달할 큐를 생성한다.

    channel.queue_declare(queue='hello')

이제 전달할 메시지를 큐를 통해 publish한다. 메시지는 "Hello World!"로 보내고, 전달이 끝나면 끝났다는 메시지를 화면에 출력하고 브로커와의 연결을 끊는다. basic_publish의 인자를 보면 exchange를 지정하는것을 알 수 있는데, 예제에서는 우선 기본 exchange를 사용하도록 한다.

    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print " [x] Sent 'Hello World!'"
    connection.close()

send.py의 전체 코드는 아래와 같다.

    #!/usr/bin/env python
    import pika

    connection = pika.BlockingConnection(
                         pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='hello')
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print " [x] Sent 'Hello World!'"
    connection.close()


3. consumer 작성

이제 큐로부터 메시지를 전달받을 consumer를 작성한다. consumer가 할 일은 브로커와 연결을 설정하고 메시지를 받아올 큐를 설정한 뒤 메시지를 받아와 처리하는 것이다.

우선 브로커와의 연결을 설정한다. 이부분은 producer와 동일하게 작성하면 된다.

    import pika
    connection = pika.BlockingConnection(
                         pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()

다음으로 메시지를 전달받을 큐를 설정한다. 사실 메시지를 수신하기위해 별도로 큐를 설정할 필요는 없고, 메시지를 수신할 때 어떤 큐에서 수신할지를 명시해주면 되지만 큐가 확실히 생성되어 있지 않다면 에러가 발생할 수 있으므로 producer에서 했던것과 마찬가지로 큐를 생성하도록 한다. 같은 이름으로 여러곳에서 큐를 생성하더라도 큐는 최초에 오직 하나만 생성되므로 이런식으로 큐의 생성 여부를 확실히 해주는것도 좋다.

    channel.queue_declare(queue='hello')

이제 메시지를 수신하여 처리해주면된다. RabbitMQ에서는 메시지 수신 및 처리를 콜백함수를 통하여 수행한다. 즉, 메시지를 수신하여 처리할 부분을 함수로 선언하고 이것을 브로커(RabbitMQ)에 넘겨주면 브로커가 해당 메시지 수신 시 해당 함수를 호출하여 처리하는 방식으로 수행되는 것이다. 메시지 처리는 수신한 메시지를 화면에 출력하는것으로 한다.

    def callback(ch, method, properties, body):
        print " [x] Received %r" % (body,)
    channel.basic_consume(callback, queue='hello', no_ack=True)

메시지 처리에 대한 설정이 끝나면 메시지 처리를 작동시킨다.

    channel.start_consuming()

receive.py의 전체 코드는 아래와 같다.

    #!/usr/bin/env python
    import pika

    def callback(ch, method, properties, body):
        print " [x] Received %r" % (body,)

    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='hello')
    channel.basic_consume(callback, queue='hello', no_ack=True)
    print ' [*] Waiting for messages. To exit press CTRL+C'
    channel.start_consuming()


4. 테스트

이제 consumer를 먼저 실행시키고 producer를 실행시켜보면 메시지가 정상적으로 처리됨을 확인할 수 있다.

  $ python receive.py

  $ python send.py



* 출처 : www.rabbitmq.com



핑백

  • KS blog : RabbitMQ with Python #2 2013-05-20 17:59:46 #

    ... 답이 불가능한, 또는 불필요한 작업들에 대하여 (async) 각각의 작업들을 처리하는 프로세스들에 균등하게 작업을 분배하는, 말그대로 큐잉을 위함이 대부분일 것이다. 예제 #1은 요청에 대한 즉시 응답을 구현해보았으니 이런 MQ의 기본 기능을 덧붙여 보도록 한다. 우선 테스트를 위해 처리하는 작업에 다소 시간이 걸리도록 프로그램을 변 ... more