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 중국어 웹사이트를 주목하세요!