WdBly Blog

懂事、有趣、保持理智

WdBly Blog

懂事、有趣、保持理智

周维 | Jim

603927378@qq.com

常见问题汇总一(含答案)

如何优化递归?http和https的区别? https的传输步骤? setState何时同步何时异步? TCP 为什么是三次握手,而不是两次或四次? to B to C? BFF? 为什么需要前端监控? 什么是微服务? 什么是数据库事务?5G时代对前端的影响?

1. 如何优化递归?

说尾递归之前必须先了解一下什么是尾调用。简单的说,就是一个函数执行的最后一步是将另外一个函数调用并返回。

尾递归:

尾递归的实现,往往需要改写递归函数,确保最后一步只调用自身。做到这一点的方法,就是把所有用到的内部变量改写成函数的参数。

ES6 的尾调用优化只在严格模式下开启,正常模式是无效的。

这是因为在正常模式下,函数内部有两个变量,可以跟踪函数的调用栈。

  • func.arguments:返回调用时函数的参数。
  • func.caller:返回调用当前函数的那个函数。

尾调用优化发生时,函数的调用栈会改写,因此上面两个变量就会失真。严格模式禁用这两个变量,所以尾调用模式仅在严格模式下生效。

eg:

function Fibonacci (n) { if ( n <= 1 ) {return 1}; return Fibonacci(n - 1) + Fibonacci(n - 2); } Fibonacci(100) // 爆栈了 //优化版本 function Fibonacci2 (n , ac1 = 1 , ac2 = 1) { if( n <= 1 ) {return ac2}; return Fibonacci2 (n - 1, ac2, ac1 + ac2); } Fibonacci2(800) 1.1210238130165696e+167

2. http和https的区别

  1. http是超文本传输协议,信息是明文传输的,https则是具有安全性的ssl加密传输协议,信息是加密交互的。
  2. https需要申请CA证书,有免费和收费的。
  3. http服务端端口不同,http使用80端口,https使用443端口
  4. http连接是简单无状态的,https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

3. https的传输步骤

  1. 客户端发起请求,链接到服务器443端口
  2. 服务端的证书(自己制作或向三方机构申请),自己制作的证书需要客户端验证通过(用户点一下)。证书中包含了两个密钥,一个公钥一个私钥。
  3. 服务端将公钥返回到客户端,公钥中包含了证书颁发机构,证书过期时间等信息。
  4. 客户端收到公钥后,通过SSl/TSL层首先对公钥信息进行验证,如颁发机构过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。否则就生成一个随机值,然后使用公钥对此随机值进行加密,此加密信息只能通过服务端的私钥才能解密获取生成的随机值。
  5. 服务端获取到加密信息后使用私钥解密获得随机值,以后服务端和客户端的通讯都会使用此随机值进行加密,而这个时候,只有服务端和客户端才知道这个随机值(私钥),服务端将要返回给客户端的数据通过随机值加密后返回。
  6. 客户端用之前生成的随机值解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

4. setState何时同步何时异步

  1. 在组件生命周期中或者react事件绑定中,setState是通过异步更新的。
  2. 在延时的回调或者原生事件绑定的回调中调用setState不一定是异步的。
    这个结果并不说明setState异步执行的说法是错误的,更加准确的说法应该是setState不能保证同步执行。

setState的批量更新策略类似数据库的事务。

5. TCP 为什么是三次握手,而不是两次或四次?

TCP做为可靠的传输层协议,是要保证数据高速和可靠的传输。

TCP 需要三次握手的原因:

  1. 初始化双方 seq。
  2. 确认双方信道可以实现最低限度的全双工。

TCP 需要四次挥手的原因:

  1. TCP 要支持半关闭连接。

6. to B to C

字面上的意思都很明确:To B 就是 To business,面向企业或者特定用户群体的面商类产品;To C 就是 To customer,产品面向消费者。平常大家讨论比较多的是 To C 类产品,因为大家都在使用,且设计师很多在从事 To C 类产品的设计工作。

7. BFF

BFF(Backends For Frontends)服务前端的后端, 通常来说后台的接口是更加公共的通用的且粒度很细的。这样来说后端的同学比较容易维护扩展,但是对于前端来说,一个页面组件可能就需要调用多个类似的公共接口才能拿到所有的数据。

所以有了BFF,由前端去维护一个接口处理的服务。由于是前端维护所以这一层更多的是使用nodejs。

当然BFF是一直存在的,在node之前,都是由后端维护,现在交给了前端。

8.为什么需要前端监控?

获取用户行为以及跟踪产品在用户端的使用情况,并以监控数据为基础,指明产品优化的方向。

前端监控可以分为三类:数据监控、性能监控和异常监控。

https://segmentfault.com/a/1190000015864670

9. 什么是微服务?

微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通信。

微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

  • 每个服务都各有一个数据库,同属性的服务可共享同个数据库。
  • 所有服务都共享同个数据库,但是不同表格,并且不会跨域访问。
  • 每个服务都有自己的数据库,就算是同属性的服务也是,数据库并不会共享。

数据库并不会只存放该服务的数据,而是“该服务所会用到的所有数据”。更深层一点的举例:假设有个文章服务,而这个服务可能会需要判断用户的账号⋯⋯等。那么文章服务的数据库就可以放入用户的部分数据。此举是为了避免服务之间的相依性,避免文章服务调用用户服务。

数据库的可弃性

实践微服务有许多的做法,但其中一种做法是将数据库作为短期的存储空间而不是存储长期的数据。这意味着数据库可以在离线时被清空。因为它们可以在上线时从事件存储中心恢复,因此也能以存储器缓存(如:Redis) 作为数据库服务器。但这种做法需要将每个请求当作事件来进行广播。如此一来就可以从事件存储中心重播所有的事件来找回所有的数据。

eg: 航班预订系统可划分为多个微服务

将航班预订应用划分为预订航班、时间表查询、计算票价、分配座位、管理奖励、更新客户、调整库存七个微服务实施。

10. 什么是数据库事务?

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

特性 ACID

A给B转账为例,
需要A减少1000 B增加1000,在这个过程中必须保证如下过程:

原子性(Atomicity): 要么同时成功要么同时失败
隔离性(Isolation): 同一时间只能有一个事务来修改A的数据,使用互斥锁来实现。锁会在事务提交成功或者失败后释放。
持久性(Durability): 如果数据库突然崩溃,事务会保证未提交的事务回滚,已提交的事务存储在磁盘中。
一致性(Consistency): 依赖于原子性和隔离性

11. 5G时代对前端的影响

5G更多的是推动了物联网的发展,无人汽车,智慧城市等物联网项目,5G为这些终端设备提供的高速的网络支持。

对于前端来说,5G时代对数据的监控采集系统,后台管理系统会有更多的需要,对大量数据的展示也会也这更高的要求。

很多新增的智能终端系统也可能使用开发交付更加快速的便捷的html5来实现。前端的舞台不仅限于PC和移动端了。