写点什么

出发深维智信,拿 offer 去

作者:王中阳Go
  • 2024-09-27
    浙江
  • 本文字数:2730 字

    阅读完需:约 9 分钟

出发深维智信,拿offer去

文末有面经共享群


下方网站对你会更有帮助的!



就业陪跑训练营网站:https://wangzhongyang.com/

💼 岗位职责:

  1. 负责 SaaS 高性能系统的架构设计及研发,研究高稳定性、高可用性的系统架构设计;

  2. 协助团队攻克各种数据隔离、系统解耦、效率优化等方面的技术难关。

📋 任职要求:

  1. 精通 Golang,了解 Python,熟悉其它语言如:PHP,JAVA,具备很强的性能调优和线上 Trouble Shooting 经验;

  2. 精通服务端 API 开发,熟悉微服务架构,有大规模线上系统经验;

  3. 熟悉 Linux 开发环境和命令和线上运维;

  4. 精通 MySQL 数据库、Redis 等缓存技术和至少一种消息队列的应用;

  5. 学习能力强,抗压能力强,具备很高的团队合作意识。

  6. 有 ToB 业务架构经验。

加分项

  1. 从事过人工智能或大数据领域研发者优先

  2. 了解或实践过 RAG、AI Agent 等 LLM 技术者优先

✨ 面试问题回顾:

1. 自我介绍

自我介绍是面试的开场环节,要简洁明了地介绍自己的姓名、工作经验、擅长的技术领域以及个人优势。

2. 说一下项目的业务,怎么做的,难点在哪,如何解决?

  1. 消息队列

  2. 项目业务中,消息队列主要用于异步处理任务和系统间的通信。

  3. 实现方式通常是选择一款合适的消息队列中间件,如 RabbitMQ 或 Kafka,进行配置和集成。在代码中,通过生产者将任务发送到消息队列,消费者从队列中获取任务并进行处理。

  4. 难点主要是数据倾斜问题、数据不丢以及重复消费。对于数据倾斜,我们通过分析消息的分布情况,调整消费者的分配策略,确保负载均衡。为保证数据不丢,我们采用了消息确认机制,消费者在处理完消息后向消息队列发送确认信号,若未收到确认,则消息队列会重新发送该消息。对于重复消费问题,我们在消费者端对消息进行去重处理,通过记录已处理消息的标识来避免重复消费。

  5. Redis

  6. 在项目中,Redis 主要用于缓存热点数据和加速数据访问。我们使用 hash 结构来存储复杂的数据对象,通过 Pipline 技术批量处理命令,提高性能。对于 bigkey 问题,我们进行拆解,将大键值拆分为小的键值对,避免对内存的过度占用。

  7. 难点在于如何选择合适的数据结构和优化 Redis 的使用方式,以提高性能和降低内存占用。通过对业务数据的分析和性能测试,我们不断调整 Redis 的配置和使用策略。

  8. 数据库

  9. 我们通过性能优化来提高数据库的查询和写入速度,满足业务需求。性能优化的方法包括分库分表、索引优化、查询语句优化等

  10. 实现方式是根据业务数据的特点和访问模式,设计合理的数据库架构。例如,对于数据量大的表进行分库分表,将数据分散到多个数据库或表中,提高查询性能。同时,对经常查询的字段建立索引,优化查询语句,避免全表扫描。

  11. 难点在于如何确定最优的分库分表策略和索引设计,以及如何在不影响业务的情况下进行数据库优化。我们通过对业务数据的分析和性能测试,不断调整优化策略,确保数据库的性能和稳定性。

3. 多个数据库怎么连的

通常使用数据库连接池来连接多个数据库。连接池可以管理数据库连接的创建、复用和释放,提高连接的效率和性能。

4. zoomkeeper 了解吗

ZooKeeper 是一个分布式协调服务,主要用于解决分布式系统中的一致性问题。它提供了数据存储、通知机制、分布式锁等功能,可以帮助分布式系统中的各个节点进行协调和通信。

5. consul 和 etcd 知道吗

它们都是分布式键值存储系统,主要用于服务发现、配置管理和分布式协调等方面。


  • Consul 提供了服务发现、健康检查、键值存储、多数据中心支持等功能。它可以自动发现和注册服务,并且可以对服务进行健康检查,确保服务的可用性。同时,Consul 还提供了强大的键值存储功能,可以用于存储配置信息和分布式锁等。

  • ETCD 是一个高可靠的分布式键值存储系统,主要用于存储关键数据和配置信息。它提供了强一致性的保证,并且支持分布式事务和多版本并发控制。etcd 通常被用于 Kubernetes 等容器编排系统中,用于存储集群的状态信息和配置信息。

6. 什么是 CSP 理论

它强调通过通信来实现并发进程之间的协作和同步。
复制代码

7. 消息队列消息积压怎么解决

消息队列消息积压可以通过以下几种方式解决:


  1. 增加消费能力:可以增加消费者的数量,或者优化消费者的处理逻辑,提高消费速度。例如,可以使用多线程或分布式消费者来并行处理消息。

  2. 用新 topic 解决:如果消息积压严重,可以考虑将积压的消息转移到一个新的 topic 中,然后使用专门的消费者来处理这些积压的消息。这样可以避免影响正常的业务处理。

  3. 优化生产端:检查生产端是否存在发送消息过快的情况,如果有,可以调整生产端的发送速度,避免消息积压。

  4. 监控和预警:建立消息队列的监控系统,及时发现消息积压的情况,并发出预警,以便及时采取措施。

8. 知道大语言模型吗,他们可以做什么

大语言模型是一种基于深度学习的自然语言处理技术,它可以通过大量的文本数据进行训练,学习语言的规律和模式,从而实现自然语言的理解和生成。


大语言模型可以做很多事情


  1. 自然语言生成:可以生成文本内容,如文章、故事、对话等。

  2. 问答系统:可以回答用户的问题,提供准确的答案。

  3. 机器翻译:可以将一种语言翻译成另一种语言。

  4. 情感分析:可以分析文本的情感倾向,如积极、消极、中性等。

  5. 文本分类:可以将文本分类到不同的类别中,如新闻、科技、娱乐等。

  6. 对话系统:可以与用户进行对话,提供智能的交互服务。

9. 数组和切片有什么区别

  1. 长度:数组的长度是固定的,在声明时就必须确定。而切片的长度可以动态变化,可以根据需要进行扩容。

  2. 传递方式:数组是值传递,当将数组作为参数传递给函数时,会复制整个数组。而切片是引用传递,当将切片作为参数传递给函数时,只会传递切片的引用,不会复制整个切片。

  3. 内存分配:数组在声明时就会分配固定大小的内存空间。而切片是基于数组实现的,它只包含一个指向底层数组的指针、长度和容量。切片的内存分配是动态的,可以根据需要进行扩容。

10. 写代码

//strSlice := []string{"1", "3", "a", "2"}//将其转化成整数的切片
package main
import ( "fmt" "strconv")
func strSliceToIntSlice(strSlice []string) ([]int, error) { intSlice := make([]int, 0, len(strSlice)) for _, str := range strSlice { num, err := strconv.Atoi(str) if err!= nil { return nil, err } intSlice = append(intSlice, num) } return intSlice, nil}
func main() { strSlice := []string{"1", "3", "a", "2"} intSlice, err := strSliceToIntSlice(strSlice) if err!= nil { fmt.Println(err) } else { fmt.Println(intSlice) }}
复制代码

11. 反问

  1. 业务是什么

  2. 上班时间


欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。


没准能让你能刷到自己意向公司的最新面试题呢。


感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:【infoQ】。

发布于: 刚刚阅读数: 5
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论 (2 条评论)

发布
用户头像
大家可以一起讨论,看看有哪些题目不会
刚刚 · 浙江
回复
用户头像
需要简历优化、就业辅导、学习路线规划的朋友,可以关注我、私信我❤️
刚刚 · 浙江
回复
没有更多了
出发深维智信,拿offer去_面试_王中阳Go_InfoQ写作社区