• Zstack一面面经


    项目介绍

    实例指的是VM还是大数据容器

    估计面试官以为我们运维平台是容器化实现的。

    容器化大数据是将大数据处理的各个组件和服务打包成容器,通过容器编排工具Kubernetes进行统一管理和调度。传统的大数据处理架构通常采用分布式集群的方式部署,需要手动配置和管理各个节点,存在部署、维护和扩展困难的问题。而容器化大数据通过将各个组件打包成容器,可以快速部署和启动,同时利用Kubernetes的调度和管理功能,实现了高可用性、弹性伸缩和灵活部署。

    但其实我们就是上面说的,传统的大数据处理架构,只不过自己做了自动化

    身在做云的公司,实际上一点云也没有用上

    接触过虚拟机和容器吗要不要看看k8s或者虚拟化呢

    权限控制有哪些难点 密码过期是如何设计的

    用户登录以后经过验证,有一张表存了用户信息,查询用户密码过期时间(默认为设置密码后的三个月),如果过期了跳转到修改密码界面。

    改一下登录逻辑:登录成功以后,用jwt生成token,载荷里包括了userid,角色名、角色对应权限列表、角色状态。将业务:useid作为key,token作为value存到redis里面,设置过期时间,并将token返回给前端。以后访问的请求头里都带着这个token,gateway取出jwt里的用户id,查询缓存,查不到说明没登录。查到以后解析jwt里的用户信息,如果是禁用报错,如果是过期用户,返回过期错误码,前端收到该错误码将跳转到修改密码界面,正确情况下放到请求头里并由拦截器拦截放到threadLocal里。

    修改密码以后将数据库中该角色状态改为正常,下次他再登录就能正常使用了。

    jwt有做过期的限制吗?这个没有限制,从我们业务角度来说,用户登录上去可能进行一些耗时的部署业务等,可能进行到中间状态,强制下线用户体验感不好。

    有没有限制多点登录?

    Rsa是直接用的还是自己实现的?

    用ansible做什么事情,对每个node做一些操作吗 ansible要把一个文件复制到目标主机上命令是什么

    下一部分是对接电信的云翼平台这个是什么意思。具体包括什么功能。

    使用的人的数据库是放在哪里,是存在电信云翼平台还是存在我们自己的数据库。背后运行的单机是运维平台控制给他们一个node还是真的在他们环境安装。

    对不同用户有做差异化吗?定制化开发

    返回流水线的百分比是真实百分比吗

    集群纳管 ambari是什么 

    只会java吗 其他语言有了解吗

    java类加载过程(类的生命周期)

    1.加载(通过类名获取此类的二进制字节流、将字节流所代表的静态存储结构转换为方法区的运行时数据结构、在内存中生成一个代表该类的Class对象作为方法区数据的访问入口)

    2.验证

    3.准备:分配内存并设置初始值

    4..解析:将常量池中的符号引用替换成直接引用

    5.初始化

    6.卸载

    java的垃圾回收机制

    java的CAS操作

    python里object和type 用过哪些包 用过python多线程吗

    mysql常见的优化手段

    mysql有没有ttl

            TTL(Time to Live)是指数据在存储系统中的存活时间。在MySQL中,我们可以通过设TTL来控制数据的存活时间,当数据过期后,系统会自动删除该数据。这对于一些需要定期清理过期数据的应用场景非常有用,比如用户的登录状态、验证码、临时缓存等。

            MySQL本身并没有直接支持TTL的功能,但我们可以通过一些技巧来实现。一种常用的方式是使用两个字段:一个存储数据的有效期,另一个存储数据的创建时间。在查询数据时,我们可以通过比较当前时间和数据的创建时间加上有效期来判断数据是否过期。

    mysql的text和varchar的区别

            varchar是一种可变长度的字符串类型,用于存储可变长度的字符数据。它的定义包括一个最大长度参数,表示该列可以存储的最大字符数。varchar的存储方式与其长度有关。当存储varchar值时,MySQL会根据实际的数据长度分配足够的存储空间。例如,如果一个varchar列的最大长度为50,但实际存储的字符串只有10个字符,则只分配10个字符的存储空间。varchar适用于存储长度可变的字符串,如用户名、地址等。它提供了灵活性和节省存储空间的优势。

            text是一种用于存储大量文本数据的数据类型。它可以存储非常长的字符串,最大长度取决于数据库的配置。与varchar不同,text类型的数据总是占用足够的存储空间以容纳其最大长度。无论实际存储的文本数据有多长,都会占用足够的存储空间。text适用于存储大段的文本数据,如文章内容、日志记录等。它提供了存储大量文本数据的能力,但在某些情况下可能会占用更多的存储空间。

    redis常见的故障解决

    通过监测缓存的命中率、缓存失效率等指标来评估缓存过期时间的合适性,并根据实际情况进行调优。

    1.redis配置文件

    redis.conf 配置项说明如下:

    绑定的主机地址、监听的端口号、客户端空闲时间、指定日志级别、同一时间最大客户端连接数、指定Redis最大内存限制、指定是否在每次更新操作之后进行日志记录、指定更新日志文件名、指定存储至本地数据库时是否压缩数据、指定本地数据库文件名、设置节点为slave(需要指定master服务的ip地址及端口)、指定更新日志条件、设置密码。

    2.Redis与数据库同步问题:

    缓存适用于读多写少的场景。

    先对数据库做操作再对缓存做操作,因为在不确定落库成功的情况下不建议更新缓存,可能竞争不到锁也可能更新操作失败。

    所以一般是先对数据库进行操作,再对缓存进行操作。

    (1)先更新库,再删缓存

    线程1在更新库呢,线程2会读到原缓存,然后线程1更新成功了删除了缓存,线程2读到了无效的缓存(影响不大)。

    另外一个影响是,线程1删掉了缓存,以后的线程来读时因为缓存不在,会回原,如果此时mysql主从不一致,回原得到了错误数据并写入到缓存里,再之后的线程都只能从缓存中读到错误的数据了,可以说缓存放大了数据库主从不一致的问题。

    (2)先更新库,再改缓存(第2好)

    如果两个线程都要改数据库中的同一条数据并更改缓存(第一个获得锁,更新,改缓存,第二个随后获得锁,更新,也要改缓存,但是两个同时要改缓存),缓存里的数据就会和数据库不一致。

    解决方法:用额外的线程更新缓存,比如用一个线程监听binlog,保证更改缓存顺序和更改数据库顺序一样

    缓存如果过期了,就会和(1)一样出现缓存里一直是错误的问题。(设置缓存永不失效)

    (3)延迟双删

    先更新DB,再删缓存,过段时间再删缓存。

    3.缓存雪崩

    (1)构建多级缓存

    (2)限流(不适合高并发情况)

    用加锁、队列、Sentinal等限流组件保证不会有大量的线程对数据库进行一次性的读写,从而避免失效时大量的并发请求落到底层存储系统上。

    (3)将缓存失效时间分散开

    比如可以在原有的失效时间基础上增加一个随机值。

    4.缓存击穿

    防止缓存里没有该有的数据:

    (1)提前预热热门数据并适时调整过期时间

    防止原来有但是没有了:

    (3)设置合适的缓存过期时间:将热点数据的缓存过期时间设置为较长时间,以尽量减少缓存失效和后端请求的频率。

    遭到恶意攻击的情景:

    (1)最基本的就是⾸先做好参数校验,⼀些不合法的参数请求直接抛出异常信息返回给客户端。⽐如查询的数据库 id 不能⼩于 0、传⼊的邮箱格式不对的时候直接返回错误消息给客户端等等。

    (2)布隆过滤器:具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当⽤户请求过来,先判断⽤户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会⾛下⾯的流程。

    实在防不住怎么办:

    限流:缓存中拿不到数据时,不是立即去db中查询,而是去获取分布式锁,拿到锁再去db中加载数据,没拿到锁的线程休眠一段时间再重试获取数据。 

    UML画过时序图吗 

    设计模式的基本原则

    1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因。即一个类应该只有一个单一的职责或功能。

    2. 开闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即通过扩展来实现新的功能,而不是修改已有的代码。

    3. 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够替换掉它们的父类型。即子类对象可以替换父类对象出现的任何地方,并且保持原有功能的正确性。

    4. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上。

    5. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,它们都应该依赖于抽象。即依赖关系应该通过抽象(接口或抽象类)建立,而不是具体实现类之间的直接依赖。

    6. 迪米特原则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解。即一个对象应该尽量减少与其他对象之间的相互依赖,尽量降低耦合性。

    为什么要用设计模式

    开发过程中哪些地方用了设计模式

    1.观察者模式:超级管理员将用户禁用、删除用户或更改用户信息的时候,我们会发布一个事件,然后在事件监听者中清除该用户的token。

    2.Spring默认的bean是单例的。

    开闭原则在开发过程中怎样用的

    可靠性、可读性、正确性、性能

    先保证正确、再保证可靠、可读、性能。设计模式很大一部分就是为了可读可修改。

    类以后要新加很多功能,怎么设计这个类。

    git用过git哪些操作,为什么不用merge用rebase 用过amend吗,查看某个分支有没有merge或者rebase到master上,用什么命令操作

    linux熟悉到什么程度,linux的存储网络、计算有了解吗,linux awk命令、xargs命令,平时开发机不是liunx

    云计算-》虚拟化、容器了解多少

  • 相关阅读:
    Windows为什么使用广播机制更新信息?
    146. LRU 缓存
    运用程序化交易系统的能力表现在哪些方面?
    SkyWalking快速上手(四)——SkyWalking运用Java Agent插件对应用程序进行增强和监控
    全网最牛最全的测试开发技术之Docker容器实战
    计算机组成原理 — PCI-E 总线
    NEOVIM下载安装与配置
    windows 10 安装k8s环境 Kubernetes
    微信万能表单系统源码+在线报名+加盟 带前后端完整的搭建教程
    MUSIQ: Multi-scale Image Quality Transformer【图像质量评估】
  • 原文地址:https://blog.csdn.net/Miaodawang/article/details/133024251