消息队列 RabbitMQ

是什么?

 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。

 MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

 

优点:

稳定,支持高可用的队列

基于中央节点,在路由,均衡负载,消息持久化的应用都很方便 

支持多种协议的消息传送

支持多种语言的客户端

安装 启动

sudo apt install rabbitmq-server

sudo apt update

sudo service rabbitmq-server start

sudo service rabbitmq-server stop 

使用步骤:

          send:

  1. 创建到rabbitmq的connection
  2. 创建通道channel
  3. 创建队列
  4. 发送信息(声明发送到的exchange和queue)
  5. 关闭连接

receive:

  1. 创建到rabbitmq的connection
  2. 创建通道channel
  3. 创建队列(防止send没有启动而导致失败)
  4. 创建consumer,声明回调函数、queue等参数 
  5. 接收消息

        备注:

ack标示为true时,代表发送一次就删除,当receive故障时可能会造成消息丢失,而false时会等待发送结果,如果失败会重新发送)

basic.qos:代表调度规则,每次发送n条消息到消费端

交换机规则: 

"发布者(producer)只需把消息发送给一个交换机(exchange )。交换机非常简单,它一边从发布者接收消息,一边把消息消息推送到队列。交换机必须知道如何处理它接收的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的。"

发布订阅:所有交换机绑定的队列都可以接收到发布者发布给交换机的信息(广播)

                                    重点:channel.exchange_declare(exchange='exchange_name', type='exchange_type' // 交换机定义

                                               channel.queue_bind(exchange='exchange_name', queue=queue_name) //队列与交换机绑定

        路由:在绑定交换机与队列时,通过routing_key的不同将消息路由到不同的消费方

                                     重点:channel.exchange_declare(exchange='logs', type='direct') // 交换机定义,type是直连

                                     channel.basic_publish(exchange='logs',routing_key='info',body=message) //消息发布                                                                    channel.queue_bind(exchange=exchange_name,queue=queue_name,routing_key='info') //消费绑定

        主题:类似于模糊路由,可以设置多个topic,不同组合由不同的消费方处理

                        * :可以替代一个单词

                        #:可以替代0或者更多的单词

                       当一个队列的绑定键为 "#" ,这个队列将会无视消息的路由键,接收所有的消息。

                       当 *  和 # 这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的直连交换机的行为。

                       重点:channel.exchange_declare(exchange='logs', type='topic') //交换机定义,type为topic
                                  routing_key = 'aa.error'  // 路由key定义
                                  channel.basic_publish(exchange='logs',routing_key=routing_key, body=message) //消息发布

                                  binding_key='*.error'  //绑定key定义(模糊匹配)

                               channel.queue_bind(exchange=exchange_name,queue=queue_name,routing_key=binding_key) //消费绑定

 

 

                          

 

你可能感兴趣的:(分布式)