MQ系列面试题

MQ
一.概念:
消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一
二.消息中间件的组成
    1 Broker
    消息服务器,作为server提供消息核心服务
    2 Producer
    消息生产者,业务的发起方,负责生产消息传输给broker,
    3 Consumer
    消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
    4 Topic
    主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播
    5 Queue
    队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
    6 Message
    消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
 
三.消息中间件模式分类
 
    1 点对点
    PTP点对点:使用queue作为通信载体
        消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息,消息被消费以后,queue中不再存储,所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
    2.发布/订阅
    Pub/Sub发布订阅(广播):使用topic作为通信载体
        消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
        queue实现了负载均衡,将producer生产的消息发送到消息队列中,由多个消费者消费。但一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者。
        topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到一个消息的拷贝。
四.消息中间件的优势
        1 系统解耦
    交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。
        2 提高系统响应时间
    例如原来的一套逻辑,完成支付可能涉及先修改订单状态、计算会员积分、通知物流配送几个逻辑才能完成;通过MQ架构设计,就可将紧急重要(需要立刻响应)的业务放到该调用方法中,
    响应要求不高的使用消息队列,放到MQ队列中,供消费者处理。
        3 为大数据处理架构提供服务
    通过消息作为整合,大数据的背景下,消息队列还与实时处理架构整合,为数据处理提供性能支持。
        4 Java消息服务——JMS
    Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
    JMS中的P2P和Pub/Sub消息模式:点对点(point to point, queue)与发布订阅(publish/subscribe,topic)最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)。
五.消息中间件应用场景
    异步通信: 消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
    解耦:降低工程间的强依赖程度,针对异构系统进行适配。
    冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。
    扩展性:便于分布式扩容。
    过载保护:使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃
    可恢复性:消息队列降低了进程间的耦合度,系统恢复后被处理.
    顺序保证:数据处理的顺序
    缓冲:消息队列通过一个缓冲层来帮助任务最高效率的执行
    数据流处理:数据流进行实时或批量采集汇总
六.消息中间件常用协议
    1.AMQP协议
    AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
    优点:可靠、通用
七.常见消息中间件MQ介绍
    1.RocketMQ
    阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq
    产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。
    2.具有以下特点:
    能够保证严格的消息顺序
    提供针对消息的过滤功能
    提供丰富的消息拉取模式
    高效的订阅者水平扩展能力
    实时的消息订阅机制
    亿级消息堆积能力
    2 RabbitMQ
    使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,
    核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。
    3.ActiveMQ
    Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
    4 Redis
    本身支持MQ功能,做一个轻量级的队列服务来使用,入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis
    都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
    5 Kafka
    Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:
    快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
    高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
    高堆积:支持topic下消费者较长时间离线,消息堆积量大;
    完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;
    支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。
    RabbitMQ
    1.关键字
    (1)Broker:经纪人。提供一种传输服务,维护一条从生产者到消费者的传输线路,保证消息数据能按照指定的方式传输。粗略的可以将图中的RabbitMQ Server当作Broker。
    (2)Exchange:消息交换机。指定消息按照什么规则路由到哪个队列Queue。
    (3)Queue:消息队列。消息的载体,每条消息都会被投送到一个或多个队列中。
    (4)Binding:绑定。作用就是将Exchange和Queue按照某种路由规则绑定起来。
    (5)RoutingKey:路由关键字。Exchange根据RoutingKey进行消息投递。
    (6)Vhost:虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有一组Exchange、Queue和Binding。
    (7)Producer:消息生产者。主要将消息投递到对应的Exchange上面。一般是独立的程序。
    (8)Consumer:消息消费者。消息的接收者,一般是独立的程序。
    (9)Channel:消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一个会话任务。
    2.RabbitMQ的使用流程
    AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据配置的路由方式投递到相应的Queue上,Queue又将消息发送给已经在此Queue上注册的consumer,消息从queue
    到consumer有push和pull两种方式。
    消息队列的使用过程大概如下:
    (1)客户端连接到消息队列服务器,打开一个channel。
    (2)客户端声明一个exchange,并设置相关属性。
    (3)客户端声明一个queue,并设置相关属性。
    (4)客户端使用routing key,在exchange和queue之间建立好Binding关系。
    (5)生产者客户端投递消息到exchange。
    (6)exchange接收到消息后,就根据消息的RoutingKey和已经设置的binding,进行消息路由(投递),将消息投递到一个或多个队列里。
    (7)消费者客户端从对应的队列中获取并处理消息。
    3.工作过程:
        生产者客户端:
            客户端连接到RabbitMQ服务器上,打开一个消息通道(channel);
            客户端声明一个消息交换机(exchange),并设置相关属性。
            客户端声明一个消息队列(queue),并设置相关属性。
            客户端使用routing key在消息交换机(exchange)和消息队列(queue)中建立好绑定关系。
            客户端投递消息都消息交换机(exchange)上
            客户端关闭消息通道(channel)以及和服务器的连接
        服务器端:
        exchange接收到消息后,根据消息的key(这个key的产生规则暂时没研究,有知道的小伙伴可以留言告诉我)和以及设置的binding,进行消息路由,将消息投递到一个或多个消息队列中。
        关于exchange也有几个类型:
        (1). Direct交换机:完全根据key进行投递。例如,绑定时设置了routing key为abc,客户端提交信息提交信息时只有设置了key为abc的才会投递到队列;
        (2).Topic交换机:在key进行模式匹配后进行投递。例如:符号”#”匹配一个或多个字符,符号”*”匹配一串连续的字母字符,例如”abc.#”可以匹配”abc.def.ghi”,而”abc.*”只可以匹配”abc.def”。
        (3).Fanout交换机:它采取广播模式,消息进来时,将会被投递到与改交换机绑定的所有队列中。
    4.RabbitMQ的消息持久化
        RabbitMQ支持数据持久化,也就是把数据写在磁盘上,可以增加数据的安全性。消息队列持久化包括三个部分:
            消息交换机(exchange)持久化,在声明时指定durable为1
            消息队列(queue)持久化,在声明时指定durable为1
            消息持久化,在投递时指定delivery_mode为2(1是非持久化)
            如果消息交换机(exchange)和消息队列(queue)都是持久化的话,那么他们之间的绑定(Binding)也是持久化的。如果消息交换机和消息队列之间一个持久化、一个非持久化,
            那么就不允许绑定。
    5.RabbitMQ的优缺点
    优点:
        (1)由Erlang语言开发,支持大量协议:AMQP、XMPP、SMTP、STOMP。
        (2)支持消息的持久化、负载均衡和集群,且集群易扩展。
        (3)具有一个Web监控界面,易于管理。
        (4)安装部署简单,上手容易,功能丰富,强大的社区支持。
        (5)支持消息确认机制、灵活的消息分发机制。
    缺点:
        (1)由于牺牲了部分性能来换取稳定性,比如消息的持久化功能,使得RabbitMQ在大吞吐量性能方面不及Kafka和ZeroMQ。
        (2)由于支持多种协议,使RabbitMQ非常重量级,比较适合企业级开发。
    如果对消息吞吐量需求较大,且不在乎消息偶尔丢失的情况可以使用Kafka。
    6.Exchange类型
        1、Direct Exchange
        (1)名称:直接交换器类型
        (2)默认的预先定义exchange名字:空字符串或者amq.direct
        (3)作用描述:根据Binding指定的Routing Key,将符合Key的消息发送到Binding的Queue。可以构建点对点消息传输模型。
        2、Fanout Exchange
        (1)名称:广播式交换器类型
        (2)默认的预先定义exchange名字:amq.fanout
        (3)作用描述:将同一个message发送到所有同该Exchange 绑定的queue。不论RoutingKey是什么,这条消息都会被投递到所有与此Exchange绑定的queue中。
        3、Topic Exchange
        (1)名称:主题交换器类型
        (2)默认的预先定义exchange名字:amq.topic
        (3)作用描述:根据Binding指定的RoutingKey,Exchange对key进行模式匹配后投递到相应的Queue,模式匹配时符号“#”匹配一个或多个词,符号“*”匹配正好一个词,而且单词与
        单词之间必须要用“.”符号进行分隔。此模式可以用来支持经典的发布/订阅消息传输模型-使用主题名字空间作为消息寻址模式,将消息传递给那些部分或者全部匹配主题模式的queue。
        4、Headers Exchange
        (1)名称:标题交换器类型
        (2)默认的预先定义exchange名字:amq.match和amq.headers
        (3)作用描述:同direct exchange类似,不同之处是不再使用Routing Key路由,而是使用headers(Message attributes)进行匹配路由到指定Queue。
 
 
posted @ 2021-06-10 16:38  秃头猿  阅读(916)  评论(0编辑  收藏  举报
百度一下吧