zoukankan      html  css  js  c++  java
  • rabbitMQ消息队列

    消息队列的前提 

    1、什么叫星轨?

    2、使用消息队列

      什么是消息中间件?

    星轨

     # 一星轨表示一个一线明星出轨所带来的流量,微博的服务器现在能同时扛8星轨。

    也就是说:8个一线明星同一时间爆出出轨的新闻,微博都能扛得住!

    微博的流量波动是很难预测的,指不定什么时候出来一个热点话题,微博的流量就会垂直上升,这也是微博和其他网站最大的区别。

    如:淘宝、百度地图、京东这些应用平时的流量是很稳定的,不会出现短时间的暴增,也不会出现急剧下滑的现象。

    在特殊的时间点,如双十一、618、节假日等情况下,工程师们会提前增加N倍的服务器进行应对,来解决高并发量带来的服务器瘫痪等异常,而微博的特殊情况属于不可预知的。

    他们采取的方式都是在流量高峰到来之前扩充更多的服务器(不少企业都是租用亚马逊、阿里云等云服务提供商的服务器),用完之后就释放,这样能节约不少成本
    
    而微博就很无奈了,因为它无法预测流量高峰,谁也不知道明星们啥时候就搞个出轨或是其他新闻出来,流量短时间暴增,微博的服务器就扛不住了。

    下图是邓超2015年12月20日刷屏的微博,那一天他的刷屏就把微博服务器给搞挂了不少!

     鉴于以上的特殊情况,微博应对的解决方法就是引入了消息队列

    如何使用““消息队列”来应对大流量高并发下用户提交内容的入库问题。

     什么是消息中间件?

      简单的理解如下图示:先应用消息队列来接收一系列的访问,再进行分发进行,减缓对服务器同时的访问量。

    当用户发送请求之后(评论操作或者消息请求操作),中转设备就把流量分摊到集群中的各个物理节点上,比如使用Nginx做代理以及负载均衡;

    消息队列可以把消息分类,分别下发,比如点赞、评论和转发,各自走各自的通道。
    消息队列可以暂存消息。当用户的请求到达消息队列以后,消息队列就给用户发出响应,显示评论成功,即使这时候该评论还没写入数据库,
    可是用户是不感知的。当流量暴增的时候,生产者生成的消息大于消费者的处理能力,消息就会先被暂存在消息队列里,然后消费者全力去处理,
    这样就避免了服务器压力过大。消息队列并不是全部存储在内存中,也是可以写入硬盘的,所以能存储很大量的消息。

    在简单的举个例子:

      由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),

    引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。

    队列、生产者、消费者

    队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。

    # 多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

     rabbitMQ

      其是一个软件,需要安装,启动服务端才能使用

     安装后启动服务:

     进入官网查看相关的信息

    介绍

     

      RabbitMQ是消息代理:它接受并转发消息。您可以将其视为邮局:将要发布的邮件放在邮箱中时,可以确保Mailperson先生或女士最终将邮件传递给收件人。

    以此类推,RabbitMQ是一个邮箱,一个邮局和一个邮递员。

    RabbitMQ与邮局之间的主要区别在于,它不处理纸张,而是接收,存储和转发数据消息的二进制斑点

    RabbitMQ和一般的消息传递使用一些术语。

    根据官方文档实现消息队列简单的输出“hello world”

    生产者

      向消息中间件rabbitMQ发送消息

    # #!/usr/bin/env python
    import pika
    
    #先建立连接
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    
    # 向rabbitMQ发送消息
    channel.queue_declare(queue="hello")
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='Hello World!')
    print(" [x] Sent 'Hello World!'")
    
    connection.close()

    消费者

      接收消息中间件的传的信息

    # !/usr/bin/env python
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    
    channel.queue_declare(queue='hello')
    
    # 回调函数
    def callback(ch, method, properties, body):
        print(" [x] Received %r" % body)
        # 从消息队列中取出值
    channel.basic_consume(queue='hello',
                              auto_ack=True,
                              on_message_callback=callback)
    
    print(' [*] Waiting for messages. To exit press CTRL+C')
    # 开始进行消费
    channel.start_consuming()

    切换到CMD终端分别运行两个py文件,效果如下:

      

  • 相关阅读:
    [转]使用Composer管理PHP依赖关系
    Php环境下载(PHPNow)安装
    精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框图设计工具
    八款强大的jQuery图片滑块动画插件
    JavaScript prototype.js提升JavaScript开发效率
    JS Message 网页消息提醒
    Vis.js图表插件
    动态算法学习
    GPS功能:百度路书自定义【轨迹回放】
    CSS美化页面滚动条
  • 原文地址:https://www.cnblogs.com/Gaimo/p/12103979.html
Copyright © 2011-2022 走看看