每日小记之面试宝典(面试题)

  • Git的分支你们是怎么管理的?

  •  详解:Git 分支管理常见三种方式;

  •  ① TBD(Trunk-based development、单主干)
  1.   所有团队成员都在单个主干分支上进行开发。
  2.   发布时,先考虑使用标签 Tag, 如果打标签不能满足要求,则从主干创建发布分支。
  3.   Bug在主干上修复,然后挑选时机发布到 发布分支上  
  • ② GitHub flow
  •  GitHub使用的一种简单流程,使用两类分支,Master、代码修改分支,主要对应GitHub的pull、request功能。

    1.master分支

    包含稳定的代码,该分支已经或即将被部署到生产环境,分支的作用是提供一个稳定可靠的代码基础。任何开发人员都不允许把未测试或未审查的代码直接提交到 master 分支。

    2.代码修改分支

    当需要进行任何修改时(包括 bug 修复、hotfix、新功能开发等),总是从 master 分支创建新分支。

    分支合并流程

    当新分支中的代码全部完成之后,通过 GitHub 提交一个新的 pull request。团队中的其他人员会对代码进行审查,提出相关的修改意见。由持续集成服务器对新分支进行自动化测试。当代码通过自动化测试和代码审查之后,该分支的代码被合并到 master 分支。再从 master 分支部署到生产环境

  • ③ git-flow
  • 目前流传最广的 Git 分支管理实践,围绕的核心概念是版本发布(release)。git-flow 流程中包含 5 类分支,分别是 master、develop、feature、release 和 hotfix。
  1.     Master 分支中包含的是可以部署到生产环境中的代码,这一点和 GitHub flow 是相同的
  2.     develop 分支中包含的是下个版本需要发布的内容。当 develop 分支集成了足够的新功能和 bug 修复代码之后,通过一个发布流程来完成新版本的发布。发布完成之后,develop 分支的代码会被合并到 master 分支中。
  3.     feature、release和 hotfix为均为临时分支,只在需要时才从 develop 或 master 分支创建,在完成之后合并到 develop 或 master 分支。合并完成之后该分支被删除。
  • 分支类型命名规范创建自合并到说明
    feature feature/*developdevelop新功能
    release release/*developdevelop和master一次新版本的发布
    hotfix hotfix/*masterdevelop和master 生产环境中发现的紧急 bug 的修复
  • 接口保证幂等性是基本的要求,那么幂等性你们是怎么做的?

  • 详解

    1.数据库唯一索引:
    当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可
    缺点:会增加对索引的维护开销,例如删除数据也要删除唯一索引,对于分库分表的系统可能不适用,需要额外的策略

    2.悲观锁
    例如:select * from table where id=#{id} for update;
    注意:id字段一定是主键或者唯一索引,不然是会锁表的
    悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,虽然实现简单但高并发场景不建议使用
    3.乐观锁
    乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。

    乐观锁的实现方式多种多样可以通过version或者其他状态条件:
    通过版本号实现

    update table_xxx set name=#{name},version=version+1 where version=#{version}

    4.token机制
    token机制,防止页面重复提交
    业务要求:
    页面的数据只能被点击提交一次
    发生原因:
    由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交
    解决办法:
    集群环境:采用token加redis(redis单线程的,处理需要排队)
    单JVM环境:采用token加redis或token加jvm内存
    处理流程:

        数据提交前要向服务的申请token,token放到redis或jvm内存,token有效时间

        提交后后台校验token,同时删除token,生成新的token返回
        token特点:
        要申请,一次有效性,可以限流

        注意:redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用

    5.分布式锁
    还是拿插入数据的例子,如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统(redis或zookeeper),在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路。

    要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁(分布式锁要第三方系统提供)
    6.通过状态机

    在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。

    注意:订单等单据类业务,存在很长的状态流转,一定要深刻理解状态机,对业务系统设计能力提高有很大帮助

  • 你们有用@Transactional来控制事务是吧,那么能不能说出一些事务不生效的场景?

  • 1.检查方法是不是public的,不是则不生效。因为@Transactional注解只能应用到public可见度的方法上。
  • 2.异常类型是不是unchecked异常(

    默认情况下,Spirng会对unchecked异常进行事务回滚;如果是checked异常则不回滚。

    什么是unchecked异常,什么是checked异常?

    java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常成为unchecked异常,其他继承自java.lang.Exception的异常统称为checked Exception,如IOException、TimeOutException等

    如果想让checked异常也回滚,在注解上面写明异常类型即可:

    @Transactional(rollbackFor=Exception.class)

    类似还有norollbackFor,自定义不回滚的异常

    3.数据库引擎要支持事务,如果是Mysql,注意表要使用支持事务的引擎,比如innaodb,如果是myisam,事务是不起作用的

    4.是否开启了对注解的解析:

        <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    5.spring是否扫描到你使用注解事务的这个类所在的包:

        <context:component-scan base-package="com.xxx.xxx" ></context:component-scan>

    6.检查是不是同一个类中的方法调用(如a方法调用同一个类中的b方法)

    7.异常是不是被catch住了

2020 / 9 / 15 新增

  • ## 1 Dubbo

     1.1 服务调用超时问题怎么解决?

     1.2 Dubbo支持哪些序列化方式?

     1.3 Dubbo和SpringCloud的关系?

     1.4 Dubbo的架构设计?一共划分了哪些层?

     1.5 Dubbo的默认集群容错方案?

     1.6 Dubbo使用的是什么通信框架?

     1.7 Dubbo的主要应用场景?

     1.8 Dubbo服务注册与发现的流程?流程说明。

     1.9 Dubbo的集群容错方案有哪些?

     1.10 Dubbo的四大组件

     1.11 Dubbo在安全机制方面是如何解决的

     1.12 Dubbo和SpringCloud的区别?

     1.13 Dubbo支持哪些协议,每种协议的应用场景,优缺点?

     1.14 Dubbo的核心功能有哪些?

     1.15 Dubbo的注册中心集群挂掉,发布者和订阅者之间还能通信么?

     1.16 Dubbo集群的负载均衡有哪些策略

     1.17 为什么需要服务治理?

     1.18 Dubbo超时时间怎样设置?

    ## 2 ElasticSearch

     2.1 你们公司的ES集群,一个node一般会分配几个分片?

     2.2 Elasticsearch是如何实现Master选举的?

     2.3 你是如何做写入调优的?

     2.4 如何避免脑裂?

     2.5 19-Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

     2.6 ES主分片数量可以在后期更改吗?为什么?

     2.7 如何监控集群状态?

     2.8 ElasticSearch中的副本是什么?

     2.9 20.ES更新数据的执行流程?

     2.10 shard里面是什么组成的?

     2.11 ElasticSearch中的分析器是什么?

     2.12 什么是脑裂?

     2.13 客户端在和集群连接时,如何选择特定的节点执行请求的?

     2.14 Elasticsearch中的倒排索引是什么?

     2.15 什么是索引?索引(名词) 一个索引(index)

     2.16 详细描述一下Elasticsearch更新和删除文档的过程

    ## 3 JVM

     3.1 JVM参数主要有⼏种分类

     3.2 3.Java中会存在内存泄漏吗,简述一下。

     3.3 Java虚拟机是如何判定两个Java类是相同的?

     3.4 Java 中都有哪些引用类型

     3.5 在 Java 中,对象什么时候可以被垃圾回收?

     3.6 19.StackOverflow异常有没有遇到过?一般你猜测会在什么情况下被触发?

     3.7 堆空间分哪些部分?以及如何设置各个部分?

     3.8 什么是栈帧?栈帧存储了什么?

     3.9 如何设置参数生成GC日志?

     3.10 GC 是什么?为什么要有 GC?

     3.12 使用过哪些jdk命令,并说明各个的作用是什么

     3.13 JVM运行时数据区区域分为哪⼏部分?

     3.14 是否了解类加载器双亲委派模型机制和破坏双亲委派模型?

     3.15 逃逸分析有几种类型?

     3.16 -Xms这些参数的含义是什么?

     3.17 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

     3.18 JVM的内存结构,Eden和Survivor比例是多少?

    ## 4 多线程/高并发

     4.1 负载平衡的意义什么?

     4.2 请说出同步线程及线程调度相关的方法?

     4.3 关于epoll和select的区别,哪些说法 是正确的?(多选) 

    A. epoll 和 select 都是 I/O 多路复用的技术,都可以实现同时监听 多个I/O事件的状态。 

    B. epoll 相比 select 效率更高,主要是基于其操作系统支持的 I/O 事件通知机制,而select是基于轮询机制。 

    C. epoll支持水平触发和边沿触发两种模式。 

    D. select能并行支持I/O比较小,且无法修改。

     4.4 启动一个线程是调用run()方法还是start()方法?

     4.5 如何确保N个线程可以访问N个资源同时又不导致死锁?

     4.6 编写多线程程序的几种实现方式(换个问法:创建多线程的方式)?

     4.7 线程和进程的区别?

     4.8 什么是线程池,有哪些常用线程池?

     4.9 什么是死锁?

     4.10 怎么保证缓存和数据库数据的一致性?

    ## 5 消息中间件

     5.1 消费者获取消息有几种模式?

     5.2 17.RocketMQ的特点有哪些?

     5.3 kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka将如何处理?

     5.4 为何需要Kafka集群

     5.5 Kafka 数据存储设计

     5.6 Kafka如何判断一个节点是否存活?

     5.7 kafka消息发送的可靠性机制有几种

     5.8 请详细说一下推送模式和拉取模式。

     5.9 Kafka 与传统消息系统之间有三个关键区别

     5.10 RocketMQ 由哪些角色组成?

     5.12 23.Kafka的消费者如何消费数据

     5.13 Kafka的优点

     5.14 Kafka 的设计是什么样的呢?

     5.15 说说你对Consumer的了解?

     5.16 Kafka新建的分区会在哪个目录下创建

     5.17 说一下Kafka消费者消费过程

     5.18 介绍下Kafka

     5.19 什么情况会导致Kafka运行变慢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直在奔跑丶

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值