腾讯面试反思

490 阅读7分钟

1. 面试问题

1.1 怎么在1亿条nginx日志里面显示top10 的请求?

答:把URL地址使用hashmap的数据格式来存储,并且把数据加载到内存中,一般会存在很多的URL重复的,对于重复数,我们计为map的值。然后构建一个最大堆,把map值作为堆的值,然后构建一个10个元素的最大堆,就可以知道这top10值了。

1.2 怎么来设计一个并发抢红包的系统?并发是10w。可以处理的商品是8w

答:微信的抢红包的系统,是一个高度安全级别和大量并发的分布式资金交易架构。

  1. 对于用户的红包请求生成唯一ID,可以是用户ID和hash来生成。保证后面操作的红包的请求,拆开等一系列操作的幂等性。
  2. 对于用户红包的请求,采用memcached进行cas保证,超过了业务server可以处理的能力,直接拒绝服务。并且memcached和server保持同机房部署。
  3. 对于数据库和表采用水平和垂直拆分,根据用户的ID,时间来拆分。对于数据库采用先进先出队列模式,保证请求的事务处理。并且垂直分配后,可以把大的流量进行拆分成小的流量分别处理。
  4. 冷热数据分开存储。避免历史的冷数据存储影响到业务的流量,所以,可以定期把一些冷数据存放到其他的数据库中处理。提高数据库处理的性能操作
  5. 对于server这一块,采用server互备,支持负载均衡,并且可以支持多个server可以请求同一个DB,满足业务的请求。
1.4 怎么来设计满足当前业务10倍增长的业务系统?

答:在回答这个问题前,简单的说下10倍设计的是怎么个体量。当前,日均接口调用8000w,日均投放pv是5000w。针对这些情况,如果扩展10倍的话,整体的体量还是非常大的,现有的架构是不能够满足当前的需求。 这样我们在这几方面进行考虑

  1. 架构的水平拆分和垂直拆分。
  2. 系统中影响主要性能的关键节点的性能优化。
  3. 人才的招聘,满足更大业务的增长储备。

架构的水平拆分,我们的主要压力还是来自于接口同步数据压力。这个主要还是数据同步的压力。我们会预估增加当前机器的10倍来处理数据任务的处理。这样满足任务的处理。同样的当前的redis的集群方式,大概处理1w多的并发还是OK,但是要处理5w消息队列,这个还是比较难搞定的,所以我们已经在对业界比较成熟的消息队列进行调研。如Kafka消息队列。除了消息队列,还有数据库,数据也需要增加相应的倍数来支撑数据处理的场景。

架构的垂直拆分,这个拆分也会对系统中有更多业务的拆分。包括,不同业务同步代码模块进行服务化拆分,对于涉及的mysql的相关表都需要考虑库拆分,表拆分等。

对于影响性能的节点,考虑其处理的方式。 包括关键同步性能问题的优化。包括代码的数据结构是否更优,代码的算法逻辑是否更优秀。对于整体的性能还是非常重要的提升等。

最后考虑,完善人才储备机制,毕竟这么大的业务体量,在一定的程度上需要更多的人才来进行完善和构建。可以把这个格局搞得更大。

以上是我的简单想法的梳理。

1.5 对myisam的存储机制的理解

答:也是使用B树,在存储结构的时候,myiasm的表分为三大块,1. 表结构, 2. 表数据, 3. 表索引。 在myisam的更多的是,把数据和索引分开,而innodb更多的是,把数据整合在一起,所以,myiasm对查找的话只需要检索索引,而不需要每次都检索对应的数据信息。查询效率比较高。

而innodb更多的是数据的存储。

1.7 单台服务器压测的结果是怎么样的?对于单台服务器有什么具体的调优策略吗?有没有对数据库的进行宕机恢复预演操作?

答:对于单机nginx的请求处理量和性能没有具体的测试。这个需要了解运维对于所有的机器进行基准的测试情况,还有支持的性能情况。 对于后期这些数据都需要收集。

单台服务器的调优策略,主要从nginx处理能力和PHP的配置进行调优。如nignx支持的worker数量,connection 数量,还有支持了nginx发的数据包的大小的设置。还有nginx设置的超时间。 对于PHP的优化更多的是考虑PHP的缓存策略,还有PHP的超时时间,缓存块的大小等。也有fastcgi启动的处理数量。

1.8 怎么来制定和团队的技术成长空间?

答:这是比较大的范围。对于技术的成长,我们也技术的职位级别的评定,如3.1,3.2,3.3。 不同级别的对技术的要求是不一样的,还有了解问题的深度也是不一样的。 我们每年都会有一次技术的职位级别的评定。对于他们的技术成长更多的还是让他们的职位级别更大的提升。 除了这一块,提高他们的综合素质。 如,

  1. 技术表达能力,技术方案的推动能力
  2. 技术文档能力 等等

每个人的空间都不一样的。我也是从开发角色慢慢转变成管理角色,也会换位思考不同的成员之间的需求是什么。也不是说一概而论的采用什么措施。

1.9 mysql的半复制/同步模式?

答:mysql默认的数据库模式是异步的数据库同步模式,主服务器开启了binlog,对重数据库进行发送数据,但是对于是否重数据库是否接收没有考虑。 而半同步模式就是,增加了从库接收到主库的binlog,并写入到中继器日志文件中,并且反馈给主库,已经接收完成了主库的数据。一旦从库接收数据超时,会自动切换到异步数据库模式。 这种模式解决了从库的和主库的数据不一致的情况。保证了主库和从库的数据一致性。

1.10 折半查询算法的构建。

答:折半查询算法也叫二分查找算法。算法的逻辑,是在有序的数据里面,从中间开始查找,如果比该数据大,则向该数据的右边中间进行比较,同理,比它小,则选择其中间的值进行查找。知道最后查找到匹配的值。

1.11 你项目中最拿的出手的业务处理方式?
1.12 安全的处理方式

答:业务系统,代码的处理方式。

  1. 支持的项目处理方式,对代码中的xss,sql注入。还有其他影响系统安全进行检测
  2. 各种系统的加密算法的提高,提高系统的安全性。
  3. 增加第三方对系统的检测,规避一些系统存在的漏洞的情况。
1.13 反作弊系统理解