出发深维智信,拿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面试题 文章被收录于专栏

这里汇总了大量了跟Go相关的面试题和面经,希望对大家有所帮助!

全部评论

相关推荐

与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:21
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务