RabbitMQ

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值