ルーティング
この場合、我々は、より多くの機能を尽くすまだコンソールにすべての情報を印刷することができながら、たとえば、のみ、(スペースを節約するために)ログファイルに誤ったメッセージを送信します
これは、我々はbinding_keyを作成しようとしている方法ですbinding_keyバインディングは、混乱を防ぐために余分なパラメータrouting_key、およびbasic_publishパラメータを持って、我々はそれを呼び出します:
channel.queue_bind(exchange=exchange_name,
queue=queue_name,
routing_key='black')
これは、バインドキーが交換のタイプに依存することを意味し、交換以前に使用ファンアウト交換は、その値を無視します
直接交換
すべての消費者にブロードキャストチュートリアルシステムの前にログ内のすべての情報は、我々は重大度に基づいて情報をフィルタリングできるように拡張したい、例えば、我々は唯一の重大なエラー、警告または情報のログを受け取り、ディスクスクリプトに書かれたメッセージを記録することもできますメッセージには、スペースを無駄にしません。
我々は、それが唯一の無意識放送することができ、それは私たちにあまりにも多くの柔軟性を持っていないファンアウト交換を使用します
私たちは、直接交換ルーティングが非常に簡単で、直接交換の代わりに使用する、結合および結合ルーティングキーはキューに一致するにメッセージは、この点を説明するために、以下の設定を検討してください。
この設定では、我々は、それが2、1にバインドされている第二は、別の黒のキーバインディングであることをバインドされている、オレンジ色をバインドする最初のキューに、直接交換Xと2つのキューバインディングを見ることができますグリーン。
この構成では、オレンジ色のメッセージのルーティングキーにスイッチによって公開は、キューQ1にルーティングされます。ルーティングキーは、Q2へのメッセージ黒色又は緑色です。他のすべてのメッセージは破棄されます。
複数の結合
同じ結合キーは完全に合法であると複数のキューを結合することは、我々は黒鍵ファンアウトを向上させることができ、これは結合の例では、黒鍵メッセージルーティングとして、XおよびキューQ1との間のすべてのマッチングにブロードキャスト、類似していますこれは、Q1、Q2に送信されます
発光ログ
私たちは、キーをルーティングなどの重大なジャーナルを提供しますので、スクリプトがあなたは私たちが発光に焦点を当ててみましょう、受信するログの重要度を受信するために選択され、我々は交換をcirectにメッセージを送信する、場所のファンアウトにこのモードのロギングシステムを使用します。
まず、交換を作成する必要があります
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
その後、メッセージを送信
channel.basic_publish(exchange='direct_logs',
routing_key=severity,#不能删除
body=message,
properties=pika.BasicProperties(delivery_mode=2,#make message persistent
))
物事を単純化するために、私たちは「重要度」は「情報」、「警告」、「エラー」のいずれかであることを前提とします。
購読
メッセージを受信し、一つの例外を除いて、前と同じで、私たちは、新しいバインディングと各関連の重症度を作成します。
result = channel.queue_declare(queue='',exclusive=True)
queue_name = result.method.queue
for severity in severities:
channel.queue_bind(exchange='direct_logs',
queue=queue_name,
routing_key=severity)
すべてを一緒に入れて
direct_send.py
# -*- coding: utf-8 -*-
#send端
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))#默认端口5672,可不写
#创建通道,声明一个管道,在管道里发送消息
channel = connection.channel()
#在管道里声明queue
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
severity = sys.argv[1] if len(sys.argv)>1 else 'info'
message = ''.join(sys.argv[2:]) or "Hello World"
#一条消息永远不能直接发送到队列,它总需要经过一个交换exchange
channel.basic_publish(exchange='direct_logs',
routing_key=severity,#不能删除
body=message,
properties=pika.BasicProperties(delivery_mode=2,#make message persistent
))#设置routing_key(消息队列的名称)和body(发送的内容)
print("[x] Sent %r" % message)
connection.close()#关闭连接,队列关闭
direct_receive.py
# -*- coding: utf-8 -*-
#receiving(消费者接收者)
import pika
import time
import sys
#创建一个连接
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost'))#默认端口5672,可不写
#创建通道,声明一个管道,在管道里发送消息
channel = connection.channel()
#把消息队列的名字为hello,把消费者和queue绑定起来,生产者和queue的也是hello
#为什么又声明了一个hello队列
#如果确定已经声明了,可以不声明。但是你不知道那个机器先运行,所以要声明两次
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
#不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
result = channel.queue_declare(queue='',exclusive=True)
queue_name = result.method.queue
severities = sys.argv[1:]
if not severities:
sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit(1)
for severity in severities:
channel.queue_bind(exchange='direct_logs',
queue=queue_name,
routing_key=severity)
#回调函数get消息体
def callback(ch,method,properties,body):#四个参数为标准格式
#管道内存对象,内容相关信息
#print("打印看下是什么:",ch,method,properties) #打印看下是什么
print(" [x] Received %r:%r" % (method.routing_key,body))
ch.basic_ack(delivery_tag=method.delivery_tag)#消息确认
#消费消息
channel.basic_consume(
queue=queue_name,#你要从那个队列里收消息
on_message_callback=callback,#如果收到消息,就调用callback函数来处理消息
auto_ack=True #写的话,如果接收消息,机器宕机消息就丢了
#一般不写,宕机则生产者检测到发给其他消费者
)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming() #创建死循环,监听消息队列,可使用CTRL+C结束监听