部分内容参考:
金角大王等待唐僧的日子RabbitMQT部分内容
RabbitMQ官网文档
Ubuntu环境下 RabbitMQ安装 简单使用
windows环境下 RabbitMQ 安装
当前使用版本:python3.7
python不同版本,语法、参数名称、参数位置可能有变化,注意根据不同版本api调试即可。
基础
RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。RabbitMQ将发送消息和接收消息进行解耦,由此来实现应用程序的异步处理。如果将RabbitMQ视为一个服务,从大方向来看,RabbitMQ做了三件事情:
- 收取请求
- 存储请求消息
- 分发请求
引用官网原文,你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。
名词解释
生产(Prouducing)意思就是发送,发送消息的应用程序就是一个(Prouducer),一般用“P”表示。
队列(Queue),生产者将消息发送给RabbitMQ,是指发送给RabbitMQ的一个队列。多个生产者可以同时给一个队列发送消息,同时多个消费者也可以同时从队列取消息。
**消费者(Consuming)**就是接收消息。一个消费者(Consumer)就是一个等待接收消息的应用程序
初次使用
如果用远端服务器上的rabbitmq,需要创建对应的用户和授权。
远程连接rabbitmq server的话,需要配置权限 噢
首先在rabbitmq server上创建一个用户
sudo rabbitmqctl add_user xiaoxia xiaoxia
同时还要配置权限,允许从外面访问
sudo rabbitmqctl set_permissions -p / xiaoxia ".*" ".*" ".*"
连接客户端的时候需要认证参数
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
connection = pika.BlockingConnection(pika.ConnectionParameters(
'10.211.55.5',5672,'/',credentials))
channel = connection.channel()
send.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# -*- Author:砍柴少年
# -*- qq:335441537
import pika
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
# 获取连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
'47.244.*.*', 5672, '/', credentials))
# 声明queue
channel = connection.channel()
# 声明queue
channel.queue_declare(queue='hello')
# n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
receive.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# -*- Author:砍柴少年
# -*- qq:335441537
import pika
credentials = pika.PlainCredentials('xiaoxia', 'xiaoxia')
connection = pika.BlockingConnection(pika.ConnectionParameters(
'47.244.*.*', 5672, '/', credentials))
channel = connection.channel()
# You may ask why we declare the queue again ‒ we have already declared it in our previous code.
# We could avoid that if we were sure that the queue already exists. For example if send.py program
# was run before. But we're not yet sure which program to run first. In such cases it's a good
# practice to repeat declaring the queue in both programs.
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
print(" [x] Received %s" % body)
channel.basic_consume(queue='hello',
on_message_callback=callback,
auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
分析:?例子,运行N个receiver端,你会发现send一次后,N个receiver端只有一个会接收。每次send发送一次消息后,N个receiver会轮流有一个去接收消息数据。