面试题(六)

目录

101.RocketMQ的事务消息是如何实现的

102.为什么RocketMQ不使⽤Zookeeper作为注册中⼼呢?

103.RocketMQ的实现原理

104.RocketMQ为什么速度快

105.消息队列如何保证消息可靠传输

106.消息队列有哪些作⽤

107.死信队列是什么?延时队列是什么?

108.如何保证消息的⾼效读写?

109.epoll和poll的区别

110.TCP的三次握⼿和四次挥⼿

111.浏览器发出⼀个请求到收到响应经历了哪些步骤?

112.跨域请求是什么?有什么问题?怎么解决?

113.零拷⻉是什么


101.RocketMQ的事务消息是如何实现的

a. ⽣产者订单系统先发送⼀条half消息到Broker,half消息对消费者⽽⾔是不可⻅的
b. 再创建订单,根据创建订单成功与否,向Broker发送commit或rollback
c. 并且⽣产者订单系统还可以提供Broker回调接⼝,当Broker发现⼀段时间half消息没有收到任
何操作命令,则会主动调此接⼝来查询订单是否创建成功
d. ⼀旦half消息commit了,消费者库存系统就会来消费,如果消费成功,则消息销毁,分布式事
务成功结束
e. 如果消费失败,则根据重试策略进⾏重试,最后还失败则进⼊死信队列,等待进⼀步处理

102.为什么RocketMQ不使⽤Zookeeper作为注册中⼼呢?

根据CAP理论,同时最多只能满⾜两个点,⽽zookeeper满⾜的是CP,也就是说zookeeper并不能保证 服务的可⽤性,zookeeper在进⾏选举的时候,整个选举的时间太⻓,期间整个集群都处于不可⽤的状态,⽽这对于⼀个注册中⼼来说肯定是不能接受的,作为服务发现来说就应该是为可⽤性⽽设计。
基于性能的考虑,NameServer本身的实现⾮常轻量,⽽且可以通过增加机器的⽅式⽔平扩展,增加集群的抗压能⼒,⽽zookeeper的写是不可扩展的,⽽zookeeper要解决这个问题只能通过划分领域,划分多个zookeeper集群来解决,⾸先操作起来太复杂,其次这样还是⼜违反了CAP中的A的设计,导致服务之间是不连通的。
持久化的机制来带的问题,ZooKeeper 的 ZAB 协议对每⼀个写请求,会在每个 ZooKeeper 节点上保 持写⼀个事务⽇志,同时再加上定期的将内存数据镜像(Snapshot)到磁盘来保证数据的⼀致性和持久性,⽽对于⼀个简单的服务发现的场景来说,这其实没有太⼤的必要,这个实现⽅案太重了。⽽且本身存储的数据应该是⾼度定制化的。
消息发送应该弱依赖注册中⼼,⽽RocketMQ的设计理念也正是基于此,⽣产者在第⼀次发送消息的时候从NameServer获取到Broker地址后缓存到本地,如果NameServer整个集群不可⽤,短时间内对于⽣产者和消费者并不会产⽣太⼤影响。

103.RocketMQ的实现原理

RocketMQ由NameServer注册中⼼集群、Producer⽣产者集群、Consumer消费者集群和若⼲Broker(RocketMQ进程)组成,它的架构原理是这样的:
Broker在启动的时候去向所有的NameServer注册,并保持⻓连接,每30s发送⼀次⼼跳
Producer在发送消息的时候从NameServer获取Broker服务器地址,根据负载均衡算法选择⼀台服务器来发送消息 Conusmer消费消息的时候同样从NameServer获取Broker地址,然后主动拉取消息来消费

104.RocketMQ为什么速度快

因为使⽤了顺序存储、Page Cache和异步刷盘。我们在写⼊commitlog的时候是顺序写⼊的,这样⽐ 随机写⼊的性能就会提⾼很多,写⼊commitlog的时候并不是直接写⼊磁盘,⽽是先写⼊操作系统的 PageCache,最后由操作系统异步将缓存中的数据刷到磁盘

105.消息队列如何保证消息可靠传输

消息可靠传输代表了两层意思,既不能多也不能少。
1. 为了保证消息不多,也就是消息不能重复,也就是⽣产者不能重复⽣产消息,或者消费者不能重复消费消息
2. ⾸先要确保消息不多发,这个不常出现,也⽐较难控制,因为如果出现了多发,很⼤的原因是⽣产者⾃⼰的原因,如果要避免出现问题,就需要在消费端做控制
3. 要避免不重复消费,最保险的机制就是消费者实现幂等性,保证就算重复消费,也不会有问题,通过幂等性,也能解决⽣产者重复发送消息的问题
4. 消息不能少,意思就是消息不能丢失,⽣产者发送的消息,消费者⼀定要能消费到,对于这个问
题,就要考虑两个⽅⾯
5. ⽣产者发送消息时,要确认broker确实收到并持久化了这条消息,⽐如RabbitMQ的confirm机制,Kafka的ack机制都可以保证⽣产者能正确的将消息发送给broker
6. broker要等待消费者真正确认消费到了消息时才删除掉消息,这⾥通常就是消费端ack机制,消费 者接收到⼀条消息后,如果确认没问题了,就可以给broker发送⼀个ack,broker接收到ack后才会删除消息

106.消息队列有哪些作⽤

1. 解耦:使⽤消息队列来作为两个系统之间的通讯⽅式,两个系统不需要相互依赖了
2. 异步:系统A给消息队列发送完消息之后,就可以继续做其他事情了
3. 流量削峰:如果使⽤消息队列的⽅式来调⽤某个系统,那么消息将在队列中排队,由消费者⾃⼰控制消费速度

107.死信队列是什么?延时队列是什么?

1. 死信队列也是⼀个消息队列,它是⽤来存放那些没有成功消费的消息的,通常可以⽤来作为消息重试
2. 延时队列就是⽤来存放需要在指定时间被处理的元素的队列,通常可以⽤来处理⼀些具有过期性操作的业务,⽐如⼗分钟内未⽀付则取消订单

108.如何保证消息的⾼效读写?

零拷⻉: kafka和RocketMQ都是通过零拷⻉技术来优化⽂件读写。
传统⽂件复制⽅式: 需要对⽂件在内存中进⾏四次拷⻉。
零拷⻉: 有两种⽅式, mmap和transfile,Java当中对零拷⻉进⾏了封装, Mmap⽅式通过
MappedByteBuffer对象进⾏操作,⽽transfile通过FileChannel来进⾏操作。Mmap 适合⽐较⼩的⽂件,通常⽂件⼤⼩不要超过1.5G ~2G 之间。Transfile没有⽂件⼤⼩限制。RocketMQ当中使⽤Mmap⽅式来对他的⽂件进⾏读写。
在kafka当中,他的index⽇志⽂件也是通过mmap的⽅式来读写的。在其他⽇志⽂件当中,并没有使⽤零拷⻉的⽅式。Kafka使⽤transfile⽅式将硬盘数据加载到⽹卡。

109.epoll和poll的区别

1. select模型,使⽤的是数组来存储Socket连接⽂件描述符,容量是固定的,需要通过轮询来判断是否发⽣了IO事件
2. poll模型,使⽤的是链表来存储Socket连接⽂件描述符,容量是不固定的,同样需要通过轮询来判断是否发⽣了IO事件
3. epoll模型,epoll和poll是完全不同的,epoll是⼀种事件通知模型,当发⽣了IO事件时,应⽤程序才进⾏IO操作,不需要像poll模型那样主动去轮询

110.TCP的三次握⼿和四次挥⼿

TCP协议是7层⽹络协议中的传输层协议,负责数据的可靠传输。
在建⽴TCP连接时,需要通过三次握⼿来建⽴,过程是:
1. 客户端向服务端发送⼀个SYN
2. 服务端接收到SYN后,给客户端发送⼀个SYN_ACK
3. 客户端接收到SYN_ACK后,再给服务端发送⼀个ACK
在断开TCP连接时,需要通过四次挥⼿来断开,过程是:
1. 客户端向服务端发送FIN
2. 服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据正在处理
3. 服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
4. 客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了

111.浏览器发出⼀个请求到收到响应经历了哪些步骤?

1. 浏览器解析⽤户输⼊的URL,⽣成⼀个HTTP格式的请求
2. 先根据URL域名从本地hosts⽂件查找是否有映射IP,如果没有就将域名发送给电脑所配置的DNS进 ⾏域名解析,得到IP地址
3. 浏览器通过操作系统将请求通过四层⽹络协议发送出去
4. 途中可能会经过各种路由器、交换机,最终到达服务器
5. 服务器收到请求后,根据请求所指定的端⼝,将请求传递给绑定了该端⼝的应⽤程序,⽐如8080被tomcat占⽤了
6. tomcat接收到请求数据后,按照http协议的格式进⾏解析,解析得到所要访问的servlet
7. 然后servlet来处理这个请求,如果是SpringMVC中的DispatcherServlet,那么则会找到对应的
Controller中的⽅法,并执⾏该⽅法得到结果
8. Tomcat得到响应结果后封装成HTTP响应的格式,并再次通过⽹络发送给浏览器所在的服务器
9. 浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染

112.跨域请求是什么?有什么问题?怎么解决?

跨域是指浏览器在发起⽹络请求时,会检查该请求所对应的协议、域名、端⼝和当前⽹⻚是否⼀致,如 果不⼀致则浏览器会进⾏限制,⽐如在www.baidu.com的某个⽹⻚中,如果使⽤ajax去访问
www.jd.com是不⾏的,但是如果是img、iframe、script等标签的src属性去访问则是可以的,之所以浏览器要做这层限制,是为了⽤户信息安全。但是如果开发者想要绕过这层限制也是可以的:
1. response添加header,⽐如resp.setHeader("Access-Control-Allow-Origin", "*");表示可以访问
所有⽹站,不受是否同源的限制
2. jsonp的⽅式,该技术底层就是基于script标签来实现的,因为script标签是可以跨域的
3. 后台⾃⼰控制,先访问同域名下的接⼝,然后在接⼝中再去使⽤HTTPClient等⼯具去调⽤⽬标接⼝
4. ⽹关,和第三种⽅式类似,都是交给后台服务来进⾏跨域访问

113.零拷⻉是什么

零拷⻉指的是,应⽤程序在需要把内核中的⼀块区域数据转移到另外⼀块内核区域去时,不需要经过先 复制到⽤户空间,再转移到⽬标内核区域去了,⽽直接实现转移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查 文章目录 【Entity Framework】EF中的增删改查一、概述二、DbContext数据上下文三、EntityState五个状态值四、EF添加数据4.1 EF Add方式4.2 EF 通过改变对象的状态为 Added4.3 调用方sql4.4 调用存储过程 五、EF修改数据5.1 不查询数据库&…

Pytorch:Pytorch入门基础

文章目录 一、PyTorch概述二、Pytorch基础数据结构三、Tensorflow和Pytorch的区别TensorFlow和PyTorch的区别 四、导入Pytorch库 学习参考于: 与凤行——上古神君:Pytorch数据结构 一、PyTorch概述 PyTorch是一个开源的机器学习库,用于计算…

项目管理系统在制造业的应用,提高生产效率的秘诀与解决方案

缩短产品交货周期,提高产品交付率是当下很多制造业面临的难题,项目管理系统业务流程自动化,能够显著改善项目效率。接下来我们说一说项目管理系统在制造业的应用,项目管理系统制造业解决方案。 制造业典型的项目背景 随着企业体量…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串(SDS)1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串(SDS) 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字…

【Java项目】基于SpringBoot的【就业信息管理系统】

在当今这个科技迅猛发展的时代,计算机技术在生活中扮演着至关重要的角色,特别是在信息管理领域。在这样的背景下,学习计算机知识不只是简单地掌握一项技能,更关键的是将所学知识应用于实际,以创新的思维不断简化人们的…

JAVA 100道题(24)

24.使用Java的线程池(ExecutorService)执行一组任务。 在Java中,ExecutorService是一个用于管理和控制线程的工具,它允许你提交任务给线程池来异步执行。下面是一个使用ExecutorService来执行一组任务的简单示例: java…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作。给我们一种全新的方式使用命令行。…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课:华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课:华为HCIP认证课程介绍-CSDN博客 职场进阶,踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 : 超级实用,华为VRP系统文件…

8.6 循环神经网络的简洁实现

每个步长共用参数 加载数据 虽然 8.5节 对了解循环神经网络的实现方式具有指导意义,但并不方便。 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from…

#include<初见C语言之指针(5)>

目录 一、sizeof和strlen的对比 1. sizeof 2.strlen 二、数组和指针题解析 1. ⼀维数组 1.1数组名理解 2.字符数组 3. ⼆维数组 三、指针运算题解析 总结 一、sizeof和strlen的对比 1. sizeof 我们前面介绍过sizeof是单目操作符 sizeof括号中有表达式,不…

解决PATH变量污染的问题

文章目录 解决PATH变量污染的问题概述笔记清空PATH变量之后的系统设置在命令行查看清空后的PATH变量以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例以系统命令 where为例run_vs2019.bat备注 - 批处理的后缀最好是batEND 解决PATH变量污染的问题 概述 随着不断安装新软件,…

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

前言 非线性薛定谔方程(Nonlinear Schrdinger Equation, NLS)是量子力学中描述波函数演化的一个重要方程,特别是在考虑介质的非线性效应时。它是薛定谔方程的一种推广形式,可以用于描述非线性介质中光波或量子粒子的传播,如光纤通信、玻色-爱因斯坦凝聚以及非线性光学等领…

一文彻底搞懂如何创建线程

文章目录 1. java创建线程(Thread)方式2. 继承 Thread 类3. 实现 Runnable 接口4. 实现 Callable 接口5. 使用线程池6. 使用匿名类 1. java创建线程(Thread)方式 方式一:继承于Thread类,这是最常见的创建线程的方式之一,通过继承 Thread 类并…

SAP GBB中Transaction Key 都代表何种业务过账?

【GBB】offsetting entry 用于IM过账的库存冲销分录。依据为移动类型科目分组中的科目修改分配移动类型。 如下科目分组应在标准系统中定义。可以直接使用。 你也可以定义自己的移动类型科目分组。 涉及到的SAP 标准科目修改(一般修改)如下&#xff1a…

BeanDefinition

这里写目录标题 BeanDefinitionBeanDefinitionReaderAbstractBeanDefinitionReaderXmlBeanDefinitionReader BeanDefinition 上述Spring的基本运行中,你所有的定义描述信息都在XML文件里面,如何读取呢? 当然通过 new ClassPathXmlApplicatio…

无符号整型数0减1

无符号数0减1等于多少? 对于无符号整数来说,0是最小值,一般不能再减1了。因为无符号整数不能表示负数,当无符号数再减1时,会发生下溢,即最高位变为1,最低位变为0,结果变成一个非常大…

常见微服务的组件?

注册中心:就是一个服务注册的地方,我们可以把拆分的服务注册到注册中心,这样注册中心就能管理这些服务,服务之间的调用就会很方便,通过服务名就能相互调用。 负载均衡:被调用放的负载均衡,比如…

【智能算法】黄金正弦算法(GSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年,Tanyildizi等人受到正弦函数单位圆内扫描启发,提出了黄金正弦算法(Golden Sine Algorithm, GSA)。 2.算法原理 2.1算法思想 GSA来源于正弦函…

FreeBSD下路由问题留档

碰到了一个非常神奇的事情,一台笔记本有以太网和wifi,都可以连到同一台路由器,ip地址配置在同一网段,但是如果插上网线,再拔掉网线的话,那么wifi即使连上,也无法上网。 看路由信息,发…

【Spring源码分析】透过源码看透Spring事务

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入(一)【Spring源码分析】…