2021Java进阶学习资料!熬夜整理小米Java面试题
前言
消息中间件是分布式系统中的重要组件,在实际工作中常用消息中间件进行系统间数据交换,从而解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。目前市面上可供选择的消息中间件有RabbitMQ、ActiveMQ、 Kafka、 RocketMQ、ZeroMQ、MetaMQ等。
本文总结了近年来在实际项目中使用消息中间件的经历和踩过的一些坑,可为你**在实际工作中进行产品选型、业务场景方案制定、性能调整等提供明确的思路。**由于是基于Java语言开发,因此它非常适合Java初中级程序员阅读,学习。
基础知识
RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,它是使用Erlang
语言来编写的,并且是基于AMQP
协议的;
RabbitMQ高性能的原因
- Erlang语言在交换机的交互方面性能优秀的(
Erlang
语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的) - Erlang有着和原生
Socket
一样的延迟
AMQP协议
什么是AMQP高级消息队列协议
AMQP(Advanced Message Queueing Protocol)定义:具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
AMQP协议模型:
Publisher 推送消息前先与Server建立连接,找到Virtual host
,然后将消息推送至Exchange交换机。而交换机与Message Queue
有绑定关系(一个交换机相当于一个独立的虚拟机,而这个虚拟机内的各种独立的应用就相当于一个Queue,这个Queue与交换机绑定),Consumer
通过绑定的对队列,而交换机也绑定了队列。发送者将消息发送给交换机,这样就能完成消息的推送了
整体架构图
基本概念
Broker
消息队列服务进程,接收客户端的连接,实现AMQP实体服务。
Connection
连接,应用程序与Broker
的网络连接。
Producer
消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer
消息消费者,即消费方客户端,接收MQ转发的消息。
Channel
网络信道,几乎所有的操作都在Channel
中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务
Message
消息,服务器和应用程序之间传送的数据,由Properties
和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。
Virtual Host
虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host
里面不能有相同名称的Exchange或Queue
Exchange
交换机,接收消息,根据路由键转发消息到绑定的队列。
常见的有4种不同的交换机类型:
- 直连交换机:Direct exchange
- 扇形交换机:Fanout exchange
- 主题交换机:Topic exchange
- 首部交换机:Headers exchange
扇形交换机
扇形交换机是最基本的交换机类型,扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的
直连交换机
直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key
,当消息被发送的时候,需要指定一个binding_key
,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key
也是支持应用到多个队列中的
这样当一个交换机绑定多个队列,就会被送到对应的队列去处理
适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列
主题交换机
直连交换机的routing_key
方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的routing_key
,假设每个交换机上都绑定一堆的routing_key
连接到各个队列上。那么消息的管理就会异常地困难。
所以RabbitMQ
提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的routing_key
,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
主题交换机的routing_key
需要有一定的规则,交换机和队列的binding_key
需要采用*.#.*.....
的格式,每个部分用.
分开,其中:
*
表示一个单词#
表示任意数量(零个或多个)单词
当一个队列的绑定键为#
的时候,这个队列将会无视消息的路由键,接收所有的消息
首部交换机
首部交换机是忽略routing_key
的一种路由方式。路由器和交换机路由的规则是通过Headers
信息来交换的,这个有点像HTTP
的Headers
。
将一个交换机声明成首部交换机,绑定一个队列的时候,定义一个Hash
的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash
的内容匹配上的时候,消息就会被写入队列。
绑定交换机和队列的时候,Hash结构中要求携带一个键x-match
,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了
相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串
- any: 只要在发布消息时携带的有一对键值对headers满足队列定义的多个参数
arguments
的其中一个就能匹配上,注意这里是键值对的完全匹配,只匹配到键了,值却不一样是不行的; - all:在发布消息时携带的所有
Entry
必须和绑定在队列上的所有Entry完全匹配
Binding
Exchange和Queue之间的虚拟连接,Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue
所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange
与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定
Routing Key
一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
Queue
也称为Message Queue
,消息队列,保存消息并将它们转发给消费者。
消息发布流程:
- 生产者和Broker建立TCP连接。
- 生产者和
Broker
建立通道。 - 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
- Exchange将消息转发到指定的Queue(队列)
消息接收流程:
- 消费者和Broker建立TCP连接 。
- 消费者和
Broker
建立通道。 - 消费者监听指定的Queue(队列)
- 当有消息到达Queue时Broker默认将消息推送给消费者。
- 消费者接收到消息。
消息流转过程
生产者生产出Message并投递到Exchange
上
一个Exchange可以绑定多个Message Queue
,它根据路由策略(routing key
)路由到指定的队列,最后由消费端去监听队列
工作模式
队列模式:
对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
1、一条消息只会被一个消费者接收;
2、rabbitmq采用轮询的方式将消息是平均发送给消费者的;
3、消费者在处理完某条消息后,才会收到下一条消息。
发布订阅模式:
1、每个消费者监听自己的队列。
2、生产者将消息发给broker
,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息
对应交换机中的fanout
类型
路由模式:
1、每个消费者监听自己的队列,并且设置routingkey。
2、生产者将消息发给交换机,由交换机根据routingkey
来转发消息到指定的队列。
对应交换机中的direct
类型
通配符模式:
对应交换机中的topics
类型
Header转发器模式:
对应交换机中的header
类型
远程过程调用模式:
RPC即客户端远程调用服务端的方法,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:
- 客户端即是生产者就是消费者,向
RPC
请求队列发送RPC调用消息,同时监听RPC响应队列。 - 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果。
- 服务端将RPC方法的结果发送到
RPC
响应队列。 - 客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。
写在最后
以上就是我的面试过程,为了这次面试,也收集了很多的面试题,反正我已经面过了,那就免费分享出来吧!
需要的朋友:关注一下,然后点击这里即可免费领取
以下是部分面试题截图
果发送到RPC
响应队列。
4. 客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。
写在最后
以上就是我的面试过程,为了这次面试,也收集了很多的面试题,反正我已经面过了,那就免费分享出来吧!
需要的朋友:关注一下,然后点击这里即可免费领取
以下是部分面试题截图
2021Java进阶学习资料!熬夜整理小米Java面试题相关推荐
- 熬夜整理小米Java面试题,已拿offer
前言: 这篇文章主要介绍了26道Spring经典面试题总结(附带答案)的相关资料,小编在网上看到的觉得挺不错的,现在分享给大家,希望对你们有所帮助. 另外本人整理收藏了多家公司面试知识点整理 ,以及各 ...
- 2021Java进阶学习资料!java自学宝典pdf下载
一.一面 1小时40几分钟,基本会的被问完了 1.介绍项目,考虑没考虑过服务器挂了怎么办 这里应该是考查系统架构 2.面向对象特性 3.怎么理解多态 4.接口和抽象类的区别 5.说说并发是怎么回事,有 ...
- 35岁程序员:熬夜整理小米Android面试题,系列教学
前言 古人云:二十弱冠.三十而立.四十不惑.五十而知天命--在结婚生子都早的古代,三十岁的人应该能依靠自己的本领独立承担自己应承受的责任,并已经确定自己的人生目标与发展方向. 近日,在网上看见有个程序 ...
- 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
再失效就太无语了,链接都是多份的~~ -----------------基础-------------- C++环境搭建(全套) http://pan.baidu.com/s/1o6y0smY 链接: ...
- 牛X网整理的JAVA面试题
牛X网整理的JAVA面试题(入职,转岗): https://download.csdn.net/download/liangmaoxuan/12302507 总结不好多多担待,文章只单纯个人总结,如不 ...
- java二面烩面什么问题_小米Java面试题,一面二面面经分享
下面给大家分享一个小伙伴2020年的小米Java面试过程,内容具体为一面好二面的面试题,包含部分面试者的回答. 一面: 首先做了自我介绍,之后就是直接进入面试题部分了. 面试题: 1.数据库索引 b+ ...
- 2019小米java面试题,2020年小米java面试题分享
下面要给大家带来的是2020年的小米java面试题分享,主要包括了一面二面的面试题,以及面试者的一些相关回答,一起来了解一下吧. 面试题(一面) 1.谈一下数据库索引 数据库索引是为了让查询数据效率更 ...
- 人工智能、机器学习、深度学习从入门到进阶学习资料整理
最近整理了下在这里分享给大家,欢迎大家点赞收藏. 学习社区 神力AI(MANA):国内最大的AI代码平台. Learn AI:一个AI学习交流中心. AI研习社:一个专注于AI开发者和学术青年求知求职 ...
- 太赞了!没想到一个Handler还有中高级几种问法,进阶学习资料!
缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...
最新文章
- 谨慎能捕千秋蝉(二)——CSRF
- python 比较list差异
- 恢复SQL Server被误删除的数据(再扩展)
- 【luogu P1558 色板游戏】 题解
- 大前端晋级系列之-策略模式
- 如何去maven仓库下载jar包
- Shell Basic
- Hello Cnblog!
- unity3D游戏制作—暗黑战神DarkGod
- windows mysql 升级
- 【IOS账号分享】《帕斯卡契约》
- Kindle基础使用指南
- 图像处理-Sobel边缘检测(C++实现,不依赖opencv)
- Centos6.7安装ES6.1.3
- python tcl quartus_使用TCL脚本语言操作Quartus(一)
- 简单测试ROS里面C++ 和 python 文件获取参数格式
- 微服务商城系统(十五)秒杀基础
- eversync safari_EverSync app下载-浏览器书签收藏夹同步备份EverSync下载v1.11.1 安卓版-西西软件下载...
- shell 相关操作
- 不用写软件,纯JS 实现QQ空间自动点赞