架构师面试点点滴滴

https://blog.csdn.net/JasonDing1354/article/details/45641811?ops_request_misc=%7B%22request%5Fid%22%3A%22158194177519724839229345%22%2C%22scm%22%3A%2220140713.130056874..%22%7D&request_id=158194177519724839229345&biz_id=0&utm_source=distribute.pc_search_result.none-task

TCP 协议与 UDP 协议有什么区别

TCP(Tranfer Control Protocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。可以很少差错传输数据。

UDP(User DataGram Protocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。

所以TCP必UDP多了建立连接的时间。相对UDP而言,TCP具有更高的安全性和可靠性。

TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现实存在的举例---》两个人为了上线快捷方便讲要上线的war使用QQ传输,导致数据的数据丢失上线失败

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

开源协议

GPL (GNU General Public License) :GNU通用公共许可协议

LGPL (GNU Lesser General Public License) :GNU宽通用公共许可协议

BSD

(Berkeley Software Distribution) :伯克利软件分发许可协议

MIT (Massachusetts Institute of Technology):MIT之名源自麻省理工学院

Apache (Apache License) :Apache许可协议

MPL (Mozilla Public License) :Mozilla公共许可协议

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

《常用的hash算法有哪些》

1.加法hash:所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。

2.位运算hash:这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素

3.乘法hash:33*hash + key.charAt(i)

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

TCP如何保证可靠传输?三次握手过程?

在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。第一次是客户端发起连接;第二次表示服务器收到了客户端的请求;第三次表示客户端收到了服务器的反馈。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 实现线程的几种方法

(1)继承Thread类,重写run函数

(2)实现Runnable接口,重写run函数

(3)实现Callable接口,重写call函数

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

如何调用 wait()方法?使用 if 块还是循环?为什么?

wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。

wait(),notify()和notifyall()方法是java.lang.Object类为线程提供的用于实现线程间通信的同步控制方法。等待或者唤醒

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 如何理解分布式锁?

由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.MYSQL常用优化(sql优化,表结构优化等)

SQL优化、表机构优化、索引优化、缓存参数优化

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

volatile关键字, Lock

并发编程中:原子性问题,可见性问题,有序性问题。

volatile关键字能保证可见性,字能禁止指令重排序,但是不能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。在生成的会变语句中加入Lock关键字和内存屏障。

Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题。用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用Lock需要我们手动释放锁

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

进程与线程:

进程值运行中的程序(独立性,动态性,并发性),线程指进程中的顺序执行流。区别是:1.进程间不共享内存 2.创建进程进行资源分配的代价要大得多,所以多线程在高并发环境中效率高。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

序列化与反序列化:

序列化指将java对象转化为字节序列,反序列化相反。主要是为了java线程间通讯,实现对象传递。只有实现了Serializable或Externalizable接口类对象才可被序列化。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

说出 5 个 JDK 1.8 引入的新特性?

Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:

Lambda 表达式;允许像对象一样传递匿名函数 Stream API,充分利用现代多核 CPU,可以写出很简洁的代码 ;Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用 扩展方法,现在,接口中可以有静态、默认方法; 重复注解,现在你

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

object中定义了哪些方法?

clone(), equals(), hashCode(), toString(), notify(), notifyAll(),

wait(), finalize(), getClass()

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.Collection与Collections的区别是什么?

Collection是Java集合框架中的基本接口;

Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

述 Java 中的重载和重写?

重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承

重写:1、在子类中可以根据需要对从基类中继承来的方法进行重写。2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。3、重写方法不能使用比被重写的方法更严格的访问权限。

重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

String 和 StringBuilder 的区别

1)可变与不可变:String不可变,每一次执行“+”都会新生成一个新对象,所以频繁改变字符串的情况中不用String,以节省内存。

2)是否多线程安全:StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。StringBuffer和String均线程安全。

扩展性的问题

服务器宕机原因分析

宕机通俗的点说就是服务器不堪负重,或者其他等原因而死机或者关机的状况。宕机怎么读?其汉 语拼音为dangji,还有人叫down机,当机,甚至直接称死机,这样就好理解的多了。  宕机通常都有哪些常见原因?

  1、服务器环境的客观原因。比如机房断电导致的服务器断电、机房温度过高,导致的服务器死机、关机等。不过这种情况一般很少发生,因为像鼎峰新汇BGP机房等数据中心,通常都有很好预防措施,比如备用电路、备用发电机、全时段机械及自然制冷、只能恒温系统等。

  2、服务器不堪负重。这种情况是比较常见的主要原因,网站流量暴增、程序中毒、遭受攻击等大规模高消耗服务器资源情况,而导致的服务器资源耗尽不敢负重,最终无法响应和死机。

  3、就是不合理的应用了。比如一种很常见的现象就是,由于考虑成本,一些站长常会租用较低配置的VPS、云服务器等,用来建设网站,但又同时安装诸多与网站建设毫无相关的其他大型软件,让服务器以小轿车之能,担负大货车的负载,结果可想而知,宕机死机属常事才是应该。

  当然,宕机的常见原因,还有很多细节原因,比如,不当环境配置、陷于死循环的错误程序、数据库索引缺失、数据库丢失等都会无端消耗大量服务器CPU、内存等资源,从而导致的服务器死机宕机等。不过,基本大多数宕机的原因都不出以上三种常见原因范畴。另外服务器宕机多以预防和监控为主。

数据库的优化

1、sql语句中不使用子查询,比如delete from user where uid not in( select id from order),因为使用子查询数据库要在内存中建立临时表,消耗资源,如果两个表有关联并且经常被一块调用,最好是在一张表中建立另一张表的外键用join语句查询,比如:delete from user left join order on user.id=order.uid;
2、sql语句中最好不要出现"*"来代替已知字段,即使是要查询所有字段也要写出每一个字段,因为用*代替字段数据库要先查询出表中有哪些字段再进行sql语句的查询,无形中又多了一次无意义的查询工作;

3、合理建立索引

      3.1索引可以非常大程度加快数据库检索速度,尤其是在where和join中出现的列或者用Order by排序的时候速度更是快很多(需要判断或者比较或者排序的时候);

       3.2但是建立索引并不是越多越好,过多索引会造成冗余,因为每一次delete、update、add都会刷新一次索引,过多索引造成其他操作消耗过多资源,过小的表也没必要建立索引,没人见过两页的宣传单页还有目录的对吧。

第二重要的就是表结构优化,关于这方面也有以下几点简单总结:

        1. 选择最合适的字段属性,使用可以存在数据的最小的数据类型,例如邮政编码,手机号码这类定长的数字可以用char(6),char(11);性别或者是否这种判断性文字可以用tinyint;字段属性尽量为not null这样不用判断是否为空,减少一个步骤(用其他方式表达你想表达的NULL,比如 -1);如果一定要用text这种类型,最好是采用分表存储;

        2.将常用信息和不常用信息分表存储,比如一个商城网站的用户表,用户的昵称,头像,密码,账号这类字段用户登录就会用到,而用户的兴趣爱好了,喜欢的颜色了这种字段就分表存储,相信大家京东账号中的个人信息可能也就在注册的时候打开过,以后就再没注意过了吧

代码重构

【代码重构的定义】
  关于代码重构的理解:在不改变软件系统/模块所具备的功能特性的前提下,遵循/利用某种规则,使其内部结构趋于完善。其在软件生命周期中的价值体现主要在于可维护性和可扩展性。

【代码重构的时机】
  依据重构所带来的影响范围的大小,我们分别依次从系统级别和函数接口级别进行说明。

系统级重构
  1. 系统越来越臃肿,业务调用链路交错复杂,难以进行正常维护;
  2. 新功能添加代价很大,扩展困难;
  3. 系统技术架构无法满足业务发展需求,如性能瓶颈频现,无法快速进行新业务逻辑的添加/修改;
  4.负责人新官上任,需要立flag;
API级重构
  1. 函数声明设计不合理:
      a. 函数命名不规范,缺少注释,尤其是函数功能、返回值及参数说明;
      b. 输入参数与输出参数无法明确区分;
      c. 参数类型不精确,如整型与浮点型;
      d. 参数个数过多,大于5个;
      e. 参数传递方式不合理,如值传递与引用传递;
  2. 函数实现的的几个问题:
      a. 含义不明确的变量,未使用的变量,未初始化的变量,初始化方式不当;
      b. 代码行过多,如C语言而言单个函数体代码行超过500行,甚至1000行;
      c. 复杂的表达式;
      d. 算法逻辑:未能依据应用场景,合理均衡时间复杂度与空间复杂度;
      e. 过多的外部依赖,导致接口调用的时长增加;
      f. 大量重复代码块;
      g.不合理的使用全局变量,宏定义,内联函数;
      h. 接口功能边界模糊;
【代码重构的规则】

系统级重构规则
简单:识别系统的复杂度(高可用、高性能、IO密集型、CPU密集型、适用对象),然后尽可能采用合适且简单的架构;
适用:基于自身当前及未来的业务特性和发展趋势进行技术架构选型;
演化:技术架构是动态的,随着业务发展不断变化完善的;
性能优化贯穿于系统设计的始终:可参考博文《系统性能优化策略 – 持续优化更新》
API级重构规则
合理声明;
职责单一;
里氏替换;
高内聚低耦合;
面向对象编程;面向失败编程;
可维护、可扩展性
【重构系统上线的几个注意事项】
      新系统或者新API的上线难免会引入未知的难以提前评估或者测试(单元测试+集成测试)难以覆盖到的错误。为了保证线上问题出现时的秒级回滚,我们一般需要将前一次的成功版本服务作为本次升级服务的降级。
5. 遵从灰度发布原则:旧的API作为默认逻辑,将新的API作为旧的API的降级逻辑,使用策略分流一部分流量到新的API。
6. 一段时间验证后,若新的API没有问题,则将新的API设置为默认逻辑,旧的API保留作为降级逻辑。
 

通用架构师应该如何把控迁移技术方案

https://blog.csdn.net/qq_16605855/article/details/80966363


 

发布了316 篇原创文章 · 获赞 33 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/yz18931904/article/details/104367583