• Python操作RabbitMq


    一:介绍

    简介

    RabbitMq本质就是一个消息中间人(broker),它接受并且发送消息,可以将其比喻成一个邮局,当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, RabbitMQ 就是一个邮筒, 同时也是邮局和邮递员 

    在上述比喻中不同点在于RabbitMq不处理纸质信件,而是接收(accept),存储(storage),转发(forwards)二进制数据消息(messages)

    术语

    Broker:消息队列服务器实体,接收和分发消息的应用

    Exchange:消息交换机,其指定消息按什么规则 路由到那个队列里

    Queue:消息队列载体,每个消息可以投放到一个或多个队列中

    Binding:绑定 将exchange交换机与Queue队列绑定在一起

    Routing Key:路由关键字,消息发送给exchange交换机的时候 会有一个路由键(默认为空),交换机根据这个路由键进行消息的分发到哪个队列之中

    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

    producing:在这里的意思就是发送(sending). 一个发送消息的程序就是生产者( producer)

    consuming :与接收(receiving)有相似的含义. 消费者(consumer)就是等待接收消息的程序

    channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

     要注意的是 生产者, 消费者, 和中间人不必在相同的主机上,实际上大多数情况下它们都不在同一台主机上

    消息队列机制

    客户端打开一个消息队列服务器,声明一个channel

    客户端声明一个exchange并且设置相关属性

    客户端声明一个Queue并且设置相关属性

    客户端使用Routing Key设置exchange与queue之间的绑定关系

    exchange接收到消息后,就根据消息的key和已经设置的binding,将消息投递到一个或多个队列里。

    exchange类型

    Direct交换机

    特点:根据key进行投递

    例如:Routing key为hello 那么当客户端发送消息的时候只有设置了key为hello的消息才可以投递到队列

    Topic交换机

    特点:对key进行匹配后进行投递 '#'匹配一个或多个词,'*'匹配一个词

    例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。

    Fanout交换机

    特点:不需要key,采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列

    二:生产者消费者模型

    对于RabbitMQ来说,生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMq Server实现的消息队列。

    生产者(producter):用来产生数据 并将数据发送到队列中

    import pika  # 引入mq包
    import time
    
    credentials = pika.PlainCredentials('SR', '123456')  # 如果需要远程连接mq服务需要传入用户名密码进行验证
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672))  # 创建mq的连接
    
    channel = connection.channel()  # 创建一个中间件人broker
    
    res = channel.queue_declare(queue='SR')  # 创建一个队列 队列名称SR
    print(res)  # <METHOD(['channel_number=1', 'frame_type=1', "method=<Queue.DeclareOk(['consumer_count=0', 'message_count=0', 'queue=SR'])>"])>
    
    for i in range(5):
        message = 'hello world%s' % i
        # 向队列插入数值 routing_key是队列名
        # body传入的数据
        channel.basic_publish(exchange='', routing_key='SR', body=message)
    
    connection.close()  # 关闭链接通道

    消费者(consumer):队列消息的接收者,负责 接收并处理 消息队列中的消息

    import pika
    import time
    
    credentials = pika.PlainCredentials('SR', '123456')  # 如果需要远程连接mq服务需要传入用户名密码进行验证
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672))  # 创建mq的连接
    
    channel = connection.channel()  # 声明一个频道
    
    res = channel.queue_declare(queue='SR')  # 创建一个队列 队列名称SR 防止生产者没有队列 消费者不知道从哪个队列取数据
    
    
    def callback(ch, method, properties, body):
        print(ch)  # <BlockingChannel impl=<Channel number=1 OPEN conn=<SelectConnection OPEN transport=<pika.adapters.utils.io_services_utils._AsyncPlaintextTransport object at 0x000000000C6CDDD8>
        print(method)  # <Basic.Deliver(['consumer_tag=ctag1.d109b32cf17d46ca92c3d3a96d280df7', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=SR'])>
        print(properties)  # <BasicProperties>
        print(body)  # b'hello world0' 二进制数据
    
    
    # 告诉rabbitmq,用callback来接收消息
    channel.basic_consume(
        queue='SR',  # 指定队列名
        on_message_callback=callback  # 从队列里获取消息
    )
    
    # 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理
    channel.start_consuming()
  • 相关阅读:
    spring源码-BeanFactoryPostProcessor-3.2
    web之前端获取上传图片并展示
    spring源码-增强容器xml解析-3.1
    spring源码-bean之增强初始化-3
    spring源码-bean之加载-2
    spring源码-bean之初始化-1
    spring源码-开篇
    java之扫描包里面的class文件
    vuex状态持久化
    Vue 使用 vuelidate 实现表单验证
  • 原文地址:https://www.cnblogs.com/SR-Program/p/12573159.html
Copyright © 2020-2023  润新知