头图

今天不只是分享面经,还分享一下主人公的整个面试经历,看看你是否会有相同的思路或者不同的见解,可以在评论区讨论一下:

问在项目里做了什么技术贡献。实施过程中,遇到哪些困难,怎么去思考解决的,然后这个技术贡献对业务的收益

介绍了轨迹增补及去重,以及对账,主动查询任务中心等
0

问轨迹怎么判断相似的

这里他主要是想问的是车辆轨迹这种,和物流的轨迹不一样。所以这一段感觉答的不是很好。

问分库分表怎么预估容量

  • 每天数据量
  • 存储周期
  • 预估增长
  • 预留备份空间

问单表建议放多少数据

5000万行,索引高度3-4层

问用到rocketmq的哪些特性

  • 消息重试机制
  • 延迟消息

rocketmq的最大重试次数

16次

rocketmq的消息是顺序消费吗

区分顺序和并发

rocketmq消费的时候关注哪些配置

  • 并发消费还是顺序消费是消费者客户端决定的
  • tag
  • 重试次数

mysql的事务怎么实现的

Undo Log来回滚

问怎么控制版本,mvcc

垃圾回收的时候,怎么找到所有对象的存储地址

Go中所有的内存分配(如new、make或&操作符分配的内存)都是通过Go运行时的内存分配器(Allocator)完成的。这个分配器维护了一个清晰的内存分配布局:

  • 堆上的对象:由垃圾回收器负责管理,垃圾回收器知道堆上每一个已分配对象的地址和大小。
  • 栈上的对象:分配在Goroutine栈上(通常生命周期较短),GC会通过栈扫描来检查指针。
  • 分配器会记录堆内存块的元信息(Metadata),包括每个对象的起始地址、大小、以及是否包含指针等。这些信息为垃圾回收器提供了跟踪对象的基础。
  • 运行时通过以下机制完全掌握对象地址:
  • 堆的分配是有组织的:

    • 堆内存是分块管理的,GC依赖堆的元数据(如mheap和mspan)知道哪些地址上有对象。
    • 每个分配的对象都有记录,GC能通过扫描堆快速定位它们。
  • 类型元信息(Type Metadata):

    • 编译器在生成代码时会为每种类型附加元信息,包括对象的大小、结构、以及哪些字段是指针。
    • GC使用这些元信息来识别对象中的指针。
  • 栈扫描:

    • GC在运行时可以扫描每个Goroutine的栈,找到栈上的指针,这些指针指向堆中的对象。
    • 栈本身是内存中连续的区域,容易扫描。
  • Go的垃圾回收器能找到所有对象的存储地址,核心在于:

    • 运行时维护了完整的堆内存分配记录,包括每个已分配对象的起始地址、大小和指针布局。
    • 编译器生成的类型元信息帮助GC精确识别对象中的指针。
    • 堆、栈和寄存器的综合扫描,确保找到所有活动对象。
    • 写屏障和并发GC确保垃圾回收过程中不会遗漏新增或修改的对象。

gmp模型中,最多有多少个M

Go语言默认限制M的最大数量为10000。这个限制可以通过runtime/debug包中的SetMaxThreads函数来设置
P个数由GOMAXPROCS确定,默认为处理器核数

redis缓存热点数据,热点key和热点实例

  • redis集群,分散热点数据
  • 多几个实例,做负载均衡

问redis集群怎么扩容

  • 一致性hash
  • 只需要部分迁移,只迁移新增的节点旁的节点数据

读过什么源码吗?

了解过哪些架构设计的思想

  • DDD有哪些名词概念

    • 领域:指一个特定的业务范围或知识领域
    • 实体:实体是领域模型中具有唯一标识符的对象
    • 领域模型:描述了领域内的实体、值对象、聚合根以及它们之间的关系
    • 值对象:领域模型中具有唯一标识符的对象。值对象通常是不可变的
    • 聚合(Aggregate):聚合是一组相关对象的集合,它将领域模型中的实体和值对象组合在一起,作为一个数据修改的单元。例如,在电商系统中,一个订单聚合可能包含订单实体、订单项值对象、收货地址值对象等,这些对象在业务上紧密相关,共同构成了一个完整的订单概念。
    • 聚合根(Aggregate Root):聚合根是聚合中的一个特殊实体,它是聚合的入口点,外部对象只能通过聚合根来访问聚合内的其他对象。
    • 领域服务:一种无状态的操作,它用于实现领域中的业务逻辑,这些逻辑不能自然地归属于某个实体或值对象。例如,在电商系统的促销活动领域,计算商品折扣后的价格这个逻辑可能不适合放在商品实体或订单实体中,因为它涉及到促销规则等多个因素,这时就可以通过领域服务来实现这个计算逻辑。
    • 限界上下文:显示的边界,用于划分领域模型的范围
  • DDD架构思想

    • DDD通常采用分层架构,一般包括用户接口层、应用层、领域层和基础层。这种分层结构有助于分离不同的职责,使系统的各个部分更加独立和易于维护。用户接口层负责处理用户请求和展示数据,例如提供Web界面或者API接口;应用层主要协调领域层和基础层之间的操作,编排业务流程;领域层是核心,包含领域模型和领域服务,用于实现具体的业务逻辑;基础层提供数据存储、外部服务调用等基础功能。
    • 以一个电商系统的下单流程为例,用户接口层接收用户的下单请求并传递给应用层。应用层会调用领域层的领域服务来处理订单的创建,领域服务会与领域模型中的订单实体、商品实体等进行交互,完成业务逻辑,如验证商品库存、计算总价等。最后,领域层将处理结果返回给应用层,应用层再通过用户接口层将结果反馈给用户。同时,在这个过程中,基础层可能会提供数据存储服务,如将订单信息保存到数据库中。

面试官提的建议:

在这些项目中,要更多地从技术层面入手,着重强调技术所带来的贡献与收益,突出技术落地后的实际成效。另外,对于所运用的技术细节,即便大家普遍都在使用某些技术,但其安全性与应用场景紧密相关,你需要深入了解在具体的业务应用场景下,该技术是如何被应用的,包括你自身对这项技术的使用方式等细节,也都需要进一步熟悉掌握。

欢迎关注 ❤

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

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

感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:sf面试群。


王中阳讲编程
805 声望297 粉丝