头图

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


就业陪跑训练营网站:
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. 消息队列

    • 项目业务中,消息队列主要用于异步处理任务和系统间的通信。
    • 实现方式通常是选择一款合适的消息队列中间件,如 RabbitMQ 或 Kafka,进行配置和集成。在代码中,通过生产者将任务发送到消息队列,消费者从队列中获取任务并进行处理。
    • 难点主要是数据倾斜问题、数据不丢以及重复消费。对于数据倾斜,我们通过分析消息的分布情况,调整消费者的分配策略,确保负载均衡。为保证数据不丢,我们采用了消息确认机制,消费者在处理完消息后向消息队列发送确认信号,若未收到确认,则消息队列会重新发送该消息。对于重复消费问题,我们在消费者端对消息进行去重处理,通过记录已处理消息的标识来避免重复消费。
  2. Redis

    • 在项目中,Redis 主要用于缓存热点数据和加速数据访问。我们使用 hash 结构来存储复杂的数据对象,通过 Pipline 技术批量处理命令,提高性能。对于 bigkey 问题,我们进行拆解,将大键值拆分为小的键值对,避免对内存的过度占用。
    • 难点在于如何选择合适的数据结构和优化 Redis 的使用方式,以提高性能和降低内存占用。通过对业务数据的分析和性能测试,我们不断调整 Redis 的配置和使用策略。
  3. 数据库

    • 我们通过性能优化来提高数据库的查询和写入速度,满足业务需求。性能优化的方法包括分库分表、索引优化、查询语句优化等
    • 实现方式是根据业务数据的特点和访问模式,设计合理的数据库架构。例如,对于数据量大的表进行分库分表,将数据分散到多个数据库或表中,提高查询性能。同时,对经常查询的字段建立索引,优化查询语句,避免全表扫描。
    • 难点在于如何确定最优的分库分表策略和索引设计,以及如何在不影响业务的情况下进行数据库优化。我们通过对业务数据的分析和性能测试,不断调整优化策略,确保数据库的性能和稳定性。

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,备注:sf面试群。


王中阳Go
805 声望297 粉丝