1.1 Introduction to the contents of this section
This part we are going to send a message to multiple consumer, which is called "Publish/subscribe"
The way we do this is the sending side, sending a message, and at the same time, multiple receivers will receive the message and print it on the screen at the same time.
1.2exchange Introduction
In the previous blog post, we explained that the sender sends a message to the message queue and the receiving side obtains the message from the message queue. Now let's introduce the complete messaging model for RABBITMQ.
>producer: The application used to send messages
>queue: The cache used to store messages
>consumer: The application used to receive messages
The core of the messaging model is that producer never sends a message directly to the queue, but rather, it is a simple thing to pass the message to Exchange,exchange, on one side, he receives the message from producer and the other side transmits the message to the queue. Exchange sends a message to your queue, or to more than one queue, which is primarily determined by the type of exchange. The model diagram is as follows:
There are many type of exchange available, as follows: Direct, topic, headers, fanout. This blog for fanout explanation, follow-up blog for other types of explanation, let us create a exchange,type for fanout, named logs, the code is as follows:
Channel.exchange (exchange='logs', type='fanout')
For exchange of type fanout, it is very simple to understand that it will receive the message and broadcast it to all of the queues he knows, that is, all the queues that he has established to connect to. The previous post dropped to the command line to view the List_exchanges command as follows:
$: sudo rabbitmqctl list_exchanges Listing Exchanges ... logs fanoutamq.direct Directamq.topic topicamq.fanout fanout amq.headers headers ... done.
For, you'll see a lot of amq.* exchange, which is set up by default, and when you don't build Exchange, the system defaults to the top few.
The Publish function for the message basic_publish () also changes to the following:
Channel.basic_publish (exchange='logs', routing_key=', Body=message)
1.3 Temporary queue
As you learned before, for a queue, you will have your own name (hello or something),
First of all:
result = Channel.queue_declare ()
Then, by Result.method.queue, the system will give the queue a random name.
If we want producer to disconnect from consumer, the queue is deleted, then it needs to be changed to the following code:
result = Channel.queue_declare (exclusive=true)
1.4Bingings (Bind queue to Exchange)
The model diagram is as follows:
We've created an exchange of type fanout, and now we're going to tell Exchange to send the message to our own defined queue, which is the binding for the connection between Exchange and queue, the code is as follows:
Channel.queue_bind (exchange='logs', Queue=result.method.queue)
At the command line, view the list of binding commands as follows:
$: sudo rabbitmqctl list_bindings
1.5 Final Code
The final model is as follows:
The send.py code is as follows:
ImportPikaImportsysconnection=Pika. Blockingconnection (Pika. Connectionparameters (Host='localhost')) Channel=Connection.channel () channel.exchange_declare (Exchange='logs', type='fanout') Message=' '. Join (sys.argv[1:])or "Info:hello world!" #If the keyboard has input, the message is keyboard input, if the keyboard is not entered, messages message= "Info:hello world!" ;Channel.basic_publish (exchange='logs', routing_key="', Body=message)Print "[x] Sent%r"% (message,) Connection.close ()
receive.py Code
Importpikaconnection=Pika. Blockingconnection (Pika. Connectionparameters (Host='localhost')) Channel=Connection.channel () channel.exchange_declare (Exchange='logs', type='fanout') Result= Channel.queue_declare (exclusive=True) queue_name=Result.method.queuechannel.queue_bind (Exchange='logs', Queue=queue_name)Print '[*] waiting for logs. To exit Press CTRL + C'defCallback (ch, method, properties, body):Print "[x]%r"%(body,) Channel.basic_consume (callback, queue=queue_name, No_ack=True) channel.start_consuming ()
1.6 Code Testing
Open a command-line window and run send.py:
$: Python send.py #(at this point you are transmitting the content Info:hello world! ) or #message for the content you want to send
Open two command-line windows, run receive.py, two windows you will see the same message output:
$: Python receive.py
RabbitMQ (Python implementation) learning two: Producer sending messages to multiple message queues queue (broadcast messages)