消息队列

消息队列

    队列:实现方式 queue
    
    特点:先进先出
    
    作用:
        1)实现程序的解耦(思想)  生产者消费者模型 :生产者->Q->消费者
        2)流量削峰
            生活中的实例:春运火车(绕来绕去的栅栏控制人流量)
            
            线下场景:秒杀
                用redis里的链表
                将链表维护到一个1000长度的大小,然后秒杀开始后,只保存前1000个请求
            
            微博场景:
                星轨:一个一线明星出轨带来的流量,微博服务器现在可以同时扛八个星轨
                微博的流量波动是很难预测的,指不定什么时候出来一个热点话题,微博的流量会垂直上升

什么是消息队列/消息中间件?

消息队列可以把消息分类,分别下发,比如点赞、评论和转发,各自走各自的通道 

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

实现消息队列的产品?

①redis

②微博用的kafaka(java)专门用来做消息队列的性能巨高

③rabbitmq

④rocketmq(阿里开源的基于rabbitmq搞的,只要是阿里开源的基本都是用java写的)

rabbitmq

https://lupython.gitee.io/2018/05/07/RabbitMQ的使用讲解/

linux:
安装:[root@db01 ~]# yum install rabbitmq*
启动:[root@db01 ~]# rabbitmq-server

https://www.rabbitmq.com

如何实现生产者,queue,消费者数据不丢失?
    -在声明queue的时候,持久化(durable=True) #生产者消费者都要持久化
        例如:声明一个叫hello的queue
            channel.queue_declare(queue='hello',durable=True)
    -在生产者端,需要加上下面代码,确保消息已经持久化了
        properties=pika.BasicProperties(
            delivery_mode=2, # make message persistent
        )
    -消费者端:
        auto_ack = False #当queue中的消息消费完以后,给生产者一个反馈
        

Exchange类型:
    direct:组播 #rabbitmq官网中的Routing
        消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是完全匹配、单播的模式
    
    fanout:广播 
         每个发到fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout类型转发消息是最快的。例子:发微博粉丝都可以收到信息
    
    topic :规则播 #rabbitmq官网中的Topics
        topic交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开,实际上增加了一点正则表达式的知识在里面,例如你的消息是usa开头的,那么它会走到usa.# 这个routing key里面
    
    headers: headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了       

 

原文地址:https://www.cnblogs.com/lizeqian1994/p/10933846.html