消息队列

消息队列

    队列:实现方式 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 交换器彻底一致,但性能差不少,目前几乎用不到了       
相关文章
相关标签/搜索