2025年要面试腾讯/阿里/字节,赶紧收藏30道面试官必考题

以下是针对腾讯技术方向(网络编程如Reactor模型、分布式系统/微服务)的10道高频面试题及参考答案,涵盖原理、设计和实战场景:

一:网络编程与Reactor模型

1:Reactor模型的核心原理是什么?如何实现高并发?

【参考答案】:

【核心原理】:Reactor基于事件驱动,使用I/O多路复用(如epoll)监听多个文件描述符的事件(如读/写),通过事件分发器(Dispatcher)将事件分发给对应的事件处理器(Handler)。

【高并发实现】:单线程Reactor适合轻计算场景,多线程Reactor(主从 Reactor)将I/O和计算分离,主线程处理连接,子线程处理业务逻辑。

2:Reactor与Proactor的区别?实际项目中如何选择?

【参考答案】:

Reactor:同步I/O,需用户线程处理数据读写(如epoll_wait + read/write)。

Proactor:异步I/O,由操作系统完成读写,通过回调通知用户(如Windows IOCP)。

【选择依据】:Linux下多用Reactor(配合epoll),高性能服务器优先Reactor;Windows或需要极致性能的场景可选Proactor。

3:如何用epoll实现一个Reactor模型?

【参考答案】:

【步骤】:

\1. 创建epoll实例(epoll_create);

\2. 注册监听socket的EPOLLIN事件;

\3. 主循环调用epoll_wait等待事件;

\4. 根据事件类型分发给AcceptHandler(新连接)或ReadHandler(数据读取)。

【优化点】:使用ET(边缘触发)模式减少事件触发次数,配合非阻塞I/O。

4:解释epoll的LT(水平触发) ET(边缘触发)模式的区别 ?

【参考答案】:

LT:只要文件描述符处于就绪状态,会重复通知,直到数据处理完。

ET:仅在状态变化时通知一次,需一次性处理完数据(避免饥饿)。

【使用场景】:LT适合简单场景,ET需配合非阻塞I/O和循环读取,适合高性能服务器。

二:分布式系统与微服务

5:微服务架构下如何实现服务发现?

【参考答案】:

【核心机制】:

客户端发现:客户端查询服务注册中心(如Consul、Nacos)获取服务实例地址。

服务端发现:通过负载均衡器(如Nginx、Kubernetes Service)转发请求。

【腾讯方案】:可结合Tars框架(内置服务注册与发现)。

6:分布式系统如何保证数据一致性?

【参考答案】:

强一致性:使用分布式事务协议(如2PC、TCC),但性能低。

最终一致性:通过消息队列(如RocketMQ)异步补偿,或使用版本号/向量时钟。

【腾讯场景】:金融场景用TCC,高并发场景用最终一致性+对账机制。

7:CAP定理在微服务设计中的取舍?

【参考答案】:

【CAP】:一致性(C)、可用性(A)、分区容错性(P)三者不可兼得。

【取舍】:

CP:牺牲可用性(如ZooKeeper),适合支付系统。

AP:牺牲一致性(如Eureka),适合社交业务。

【腾讯实践】:根据业务需求选择,如微信支付选CP,朋友圈选AP。

8:如何设计一个高可用的RPC框架?

【参考答案】:

【核心组件】:服务注册中心、负载均衡、熔断降级、序列化协议、传输层(如 TCP/HTTP2)。

【腾讯优化点】:

使用长连接 + 心跳检测保活。

支持多种负载均衡策略(如一致性哈希、加权轮询)。

集成熔断器(如Hystrix思想)防止雪崩。

三:综合设计题

9:设计一个支持百万并发的即时通讯系统(类似微信)

【参考答案】:

【架构分层】:

1:接入层:使用Reactor模型(主从多线程)处理TCP长连接。

2:逻辑层:消息路由、群聊分发、存储消息(如Kafka异步落盘)。

3:存储层:Redis缓存在线状态,MySQL持久化消息(分库分表)。

【腾讯技术栈】:可参考微信的AsyncLog日志系统、自研协议优化带宽。

10:如何实现分布式锁?对比Redis和ZooKeeper的方案

【参考答案】:

【Redis方案】:

使用SET key value NX PX 3000(原子操作+超时)。

缺点:非强一致(主从切换可能丢锁)。

【ZooKeeper 方案】:

创建临时有序节点,最小节点获得锁,监听前序节点释放。

优点:强一致;缺点:性能较低。

【腾讯选择】:高并发Redis(配合RedLock),强一致选ZooKeeper。

【附:腾讯面试加分点】

1:熟悉内部技术栈:如TARS(RPC 框架)、TDMQ(消息队列)、CKV(分布式存储)。

2:性能优化经验:通过火焰图分析CPU瓶颈,内存池减少碎片。

3:业务场景结合:举例说明如何为微信/QQ设计低延迟、高可靠系统。

建议在回答时结合项目经验,突出对高并发、分布式、微服务的理解,并准备手写代码(如Reactor核心逻辑或一致性哈希算法)。

以下是针对阿里巴巴中间件开发(RPC、消息队列)和高并发场景的10 道高频面试题及参考答案,涵盖设计原理、实战场景和优化策略:

一:中间件开发(RPC、消息队列)

1:RPC框架的核心组件是什么?如何设计一个高性能RPC框架?

【参考答案】:

【核心组件】:

1:传输层:基于TCP或HTTP/2实现高效通信(如Netty)。

2:序列化:支持Protobuf、Hessian等高性能协议。

3:服务治理:负载均衡、熔断降级、服务发现(如Nacos)。

【高性能设计】:

使用长连接 + 连接池减少握手开销。

异步非阻塞 I/O(如Netty的EventLoop)。

阿里实践:参考HSF(阿里云分布式服务框架)的线程模型和异步调用链。

2:Dubbo 的 SPI 机制与 Java SPI 有何区别?

【参考答案】:

Java SPI:通过META-INF/services文件加载实现类,不支持按需加载。

Dubbo SPI:

支持扩展点自适应(@Adaptive注解)。

支持扩展点自动包装(Wrapper类)。

文件路径为META-INF/dubbo,性能更高(缓存加载结果)。

3:消息队列如何保证消息不丢失?

【参考答案】:

生产者端:开启事务或Confirm机制(如RocketMQ的SYNC_MASTER模式)。

Broker端:同步刷盘(SYNC_FLUSH) + 多副本(主从同步)。

消费者端:手动提交Offset,确保业务处理完成后再Ack。

阿里实践:RocketMQ的 “同步双写” + 定时巡检补偿。

4:RocketMQ 的存储模型和 Kafka 有何区别?

【参考答案】:

【RocketMQ】:

CommitLog顺序写:所有消息顺序写入一个文件,通过ConsumeQueue索引提高消费速度。

Tag 过滤:支持消息Tag过滤,减少服务端压力。

【Kafka】:

Partition分片:每个Topic分为多个Partition,支持水平扩展。

消费组:支持消费者组内负载均衡。

阿里选择:RocketMQ适合高可靠、顺序消息场景(如金融交易)。

二、高并发场景

5:如何设计一个支撑双十一大促的秒杀系统?

【参考答案】:

【分层削峰】:

1:前端限流:按钮置灰 + 验证码 + 请求随机丢弃。

2:网关层:令牌桶限流 + 请求排队(如Sentinel)。

3:服务层:缓存库存(Redis Lua扣减) + 异步下单(MQ消峰)。

4:数据层:数据库分库分表 + 热点数据单独优化。

【阿里实践】:Lua脚本保证原子性,库存预扣减 + 异步支付回调。

6:分布式事务的最终一致性如何实现?

【参考答案】:

【方案】:

1:本地消息表:业务与消息表绑定,定时任务补偿。

2:MQ事务消息:RocketMQ的事务消息机制(Half Message + Check回查)。

3:Seata框架:AT模式基于全局锁实现两阶段提交。

【阿里实践】:电商下单场景使用RocketMQ事务消息 + 对账系统兜底。

7:如何实现热点数据的动态负载均衡?

【参考答案】:

【识别热点】:实时监控QPS/CPU,或通过分布式追踪(如鹰眼)定位。

【负载策略】:

一致性哈希:避免数据倾斜。

分桶隔离:将热点数据拆分到独立集群(如Redis分片)。

【阿里方案】:Tair的 “热点Key探测” + 本地缓存(如AutoCache)。

8:解释熔断与降级的区别,如何实现?

【参考答案】:

熔断:服务不可用时快速失败(如Circuit Breaker模式),防止雪崩。

降级:牺牲非核心功能(如关闭推荐服务),保障核心链路。

【实现】:

Sentinel:通过QPS/响应时间阈值触发熔断降级。

Hystrix:线程池隔离 + Fallback机制。

三:综合设计与优化

9:如何设计一个高吞吐量的消息队列?

【参考答案】:

【存储优化】:

顺序写CommitLog + 页缓存(MMAP)减少磁盘I/O。

零拷贝技术(sendfile或mmap)提升网络传输效率。

【架构设计】:

Broker集群分片(Topic多Partition)。

生产者和消费者批量发送/拉取消息。

【阿里优化】:RocketMQ的 “异步刷盘” + 堆外内存减少GC。

10:如何解决分布式系统中的时钟不一致问题?

【参考答案】:

逻辑时钟:使用版本号(Version)或向量时钟(Vector Clock)代替物理时间。

全局唯一ID:雪花算法(Snowflake)或Leaf服务生成有序ID。

【阿里方案】:基于TSDB(时间序列数据库)的TSO(Timestamp Oracle)服务。

【附:阿里面试加分点】

1:熟悉内部技术栈:HSF(RPC)、RocketMQ、Sentinel(限流)、Seata(分布式事务)。

2:性能调优经验:通过Arthas诊断性能瓶颈,JVM参数优化(如G1垃圾回收)。

3:业务场景结合:举例说明如何为双十一设计高可用架构,或解决消息积压问题。

建议在回答时结合开源框架(如Dubbo、RocketMQ)源码分析,并准备手写代码(如实现一个简单的RPC调用或线程安全队列)。

以下是针对字节跳动技术方向(算法与数据结构、系统设计如推荐系统)的10道高频C++面试题及参考答案,涵盖代码实现、性能优化和架构设计:

一:算法与数据结构(C++ 实现)

1:合并区间

问题:合并所有重叠区间(例如输入[[1,3],[2,6],[8,10]],输出[[1,6],[8,10]])。

【参考答案】:

#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> merge(vector<vector<int>>& intervals) {
    if (intervals.empty()) return {};    
    sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {    
        return a[0] < b[0];    
    });    
    vector<vector<int>> merged;    
    merged.push_back(intervals[0]);    
    for (int i = 1; i < intervals.size(); ++i) {    
        if (intervals[i][0] <= merged.back()[1]) {      
            merged.back()[1] = max(merged.back()[1], intervals[i][1]);        
        } else {      
            merged.push_back(intervals[i]);        
        }    
    }    
    return merged;
}

关键点:排序后贪心合并,时间复杂度O(n log n)。

2:接雨水

问题:计算柱子排列能接的雨水量(例如输入[0,1,0,2,1,0,1,3],输出6)。

【参考答案】:

#include <vector>
using namespace std;
int trap(vector<int>& height) {
    int left = 0, right = height.size() - 1;    
    int left_max = 0, right_max = 0, water = 0;    
    while (left <= right) {    
        if (height[left] <= height[right]) {      
            if (height[left] > left_max) left_max = height[left];            
            else water += left_max - height[left];            
            left++;        
        } else {      
            if (height[right] > right_max) right_max = height[right];            
            else water += right_max - height[right];            
            right--;        
        }    
    }    
    return water;
}

关键点:双指针向中间逼近,时间复杂度O(n)。

3:二叉树的右视图

问题:返回二叉树从右侧看到的节点值(例如输入二叉树层序遍历 [1,2,3,null,5,null,4],输出[1,3,4])。

【参考答案】:

#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
    int val;    
    TreeNode *left;    
    TreeNode *right;    
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
vector<int> rightSideView(TreeNode* root) {
    vector<int> result;    
    if (!root) return result;    
    queue<TreeNode*> q;    
    q.push(root);    
    while (!q.empty()) {    
        int level_size = q.size();        
        for (int i = 0; i < level_size; ++i) {      
            TreeNode* node = q.front();            
            q.pop();            
            if (i == level_size - 1) result.push_back(node->val);            
            if (node->left) q.push(node->left);            
            if (node->right) q.push(node->right);        
        }   
    }    
    return result;
}

关键点:层序遍历记录每层最后一个节点,时间复杂度O(n)。

4:链表排序(O(n log n) 时间)

问题:对链表进行排序,要求时间复杂度O(n log n),空间复杂度O(1)。【参考答案】:

struct ListNode {
    int val;    
    ListNode *next;    
    ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
    ListNode* sortList(ListNode* head) {    
        if (!head || !head->next) return head;        
        ListNode *slow = head, *fast = head->next;        
        while (fast && fast->next) {         
           slow = slow->next;            
           fast = fast->next->next;        
        }        
        ListNode *mid = slow->next;        
        slow->next = nullptr;        
        ListNode *left = sortList(head);        
        ListNode *right = sortList(mid);        
        return merge(left, right);    
    }
private:    
    ListNode* merge(ListNode* l1, ListNode* l2) {        
        ListNode dummy(0);        
        ListNode *tail = &dummy;        
        while (l1 && l2) {      
            if (l1->val < l2->val) {            
                tail->next = l1;                
                l1 = l1->next;           
            } else {            
                tail->next = l2;                
                l2 = l2->next;            
            }            
            tail = tail->next;        
        }        
        tail->next = l1 ? l1 : l2;        
        return dummy.next;    
    }
};

关键点:归并排序 + 快慢指针找中点,时间复杂度O(n log n)。

二:系统设计(C++ 相关)

5:设计一个推荐系统的实时特征处理模块

问题:如何用C++实现高并发的实时特征计算?

【参考答案】:

【架构设计】:

1:数据分片:使用哈希分片(如一致性哈希)将用户请求分发到不同工作节点。

2:内存存储:利用unordered_map或Redis缓存用户历史行为(如最近 100 次点击)。

3:多线程处理:每个节点启动线程池(如C++11的std::thread + 任务队列),异步计算特征。

【优化点】:

使用无锁数据结构(如boost::lockfree::queue)减少线程竞争。

通过SIMD指令加速向量计算(如用户兴趣向量聚合)。

6:设计一个高性能的推荐模型推理服务

问题:如何用C++部署深度学习模型(如TensorFlow/PyTorch)实现低延迟推理?

【参考答案】:

【核心步骤】:

1:模型优化:将模型转换为ONNX或TensorRT格式,进行量化/剪枝。

2:异步批处理:使用线程池将多个请求合并为Batch推理(减少GPU空闲)。

3:内存管理:通过内存池(如boost::pool)复用输入/输出张量内存。

【性能指标】:

单机QPS 10万+(依赖GPU型号和模型复杂度)。

延迟< 10ms(使用CUDA流和异步数据传输)。

7:如何实现分布式推荐系统的在线学习?

问题:用 C++ 设计一个支持在线更新模型的系统。

【参考答案】:

【架构设计】:

1:参数服务器:使用C++实现参数服务器集群(如gRPC通信),存储模型权重。

2:实时更新:通过Boost.Asio异步处理用户反馈数据,增量更新模型。

3:一致性保证:使用版本号控制参数更新,避免读写冲突。

【挑战】:

处理稀疏特征的高效更新(如哈希表 + 锁分段)。

容错机制(如Checkpoint定期保存模型状态)。

8:设计一个支持千万级用户的实时排行榜

问题:如何用C++实现高效的用户分数更新和排名查询?

【参考答案】:

【数据结构】:

使用跳表(std::set或自定义实现)维护有序分数,插入/查询复杂度O(log n)。

哈希表(std::unordered_map)记录用户当前分数和位置。

【分布式扩展】:

按用户ID分片到多个节点,每个节点维护局部排行榜。

定期合并全局Top K(如每10秒聚合一次)。

三:综合设计题

9:设计一个短视频推荐系统(类似抖音)

问题:如何设计推荐系统的核心组件?

【参考答案】:

【核心模块】:

1:召回层:多路召回(协同过滤、内容匹配、实时热点),使用C++实现高效向量检索(如Faiss库)。

2:排序层:深度模型(如DNN)预估点击率,C++部署模型推理服务。

3:策略层:多样性控制(去重同类视频)、冷启动策略(新用户兴趣探索)。

【性能优化】:

使用内存数据库(如Redis)缓存用户画像和视频特征。

批处理与流式计算结合(如Flink + C++插件处理实时日志)。

10:实现一个线程安全的内存缓存池?

问题:用C++设计一个高性能对象池(如连接池、内存池)。

【参考答案】:
在这里插入图片描述

关键点:通过互斥锁保证线程安全,避免频繁new/delete开销。

【附:字节跳动面试加分点】

1:代码规范:使用RAII管理资源(如std::unique_ptr)、避免裸指针。

2:性能优化:熟悉CPU缓存友好设计、SIMD指令、无锁编程。

3:系统设计:结合业务场景(如抖音推荐、头条新闻流)分析技术选型。

建议在回答时结合C++特性(如移动语义、智能指针)展示代码质量,并准备手写代码(如实现红黑树或线程池)。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

👉 福利来袭CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值