面试项目介绍看这一篇就够了

最近做的项目是为融资担保公司提供sass服务。采用springcloud分布式架构,注册中心及配置中心使用nacos,网关使用gateway,使用redisson做缓存及分布式锁, 采用rockemq做消息推送及解耦,mysql数据库根据担保公司及年份做分库分表,对外数据交互采用加密传输数据。全局异常报警采用发送钉钉信息,项目使用了工厂,代理等常用的设计模式,采用多线程并发处理数据初始化,定时任务采用xxjob。

面试官从项目介绍中可能问道的问题
1 消息队列如何保证不丢失,不重复消费
不丢失三个方面说
a.生产者到mq ,ack应答机制
b.mq服务器持久化(各个mq机制有不同)
c. mq到消费者 也是 得到消费者应答后,才确认发送成功,否则重试
不重复两个方面
a.生产者重复发送
b.消费者重复接收
有的mq本身支持配置幂等,通过每条消息id(mq自身生成)去重,此种方式不能绝对保证。
根本解决办法,每个消息由业务系统生成唯一键,消费者接收到消息 先判断是否消费。

  1. 分布式事务的解决方案
    以下是几种常见的分布式事务解决方案:

两阶段提交(2PC):在2PC中,有一个协调者和多个参与者。协调者负责协调和控制各个参与者的事务操作,并进行两个阶段的确认。第一阶段是询问各参与者是否可以执行提交操作,第二阶段是根据所有参与者的响应来决定最终提交或回滚。

TCC(Try-Confirm-Cancel):TCC是一种基于补偿机制的分布式事务解决方案。它将事务操作分为三个阶段:尝试(Try)、确认(Confirm)和取消(Cancel)。在尝试阶段,尝试执行业务操作并预留资源;在确认阶段,确认执行业务操作并提交资源;在取消阶段,取消执行业务操作并释放资源。

消息队列:使用消息队列作为分布式事务的中间件,将事务操作转换为消息发送,并使用消息队列的事务机制来保证消息的可靠性传递。各个参与者通过监听消息队列的消息来完成对应的业务操作。

  1. mysql事务的七种传播特性

REQUIRED(默认):如果当前没有事务,则新建一个事务;如果当前存在事务,则加入到当前事务中。
REQUIRED_NEW:每次都会新建一个独立的事务,如果当前存在事务,则将当前事务挂起。
SUPPORTS:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则以非事务方式执行。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
MANDATORY:必须在一个已存在的事务中执行,否则将抛出异常。 NEVER:必须以非事务方式执行操作,如果当前存在事务,则抛出异常。
NESTED:如果当前存在事务,则在嵌套事务内执行;如果没有事务,则新建一个事务。嵌套事务可以独立提交或回滚,但如果外部事务提交,则会携带嵌套事务的结果一同提交。

  1. 线程池的七种参数
  2. sql优化常见方法
  3. 什么是服务熔断降级限流

服务熔断是一种容错机制,用于防止故障的扩散和危及整个系统。当服务的错误率或响应时间超过设定的阈值时,熔断器会立即中断对该服务的调用,并返回一个预设的错误响应。这样可以快速将问题服务隔离,避免资源耗尽或级联故障。

降级是指在高负载或故障情况下,暂时关闭或替换某些核心功能或服务,以保证整体系统的稳定性和可用性。通过降级,可以提供基本的功能或者显示友好的提示信息,避免整个系统崩溃或无法响应。

限流是一种控制流量的机制,用于限制系统的访问频率或并发请求数。通过设定最大的请求量或并发连接数,可以保护系统免受过多请求的影响,并确保系统资源得到合理分配和利用。
降级使用系统主动,熔断是异常出现后被动启动。常用的限流算法
计数器算法(Counter Algorithm):简单地对请求进行计数,并通过阈值来限制请求的数量。例如,可以设置每分钟最多处理100个请求,超过则拒绝。
漏桶算法(Leaky Bucket Algorithm):类似于令牌桶算法,但是请求以恒定速率进入漏桶中,并以固定速率从漏桶中排出,如果桶中已满,则拒绝请求。漏桶算法可以平滑处理请求流量,并抑制突发请求。
令牌桶算法(Token Bucket Algorithm):以固定的速率向令牌桶中放入令牌。每个请求想要通过时,需要获取一个令牌,如果没有令牌则被限流。令牌桶算法可以平滑处理突发请求,同时也可以限制整体请求的速率。

  1. redis 分布式锁,集群,哨兵,常见数据结构
  2. 什么是缓存击穿,雪崩,穿透,及解决方案
  3. mysql哪里用到了mvcc及悲观锁乐观锁
    mvcc 是mysql并发读用到,及数据库隔离级别的实现方式
    悲观锁是并发更新用到
    10.mysql存储引擎有哪些,及区别是什么,B+tree索引的实现原理
    InnoDB:InnoDB是MySQL的默认存储引擎。它支持事务处理(ACID特性),提供行级锁定、MVCC(多版本并发控制)和崩溃恢复能力。适用于需要高并发和数据完整性的应用场景。

MyISAM:MyISAM是MySQL早期的存储引擎,在性能方面具有优势。它不支持事务处理,只支持表级锁定。适用于读密集型应用,如数据仓库、日志记录等。

Memory:Memory(也称为Heap)存储引擎将数据存储在内存中,速度非常快,但不具备持久性。适用于临时表、缓存等需求
B+树也是一种平衡多路搜索树结构,但与B树不同的是,B+树的叶子节点通过链表连接在一起,形成一个有序链表。
B+树只在叶子节点上存储数据,而非叶子节点只包含关键字和对应的指针。这使得B+树更加适合范围查询和顺序遍历操作。
B+树的内部节点只用于索引目的,而所有的数据都存储在叶子节点中。这提高了内部节点的利用率,并减少了IO操作次数。
B+树具有更好的读取性能,因为它可以通过遍历叶子节点链表来进行范围查询和顺序访问操作。
11.消息队列刷盘持久化机制

Kafka持久化:

Kafka使用文件系统进行消息的持久化存储。每个Topic被分为多个分区,并且每个分区都以一个日志文件的形式进行存储。
消息在Kafka中被追加到分区的日志文件中,而不是直接覆盖或删除旧的消息。这种追加写入的方式使得Kafka具有高吞吐量的特点。
Kafka的持久化存储是基于磁盘的,可以保证消息在故障发生时的可靠性和持久性。 RocketMQ持久化:

RocketMQ使用基于PageCache的内存映射文件(Mapped
File)来存储消息。每个Topic被划分为多个队列,每个队列对应一个文件。
消息在RocketMQ中以顺序写入的方式存储在文件中。当消息发送到Broker时,首先写入PageCache,然后异步刷盘到磁盘上的物理文件,确保数据持久化。
RocketMQ支持同步和异步两种刷盘方式,可以根据需求进行配置。同步刷盘可以提供更高的数据可靠性,但会对性能产生一定影响。 总结:

Kafka和RocketMQ在持久化方面采用了不同的存储方式。Kafka使用文件系统进行日志追加写入的持久化,而RocketMQ使用基于PageCache的内存映射文件来存储消息。
Kafka的持久化以追加写入的方式实现高吞吐量,而RocketMQ通过异步刷盘提供更高的性能,并支持同步刷盘以提供更高的数据可靠性。
两者都可以保证在故障发生时数据的持久性和可靠性,但在具体应用场景中需根据需求和优势选择适合的消息队列系统。

kafka如何比rocketmq快

设计理念与架构差异:Kafka采用了分布式提交日志的架构,将消息以批量的方式追加写入磁盘。这种设计理念使得Kafka在处理大量数据时具有较高的吞吐量。而RocketMQ则采用基于PageCache的内存映射文件存储消息,这种设计更注重消息的可靠性和顺序性。

  1. mybatis 一级二级缓存

一级缓存(本地缓存): 默认开启,位于SqlSession对象的作用域内。
在同一个SqlSession的多次查询中,如果查询条件相同,则会直接从缓存中获取结果,避免再次查询数据库。
可以通过clearCache()方法手动清除缓存。

二级缓存(全局缓存):一个mapper文件一个缓存
位于Mapper映射文件的命名空间级别。 跨SqlSession的多个查询可以共享缓存,适用于多个会话需要共享数据的场景。
默认情况下,二级缓存是关闭的,需要在Mapper映射文件中配置启用。 可以通过flushCache="true"属性来刷新缓存。
可以通过标签的相关属性进行配置和管理。

13.mysql数据库隔离级别

读未提交(Read Uncommitted):最低级别的隔离级别,一个事务可以看到另一个事务尚未提交的修改。 (造成脏读)

读已提交(Read Committed):保证一个事务只能看到其他事务已经提交的修改。这是MySQL默认的隔离级别。(造成不可重复读)

可重复读(Repeatable
Read):保证在同一个事务中多次执行同样查询操作时,结果是一致的。即使其他事务对数据进行了修改,可重复读事务也不会看到这些修改。(造成幻读)

串行化(Serializable):最高级别的隔离级别,确保事务完全串行执行。同时,它会对所有查询加上锁,防止其他事务访问被锁定的数据。
mysql默认隔离级别重复读,mvcc解决了部分幻读的问题
快照读的情况下,mvcc可以解决幻读
当前读(读最新数据),mvcc无法解决幻读,需要使用共享锁,间隙锁解决幻读

14.异常的继承体系
在这里插入图片描述
15.全局异常处理如何实现
1.编写异常类 继承RuntimeException
2.编写异常处理类,使用@ControllerAdvice @ExceptionHandler(CustomException.class) 这两个注解
3.编写配置类 @Configuration @Bean

16.spring,springmvc ,springboot区别

Spring是一个开源的Java框架,用于构建企业级应用程序。 Spring
MVC是基于Spring框架的MVC(Model-View-Controller)实现。它提供了一种Web开发的模式,将应用程序分为模型、视图和控制器三层,并通过DispatcherServlet进行请求和响应的分发。

Spring Boot是基于Spring框架的快速应用程序开发框架。
它旨在简化Spring应用程序的初始配置和部署过程,提供更轻量、快速启动的方式。 Spring
Boot采用约定优于配置的原则,通过自动配置和起步依赖来减少开发者的工作量。
它内置了嵌入式Web服务器(如Tomcat、Jetty),可以方便地构建独立的可执行JAR文件,简化了部署和运行的过程。 Spring
Boot在构建Web应用程序时,默认集成了Spring
MVC作为其Web开发框架,并提供了自动配置和许多扩展功能,使得开发者能够更快速地搭建和开发Web应用程序。

17.谈谈微服务
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值