• 了解RabbitMQ


    消息队列可以实现流量削峰、降低系统耦合度、提高系统性能等。

    RabbitMQ是一个实现了AMQP协议(Advanced Message Queue Protocol)的消息队列。

    RabbitMQ中的概念

    • producer: producer 是一个发送消息的应用
    • exchange:producer 并不会直接将消息发送到 queue 上,而是将消息发送给 exchange,由 exchange 按照一定规则转发给指定queue
    • queue: queue 用来存储 producer 发送的消息
    • consumer: consumer是接收并处理消息的应用

    我们将用Python编写两个小程序; 发送单个消息的生产者(发送者)和接收消息并将其打印出来的消费者(接收者)。 这是消息传递的“Hello World”。

    在下图中,“P”是我们的生产者,“C”是我们的消费者。 中间的框是一个队列 - RabbitMQ代表消费者保留的消息缓冲区。

    示例:

    #!/usr/bin/env python
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    
    
    channel.queue_declare(queue='hello')
    
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print(" [x] Sent 'Hello World!'")
    connection.close()
    send.py
    #!/usr/bin/env python
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    
    
    channel.queue_declare(queue='hello')
    
    def callback(ch, method, properties, body):
        print(" [x] Received %r" % body)
    
    channel.basic_consume(callback,
                          queue='hello',
                          no_ack=True)
    
    print(' [*] Waiting for messages. To exit press CTRL+C')
    channel.start_consuming()
    receive.py

    RabbitMQ运作原理

    RabbitMQ消息传递(单个队列):

    RabbitMQ消息传递(多个队列):

    多个Queue的场景中,消息会被Exchange按一定的路由规则分发到指定的Queue中去:

      • 生产者指定Message的routing key,并指定Message发送到哪个Exchange
      • Queue会通过binding key绑定到指定的Exchange
      • Exchange根据对比Message的routing key和Queue的binding key,然后按一定的分发路由规则,决定Message发送到哪个Queue

    每一类Exchange都有自己的分发路由规则:

    Fanout Exchange:忽略key对比,发送Message到Exchange下游绑定的所有Queue

    Direct Exchange:比较Message的routing key和Queue的binding key,完全匹配时,Message才会发送到该Queue

    Topic Exchange:比较Message的routing key和Queue的binding key,按规则匹配成功时,Message才会发送到该Queue

     默认Exchange:比较Message的routing key和Queue的名字,完全匹配时,Message才会发送到该Queue

    消息投递策略

    默认情况下RabbitMQ的队列和交换机在RabbitMQ服务器重启之后会消失,原因在于队列和交换机的durable属性,该属性默认情况下为false.

    能从AMQP服务器崩溃中恢复的消息称为持久化消息,如果想要从崩溃中恢复那么消息必须

    • 投递模式设置2,来标记消息为持久化
    • 发送到持久化的交换机
    • 到到持久化的队列

    缺点:消息写入磁盘性能差很多。除非特别关键的消息会使用

    消费端限流

    假设MQ服务器上面囤积了成千上万条的消息的时候,这个时候突然连接消费端,那么巨量的消息全部推过来,但是客户端无法一次性处理这么多的数据。

    在高并发的时候,瞬间产生的流量很大,消息很大,而MQ有个重要的作用就是限流,限流则是消费端做的。

    RabbitMQ提供了一种Qos(服务质量保证)功能,即在非自动确认消息的前提下,在一定数量的消息未被消费前,不进行消费新的消息。

  • 相关阅读:
    【转】ERROR: Cannot uninstall 'llvmlite'. It is a distutils installed project. 此类报错的解决办法
    【转】python setup.py install 报错:error:[WinError 3]系统找不到指定的路径: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib
    【转】距离相关系数以及python包的安装
    【转】算法总结这是一份全面并且详细的排序算法学习指南
    origin 一键导出文件夹中所有图形
    【转】距离相关系数的python实现
    [转]一文让你通俗理解奇异值分解
    origin 检查是否有重复图片
    【Vegas原创】centos网卡自启动
    【Vegas原创】使用dockercompose运行mysql8
  • 原文地址:https://www.cnblogs.com/ray-h/p/10463876.html
Copyright © 2020-2023  润新知