RabbitMQ
文章目录
1、架构及组件
RabbitMQ采用C/S架构,通常包含Producer、Consumer、Exchange、Queue 、Connection、Channel等组件。
Producer
生产者,负责生产消息。
Consumer
消费者,负责消费消息。可以有多个消费者。
Exchange
交换器,负责消息的分发。根据生产者传递过来的路由信息,即route key,与binding key联合来进行消息的分发,或者说具体分发给哪个Queue。不同的工作模式,有不同的分发规则。交换器主要包含四种类型,分别为fanout(广播),direct(精确匹配),topic(模糊匹配)和headers(消息头匹配)。详见附录**[工作模式]**
Queue
队列,负责消息的存储。RabbitMQ默认数据是存放在内存中,当然如果是重要的消息还是存储在物理存储中稳妥点。当消费者消费队列的数据并发回了ACK确认时,RabbitMQ服务器才会将内存中的数据,即队列Queue中的数据,标记为删除,并在之后某个时刻进行实际删除。
Connection
应用程序和Server(Broker)的网络连接,Server接受Client连接,实现AMQP服务。
Channel
网络信道,读写都是在Channel中进行(NIO的概念),包括对MQ进行的一些操作(例如clear queue等)都是在Channel中进行,客户端可建立多个Channel,每个Channel代表一个会话任务。
Broker
消息代理: 实际上就是消息服务器实体。
VHost
虚拟主机,一个Broker里可以开设多个VHost,用作不同用户的权限分离,或者APP的不同业务分离。
2、安装
linux安装
# 安装epel源
yum install -y epel-release
# 安装erlang(rabbitmq是erlang语言编写的)
yum install -y erlang
# 去官网查看需要下载的版本
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el7.noarch.rpm
# 用yum安装wget下来的rpm包
yum install -y rabbitmq-server-3.6.15-1.el7.noarch.rpm
启动服务
# 启动服务
systemctl start rabbitmq-server
# 设置开机自启
systemctl enable rabbitmq-server
# 检查服务是否启动
systemctl list-unit-files --type=service | grep rabbitmq
开启web管理界面
rabbitmq安装启动以后,默认是没有开启web管理界面的,通过rabbitmq-plugins list命令可列出插件的启用和禁用状态。
# 开启插件,web管理默认端口为15672
rabbitmq-plugins enable rabbitmq_management
# 创建admin用户
rabbitmqctl add_user admin admin
# 授权none、management、policymaker、monitoring、administrator
rabbitmqctl set_user_tags admin administrator
通过访问ip:15672的形式打开web界面,访问不了的话关闭防火墙和SELINUX试下
3、常用命令
rabbitmqctl stop_app:关闭应用
rabbitmqctl start_app:启动应用
rabbitmqctl status:节点状态
rabbitmqctl add_user username password:添加用户
rabbitmqctl set_user_tags admin administrator 设置用户权限
rabbitmqctl list_users:列出所有用户
rabbitmqctl delete_user username:删除用户
rabbitmqctl clear_permissions -p vhostpath username:清除用户权限
rabbitmqctl list_user_permissions username:列出用户权限
rabbitmqctl change_password username newpassword:修改密码
rabbitmqctl add_vhost vhostpath:创建虚拟主机
rabbitmqctl list_vhosts:列出所有虚拟主机
rabbitmqctl list_permissions -p vhostpath:列出虚拟主机上所有权限
rabbitmqctl delete_vhost vhostpath:删除虚拟主机
rabbitmqctl list_queues:查看所有队列信息
rabbitmqctl -p vhostpath purge_queue blue:清除队列里的消息
rabbitmqctl reset:移除所有数据,要在rabbitmqctl stop_app之后使用
rabbitmqctl join_cluster [–ram]:组成集群命令
rabbitmqctl cluster_status:查看集群状态
rabbitmqctl change_cluster_node_type disc | ram:修改集群节点的存储形式
rabbitmqctl forget_cluster_node {–offline} 忘记节点 (摘除节点)
rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2…] (修改节点名称)
4、python实现MQ
以exchange-direct的方式,实现MQ
Producer端:
import pika
#认证 设置账号密码
credentials = pika.PlainCredentials('admin','admin')
#创建连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
'192.168.66.135',5672,'/',credentials))
#建立信道
channel = connection.channel()
channel.exchange_declare(exchange='exchange-direct',
exchange_type='direct')
# 声明queue,durable=True 队列持久化
channel.queue_declare(queue='hello', durable=True)
#绑定队列与交换器
channel.queue_bind(exchange="exchange-direct",
queue="hello",
routing_key="test")
#发送消息
channel.basic_publish(exchange='exchange-direct',
routing_key='test',
body='Hello World!!!',
properties=pika.BasicProperties(
delivery_mode=2, # 持久化存储
))
print(" [x] Sent 'Hello World!'")
connection.close()
Concumer端:
import pika,os,sys
def main():
#设置账号密码
credentials = pika.PlainCredentials('admin','admin')
#创建连接
connection = pika.BlockingConnection(pika.ConnectionParameters(
'192.168.66.135',5672,'/',credentials))
#建立信道
channel = connection.channel()
#是为了防止没找到queue队列名称报错
channel.queue_declare(queue='hello', durable=True)
#处理消息
def callback(ch, method, properties, body):
print(" [x] Received %r" % 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()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Interrupted')
try:
sys.exit(0)
except SystemExit:
os._exit(0)
5、附录
RabbitMQ模拟项目: http://tryrabbitmq.com
官方文档: https://www.rabbitmq.com/documentation.html
工作模式: https://www.rabbitmq.com/getstarted.html