出发深维智信,拿offer去
💼 岗位职责:
负责SaaS高性能系统的架构设计及研发,研究高稳定性、高可用性的系统架构设计;
协助团队攻克各种数据隔离、系统解耦、效率优化等方面的技术难关。
📋 任职要求:
精通Golang,了解Python,熟悉其它语言如:PHP,JAVA,具备很强的性能调优和线上Trouble Shooting经验;
精通服务端API开发,熟悉微服务架构,有大规模线上系统经验;
熟悉Linux开发环境和命令和线上运维;
精通MySQL数据库、Redis等缓存技术和至少一种消息队列的应用;
学习能力强,抗压能力强,具备很高的团队合作意识。
有ToB业务架构经验。
加分项
从事过人工智能或大数据领域研发者优先
了解或实践过 RAG、AI Agent等 LLM 技术者优先
✨ 面试问题回顾:
1. 自我介绍
自我介绍是面试的开场环节,要简洁明了地介绍自己的姓名、工作经验、擅长的技术领域以及个人优势。
2. 说一下项目的业务,怎么做的,难点在哪,如何解决?
消息队列:
项目业务中,消息队列主要用于异步处理任务和系统间的通信。
实现方式通常是选择一款合适的消息队列中间件,如 RabbitMQ 或 Kafka,进行配置和集成。在代码中,通过生产者将任务发送到消息队列,消费者从队列中获取任务并进行处理。
难点主要是数据倾斜问题、数据不丢以及重复消费。对于数据倾斜,我们通过分析消息的分布情况,调整消费者的分配策略,确保负载均衡。为保证数据不丢,我们采用了消息确认机制,消费者在处理完消息后向消息队列发送确认信号,若未收到确认,则消息队列会重新发送该消息。对于重复消费问题,我们在消费者端对消息进行去重处理,通过记录已处理消息的标识来避免重复消费。
Redis:
在项目中,Redis 主要用于缓存热点数据和加速数据访问。我们使用 hash 结构来存储复杂的数据对象,通过 Pipline 技术批量处理命令,提高性能。对于 bigkey 问题,我们进行拆解,将大键值拆分为小的键值对,避免对内存的过度占用。
难点在于如何选择合适的数据结构和优化 Redis 的使用方式,以提高性能和降低内存占用。通过对业务数据的分析和性能测试,我们不断调整 Redis 的配置和使用策略。
数据库:
我们通过性能优化来提高数据库的查询和写入速度,满足业务需求。性能优化的方法包括分库分表、索引优化、查询语句优化等。
实现方式是根据业务数据的特点和访问模式,设计合理的数据库架构。例如,对于数据量大的表进行分库分表,将数据分散到多个数据库或表中,提高查询性能。同时,对经常查询的字段建立索引,优化查询语句,避免全表扫描。难点在于如何确定最优的分库分表策略和索引设计,以及如何在不影响业务的情况下进行数据库优化。我们通过对业务数据的分析和性能测试,不断调整优化策略,确保数据库的性能和稳定性。
3. 多个数据库怎么连的
通常使用数据库连接池来连接多个数据库。连接池可以管理数据库连接的创建、复用和释放,提高连接的效率和性能。
4. zoomkeeper了解吗
ZooKeeper 是一个分布式协调服务,主要用于解决分布式系统中的一致性问题。它提供了数据存储、通知机制、分布式锁等功能,可以帮助分布式系统中的各个节点进行协调和通信。
5. consul和etcd知道吗
它们都是分布式键值存储系统,主要用于服务发现、配置管理和分布式协调等方面。
Consul 提供了服务发现、健康检查、键值存储、多数据中心支持等功能。它可以自动发现和注册服务,并且可以对服务进行健康检查,确保服务的可用性。同时,Consul 还提供了强大的键值存储功能,可以用于存储配置信息和分布式锁等。
ETCD 是一个高可靠的分布式键值存储系统,主要用于存储关键数据和配置信息。它提供了强一致性的保证,并且支持分布式事务和多版本并发控制。etcd 通常被用于 Kubernetes 等容器编排系统中,用于存储集群的状态信息和配置信息。
6. 什么是CSP理论
它强调通过通信来实现并发进程之间的协作和同步。
7. 消息队列消息积压怎么解决
消息队列消息积压可以通过以下几种方式解决:
增加消费能力:可以增加消费者的数量,或者优化消费者的处理逻辑,提高消费速度。例如,可以使用多线程或分布式消费者来并行处理消息。
用新 topic 解决:如果消息积压严重,可以考虑将积压的消息转移到一个新的 topic 中,然后使用专门的消费者来处理这些积压的消息。这样可以避免影响正常的业务处理。
优化生产端:检查生产端是否存在发送消息过快的情况,如果有,可以调整生产端的发送速度,避免消息积压。
监控和预警:建立消息队列的监控系统,及时发现消息积压的情况,并发出预警,以便及时采取措施。
8. 知道大语言模型吗,他们可以做什么
大语言模型是一种基于深度学习的自然语言处理技术,它可以通过大量的文本数据进行训练,学习语言的规律和模式,从而实现自然语言的理解和生成。
大语言模型可以做很多事情
自然语言生成:可以生成文本内容,如文章、故事、对话等。
问答系统:可以回答用户的问题,提供准确的答案。
机器翻译:可以将一种语言翻译成另一种语言。
情感分析:可以分析文本的情感倾向,如积极、消极、中性等。
文本分类:可以将文本分类到不同的类别中,如新闻、科技、娱乐等。
对话系统:可以与用户进行对话,提供智能的交互服务。
9. 数组和切片有什么区别
长度:数组的长度是固定的,在声明时就必须确定。而切片的长度可以动态变化,可以根据需要进行扩容。
传递方式:数组是值传递,当将数组作为参数传递给函数时,会复制整个数组。而切片是引用传递,当将切片作为参数传递给函数时,只会传递切片的引用,不会复制整个切片。
内存分配:数组在声明时就会分配固定大小的内存空间。而切片是基于数组实现的,它只包含一个指向底层数组的指针、长度和容量。切片的内存分配是动态的,可以根据需要进行扩容。
10. 写代码
//strSlice := []string{"1", "3", "a", "2"}//将其转化成整数的切片package mainimport ( "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.上班时间
#面经##深信服##面试题##offer##Go语言#这里汇总了大量了跟Go相关的面试题和面经,希望对大家有所帮助!