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文件,效果如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2019-12-26 19:31  游走De提莫  阅读(209)  评论(0编辑  收藏  举报