富途秋招golang核中核 一二面 面经

富途秋招golang核中核 一二面 面经
最新回答
小时候

2023-09-16 22:50:19

富途秋招 Golang 核中核 一二面 面经一面

基础部分

  • 网络通信框架:富途在 Golang 项目中主要使用 gRPC 作为网络通信框架。

    gRPC 启动流程:gRPC 的启动流程包括定义服务接口和消息类型、实现服务接口、创建 gRPC 服务器、注册服务、启动服务器监听指定端口等步骤。

  • 应用发布流程:从应用写好到发布到线上,通常包括代码审查、构建打包、部署配置、测试验证、发布上线等环节。
  • HTTP1.0 与 HTTP2.0 区别

    连接管理:HTTP1.0 默认使用非持久连接,每次请求都需要建立新的连接;HTTP2.0 则使用持久连接(TCP 连接复用),可以在一个连接上发送多个请求和响应。

    头部压缩:HTTP2.0 引入了头部压缩机制(HPACK),可以显著减少头部信息的大小,提高传输效率。

    多路复用:HTTP2.0 支持在同一个连接上并发多个请求和响应,提高了网络资源的利用率。

MySQL 相关

  • 实习中遇到的问题:可能包括性能瓶颈、数据一致性问题、索引优化等。
  • MySQL 优化

    索引优化:创建合适的索引可以显著提高查询性能,如联合索引、覆盖索引等。

    查询优化:避免使用 SELECT *,尽量使用具体的列名;使用合适的查询条件,避免全表扫描;使用 JOIN 替代子查询等。

    配置优化:调整 MySQL 的配置文件,如调整缓冲区大小、连接数等,以适应不同的应用场景。

  • 联合索引排序:对于联合索引 A、b、c,如果 b 和 c 相等而 a 不等,排序会首先按照 a 进行,然后在 a 相同的情况下按照 b 和 c 进行排序(因为 b 和 c 是联合索引的一部分,所以它们的顺序是固定的)。
  • InnoDB 事务隔离级别:默认是可重复读(REPEATABLE READ),它保证了在同一个事务中多次读取同一数据的结果是一致的。

    可重复读问题:可能导致幻读问题,即在同一个事务中,其他事务插入了新的数据,导致当前事务在后续查询中看到了之前不存在的数据。

  • 日志:除了 binlog(二进制日志),还有 redo log(重做日志)和 undo log(回滚日志)等。

    死锁问题:死锁是指两个或多个事务相互等待对方释放资源,从而导致都无法继续执行的情况。可以通过设置合理的锁等待超时时间、优化事务设计等方式来避免死锁。

其他

  • 线程与进程:线程是进程的一部分,共享进程的地址空间和资源;进程则是独立的执行实体,拥有独立的地址空间和资源。
  • Linux 命令:常用的 Linux 命令包括 ls(列出目录内容)、cd(切换目录)、grep(搜索文本)、awk(文本处理)、sed(流编辑器)等。
  • Redis

    set 底层结构:Redis 的 set 数据结构底层通常使用哈希表来实现。

    大量 key 过期:如果同时有一批大量的 key 到达过期时间,Redis 会将这些 key 逐个删除,可能会导致短暂的性能波动。可以通过设置合理的过期时间间隔、使用 lazy expiration(惰性删除)等方式来优化。

算法

  • 乱序数组找最大值和最小值:可以通过一次遍历找到最大值和最小值,时间复杂度为 O(n)。
  • 组合总和算股票最大亏损:可以使用动态规划来解决,但也可以尝试贪心算法(在某些情况下可能得到正确结果,但不一定总是最优解)。

反问

  • 算法有点久没写了,能过吗?有没有什么建议?

    回答:基础挺好,算法我们每轮都要考的,不过已经比之前面的很多要好了。二面肯定还会考算法和智力题,可以准备一下。

二面

编程题

  • 反转双向链表:要求秒答,考察对链表操作的基本掌握。
  • 岛屿数量:要求默写,且不能改变原本数组。第二种方法只说了思路,考察对深度优先搜索(DFS)或广度优先搜索(BFS)的理解和应用。

智力题

  • 摸石头:每次只能拿 1-5 个,怎么保证摸到必赢。考察博弈论和数学推理能力。
  • 三个箱子:一箱全苹果,一箱全梨,一箱混合,三个箱子的标签一定都贴错。选择摸一个箱子里的水果,然后把标签改对。考察逻辑推理和问题解决能力。

项目/基础

  • Redis Set 结构:在青训营中,使用 Redis 的 Set 结构做点赞去重,可以确保每个用户只能点赞一次。
  • 点赞后端处理:用户对一个视频点赞时,后端会先写 Redis(记录点赞状态并去重),再写 MySQL(持久化点赞数据)。通过异步任务或消息队列来保证数据的一致性。
  • 数据一致性:如果先写 MySQL 成功了,但还没写 Redis 就宕机了,可以通过重试机制或补偿事务来恢复数据一致性。
  • Redis 宕机:如果 Redis 宕机且数据全丢,可以通过从 MySQL 中恢复数据来重建 Redis 缓存。如果 Redis 只有两小时前的数据,可以根据业务需求决定是否接受这部分数据丢失,或者通过其他方式(如备份恢复)来恢复数据。
  • 主键策略:设计表时,主键通常使用自增 ID 或 UUID。自增 ID 简单易用,但可能存在分布式环境下的 ID 冲突问题;UUID 则可以确保全局唯一性,但可能占用更多的存储空间。
  • TCP 与 UDP:TCP 是面向连接的可靠传输协议,适用于需要可靠传输的场景;UDP 则是面向无连接的不可靠传输协议,适用于对实时性要求较高但对可靠性要求不高的场景。
  • 进程与线程:进程是独立的执行实体,拥有独立的地址空间和资源;线程是进程的一部分,共享进程的地址空间和资源。线程之间通信和切换比进程更高效。
  • 协程:协程是一种比线程更轻量级的并发执行单元,可以在用户态实现高效的并发执行。
  • Java Map 底层:Java 中的 Map 接口有多种实现,如 HashMap、TreeMap、LinkedHashMap 等。其中,HashMap 的底层是基于哈希表实现的,TreeMap 的底层是基于红黑树实现的。

反问

  • 如果通过的话后面还会有技术面吗?

    回答:校招的话我不太确定是两轮还是三轮啊,社招是有三轮四轮的。

  • 有什么要提升的地方或建议?

    回答:基础总体比较扎实,我这边暂时没有什么建议。当然,我们对应届生的考察也没有很深。

  • 我面试的是什么部门?

    回答:股票行情系统,股票计价之类的,toC。

通过以上面经,可以看出富途在招聘 Golang 开发工程师时,非常注重候选人的基础知识掌握情况、编程能力和问题解决能力。因此,在准备面试时,建议重点复习 Golang 基础知识、网络通信框架(如 gRPC)、数据库优化、算法和数据结构等内容,并多做一些编程题和智力题来提升自己的实战能力。