Python은 RabbitMQ 서버를 작동하여 메시지 대기열 라우팅을 구현합니다.

高洛峰
풀어 주다: 2017-03-01 14:03:11
원래의
1268명이 탐색했습니다.

RabbitMQ는 메시지 큐 서버입니다. 여기서는 Python을 사용하여 RabbitMQ 서버를 작동하여 메시지 큐의 라우팅 기능을 구현하는 방법을 알아보기 위해 Python+Pika+RabbitMQ의 서버 측 환경을 살펴보겠습니다. 🎜>Python은 Pika 라이브러리(설치:sudo pip install pika)를 사용하여 RabbitMQ 메시지 큐 서버(설치: sudo apt-get install Rabbitmq-server)를 작동할 수 있습니다. 여기서는 MQ 관련 라우팅 기능을 살펴보겠습니다.

라우팅 키 구현

예를 들어 메시지를 모든 수신자에게 전송해야 하는 시나리오가 있지만 자유롭게 사용자 정의해야 하는 경우 일부 메시지는 일부 수신자에게 전송되고 일부 메시지는 다른 수신자에게 전송됩니다. 어떻게 해야 합니까? 이 경우 라우팅 키가 사용됩니다.

라우팅 키의 작동 원리: 각 수신 측의 메시지 큐가 스위치에 바인딩되면 해당 라우팅 키를 설정할 수 있습니다. 발신자가 스위치를 통해 정보를 보낼 때 라우팅 키를 지정할 수 있으며, 스위치는 라우팅 키를 기반으로 해당 메시지 대기열에 메시지를 보내 수신 측에서 메시지를 받을 수 있습니다.

이전 기사에 이어 여전히 send.py 및 receive.py를 사용하여 라우팅 키 기능을 시뮬레이션합니다. send.py는 송신측을 나타내고 receive.py는 수신측을 나타냅니다. 인스턴스의 기능은 정보, 경고, 오류의 세 가지 수준의 정보를 서로 다른 수신 측에 보내는 것입니다.

send.py 코드 분석

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#定义三个路由键
routings = ['info', 'warning', 'error']
 
#将消息依次发送到交换机,并设置路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()
로그인 후 복사

receive.py 코드 분석

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为direct
channel.exchange_declare(exchange='messages', type='direct')
 
#从命令行获取路由键参数,如果没有,则设置为info
routings = sys.argv[1:]
if not routings:
  routings = ['info']
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
로그인 후 복사

두 개의 터미널을 열고 하나에서 python receive.py info warning 코드를 실행하면 정보와 경고 메시지만 수신됩니다. 다른 터미널에서 send.py를 실행하면 수신 터미널이 정보와 경고 메시지만 받는 것을 볼 수 있습니다. 여러 터미널을 열고 receive.py를 실행하고 다양한 라우팅 키 매개변수를 전달하면 더 확실한 효과를 볼 수 있습니다.

수신측이 실행 중일 때 Rabbitmqctl list_bounds를 사용하여 바인딩 상태를 볼 수 있습니다.

라우팅 키 퍼지 매칭

라우팅 키 퍼지 매칭은 일반적으로 사용되는 정규 표현식과 달리 정규 표현식을 사용할 수 있다는 의미입니다. 여기서 "#"은 모두, 모두를 의미합니다. ; "*"는 한 단어만 일치합니다. 예제를 읽어보시면 이해가 되실 겁니다.
위의 예에 이어 send.py 및 receive.py는 여전히 라우팅 키의 퍼지 매칭 기능을 구현하는 데 사용됩니다. send.py는 송신측을 나타내고 receive.py는 수신측을 나타냅니다. 예의 기능은 대략 다음과 같습니다. 예를 들어 가까운 친구가 있으면 그 사람과 행복, 슬픔, 일 또는 삶에 대해 이야기할 수 있고, 행복한 것을 공유할 수 있는 친구도 있습니다. 행복한 일을 함께 나눌 수 있는 친구 몇 명과 함께 불행한 일에 대해 이야기할 수 있습니다.

send.py 코드 분석

라우팅 키 퍼지 매칭이 필요하므로 스위치 유형을 topic으로 설정해야 하며, topic으로 설정하면 #, * 매칭 기호를 사용할 수 있습니다.

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#定义路由键
routings = ['happy.work', 'happy.life', 'sad.work', 'sad.life']
 
#将消息依次发送到交换机,并设定路由键
for routing in routings:
  message = '%s message.' % routing
  channel.basic_publish(exchange='messages',
             routing_key=routing,
             body=message)
  print message
 
connection.close()
로그인 후 복사

위의 예에서는 네 가지 유형의 메시지가 정의되어 있으며 이해하기 쉬우므로 순서대로 전송되지 않습니다.

receive.py 코드 분석

마찬가지로 스위치 유형을 주제로 설정해야 합니다. 명령줄에서 매개변수를 수신하는 기능이 약간 조정되었습니다. 즉, 매개변수가 없으면 오류와 함께 종료됩니다.

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定义交换机,设置类型为topic
channel.exchange_declare(exchange='messages', type='topic')
 
#从命令行获取路由参数,如果没有,则报错退出
routings = sys.argv[1:]
if not routings:
  print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)
  exit()
 
#生成临时队列,并绑定到交换机上,设置路由键
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
for routing in routings:
  channel.queue_bind(exchange='messages',
            queue=queue_name,
            routing_key=routing)
 
def callback(ch, method, properties, body):
  print " [x] Received %r" % (body,)
 
channel.basic_consume(callback, queue=queue_name, no_ack=True)
 
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
로그인 후 복사

4개의 터미널을 엽니다. 그 중 하나는 다음과 같이 실행되며, 이는 그녀에게 무엇이든 이야기할 수 있음을 나타냅니다.

python receive.py "#"
로그인 후 복사

다른 터미널은 다음과 같이 실행되며, 이는 그녀와 행복한 것을 공유할 수 있음을 나타냅니다.

python receive.py "happy.*"
로그인 후 복사

세 번째 터미널은 다음과 같이 실행됩니다. 다음과 같이 직장에서 그녀와 사물을 공유할 수 있음을 나타냅니다.

python receive.py "*.work"
로그인 후 복사

마지막 것은 python send.py를 실행합니다. 결과는 상상하기 쉬우므로 여기에는 게시하지 않겠습니다.

Python이 메시지 큐 라우팅을 구현하기 위해 RabbitMQ 서버를 운영하는 것과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!