附录 E 后端面试基础知识题单
MySQL
- 为什么不能让 MySQL 同时承担所有缓存、搜索、分析和异步消息职责?
- MySQL 的连接层、SQL 层、存储引擎层和文件系统层分别负责什么?
- 线上 MySQL 连接数、CPU、IO 和锁等待异常时,分别应该优先排查什么?
- InnoDB 和 MyISAM 在事务、锁、崩溃恢复和外键方面有什么区别?
- InnoDB Buffer Pool 缓存什么内容?命中率下降会带来什么影响?
- Change Buffer 解决什么问题?为什么它主要针对非唯一二级索引?
- Adaptive Hash Index 的作用是什么?它可能带来哪些副作用?
- Log Buffer、undo log、redo log 和 doublewrite buffer 分别解决什么问题?
- 为什么 InnoDB 需要同时使用 undo log 和 redo log?
- InnoDB 的 WAL 机制如何降低随机写并保证崩溃恢复?
- InnoDB 主键应该遵循哪些设计原则?
- 为什么主键过长会放大所有二级索引的存储成本?
- 金额、状态、时间、字符和大文本字段分别应该如何选择类型?
- 为什么金额通常用整数表示,而不是直接使用浮点数?
- 为什么业务表通常倾向于使用
NOT NULL和明确默认值? - 为什么字符集通常建议统一使用
utf8mb4? - 哪些字段适合做垂直拆分,垂直拆分会解决什么问题?
- 互联网业务为什么常用主键、唯一键和非空约束,而较少依赖跨服务外键?
- 数据库约束、应用状态机、幂等键和异步补偿分别应该承担什么一致性责任?
- 为什么 InnoDB 选择 B+ 树作为主要索引结构?
- B+ 树、B 树和红黑树在树高、磁盘 IO、范围查询和缓存友好性方面有什么差异?
- 如何估算一棵三层 B+ 树大致可以承载多少数据?
- B+ 树容量估算为什么不能只背一个固定数字?
- 什么是聚簇索引?InnoDB 为什么把主键索引作为聚簇索引?
- 什么是二级索引?二级索引叶子节点通常保存哪些内容?
- 什么是回表?哪些查询可以通过覆盖索引避免回表?
- 为什么主键越大,二级索引和 Buffer Pool 的压力通常越大?
- 为什么索引列顺序不能只按字段区分度机械决定?
- 为什么索引不是越多越好?索引过多会增加哪些成本?
- 哪些 SQL 写法容易导致索引失效或效果变差?
- 对索引列使用函数、隐式类型转换和前导模糊匹配分别有什么影响?
EXPLAIN中的type、key、rows、filtered和Extra分别应该关注什么?Using temporary和Using filesort一定代表严重问题吗?- 一条线上慢 SQL 应该按照什么顺序排查?
- 如何区分 SQL 执行慢和 SQL 等锁慢?
- 为什么排查慢 SQL 还需要关注实际参数分布和业务峰值?
- 延迟关联、游标分页和读模型分别适合什么场景?
- 为什么 C 端连续翻页通常更适合 keyset pagination?
- 事务的原子性、一致性、隔离性和持久性分别解决什么问题?
- 事务边界应该如何围绕业务事实和外部调用设计?
- MySQL 的读未提交、读已提交、可重复读和串行化分别有什么特点?
- 什么是快照读?什么是当前读?
- 普通
SELECT、SELECT ... FOR UPDATE、UPDATE和DELETE分别属于哪类读? - InnoDB 默认的可重复读如何处理快照读和当前读?
- MVCC 的隐藏列、undo log、版本链和 ReadView 分别起什么作用?
- RC 和 RR 隔离级别创建 ReadView 的时机有什么区别?
- 为什么 RR 下同一事务的多次普通查询可以保持一致?
- MVCC 如何让普通读和写操作并发执行?
- Record Lock、Gap Lock 和 Next-Key Lock 分别锁住什么范围?
- 为什么 InnoDB 的行锁实际上是加在索引记录上的?
- 为什么没有命中索引的
SELECT ... FOR UPDATE可能表现得像锁表? - 条件更新后为什么必须检查
affected_rows? - 为什么状态更新通常要带前置状态条件或版本号?
- MySQL 死锁通常由哪些因素引起?
- 发现死锁后应该如何定位阻塞链路并治理?
- 为什么事务中不应该长时间调用外部 RPC?
- redo log、undo log 和 binlog 的职责有什么区别?
- 为什么 redo log 和 binlog 需要通过两阶段提交保持一致?
- binlog 有哪些格式?它如何支持复制和数据订阅?
- binlog、CDC、Outbox 和业务消息之间有什么关系?
- MySQL 主从复制的大致流程是什么?
- 主从延迟通常由哪些原因造成?
- 为什么大事务、批量更新、DDL 和从库慢查询会放大复制延迟?
- 读写分离会带来哪些一致性问题?
- 写后粘主、强一致读回主和延迟摘除从库分别适合什么场景?
- MySQL 主库故障切换时需要关注哪些数据丢失和脑裂风险?
- 单主复制和多主复制分别有哪些优缺点?
- 单库单表在什么情况下应该优先通过 SQL、索引、缓存和归档治理?
- 垂直拆分和水平分片分别解决什么问题?
- 单表多少行需要分库分表?为什么不存在固定阈值?
- 分库分表后如何处理跨分片查询、排序和聚合?
- 为什么复杂后台检索通常应该迁移到 Elasticsearch 或专门读模型?
- 水平分片扩容时如何处理路由、迁移、双写、校验和灰度切流?
- MySQL 大表 DDL 为什么可能造成元数据锁、IO 放大和主从延迟?
ALGORITHM=INSTANT、INPLACE和COPY分别意味着什么?- 如何在影子库或预发环境验证大表 DDL 的风险?
- 什么是 expand-contract 发布?它如何降低字段变更风险?
- gh-ost 和 pt-online-schema-change 解决哪类线上 DDL 问题?
- 连接池大小应该根据哪些因素估算?
- 为什么盲目增大连接池可能把数据库推向雪崩?
- MySQL 监控应该覆盖哪些流量、延迟、连接、锁、复制和容量指标?
- MySQL 一条查询从连接建立到返回结果通常会经历哪些阶段?
- SQL 解析、语义检查、优化器和执行器分别承担什么职责?
- 预处理语句如何影响 SQL 解析、计划复用和 SQL 注入风险?
- 为什么数据库连接池不应该在每次请求中重复建立连接?
- MySQL 连接建立、认证和线程管理可能成为哪些线上瓶颈?
- 为什么连接数增加后吞吐不一定增加,反而可能导致上下文切换和锁竞争?
- MySQL 的 autocommit 模式会如何影响事务边界和锁释放时间?
- 长事务会如何影响锁等待、undo 保留、purge 和存储空间?
- 如何识别一个事务是业务执行慢、等待锁,还是客户端没有提交?
COMMIT和ROLLBACK分别会对数据页、日志和锁产生什么影响?- SAVEPOINT 适合解决什么局部回滚问题?
- 为什么事务中间执行外部网络调用会放大数据库资源占用?
- 如何确定一个业务操作应该放在同一个本地事务中?
- 事务隔离级别为什么不是越高越好?
- 脏读、不可重复读和幻读分别是什么?
- 可重复读为什么不等于所有查询结果都永远不变?
- 快照读和当前读混用时,为什么同一事务可能观察到不同语义?
SELECT ... FOR SHARE和SELECT ... FOR UPDATE的使用边界是什么?- 共享锁、排他锁和意向锁分别有什么作用?
- 意向锁为什么能帮助判断表级和行级锁的兼容性?
- 什么是元数据锁?为什么一条看似简单的 DDL 可能被长查询阻塞?
- AUTO_INCREMENT 锁模式会如何影响高并发插入?
- 为什么隔离级别、索引类型和查询条件会共同决定锁范围?
- 如何通过固定访问顺序和稳定排序降低多行更新的死锁概率?
- 如何通过
performance_schema或 InnoDB 锁表查看阻塞链? - 为什么一个索引覆盖了过滤条件,却仍可能产生大量回表?
- 什么是索引条件下推?它如何减少存储引擎返回给服务器层的行数?
- 什么是索引下推之外的执行计划优化,为什么不能只看
key字段? - 统计信息不准确时,优化器可能做出哪些错误选择?
- 直方图、采样统计和手动更新统计信息分别解决什么问题?
- 为什么数据分布变化后原本优秀的执行计划可能突然失效?
- SQL 使用
OR、IN、NOT IN和NULL时分别有哪些优化和语义陷阱? COUNT(*)、COUNT(1)和COUNT(column)的语义有什么区别?NULL为什么会影响比较、唯一约束、聚合和索引判断?DISTINCT、GROUP BY和窗口函数分别适合什么数据处理需求?ORDER BY在没有合适索引时为什么会产生额外排序成本?- 为什么分页排序通常需要加入唯一稳定的 tie-breaker,例如主键?
- 聚合查询、排序查询和 Join 查询分别应该如何设计索引?
- 为什么函数、表达式和隐式转换会阻止数据库直接使用索引顺序?
- 子查询、半连接和 Join 在不同数据量下可能有哪些性能差异?
- 为什么不能只根据 SQL 文本判断查询是否高效?
- 读写分离后,读请求如何根据一致性等级选择主库或从库?
- 如何实现用户写入后在一段时间内粘主,之后再恢复读从?
- 什么是半同步复制?它与异步复制相比牺牲和获得了什么?
- binlog 的 statement、row 和 mixed 格式分别有什么特点?
- 为什么生产环境通常更重视 row 格式的确定性?
- Relay Log 的作用是什么?从库 SQL 线程和 IO 线程分别做什么?
- 数据库高可用系统应该如何设计 fencing、租约和人工接管边界?
- 数据库备份中的全量、增量、binlog 和时间点恢复分别是什么?
- 如何验证备份文件不仅生成成功,而且真正可以恢复?
- 备份、归档、复制和 CDC 如何分别服务灾备、分析和业务同步?
- 在线库与归档库之间的查询边界应该如何定义?
- 为什么按时间分区或分表后仍然需要设计合适的分区键和索引?
- MySQL 分区表解决什么问题?它不能替代哪些分库分表能力?
- 分库分表后全局唯一 ID、唯一约束和自增主键分别有哪些难点?
- 分片路由失败、部分分片不可用和跨分片超时应该如何处理?
- 如何设计分库分表后的灰度迁移和双写校验?
- 如何判断一个查询应该继续留在 MySQL,还是迁移到搜索或分析系统?
- 为什么只保存当前状态而不保存状态变更历史会降低排障和审计能力?
INSERT ... ON DUPLICATE KEY UPDATE适合哪些幂等写入场景?- 条件更新、版本号和状态机在并发修改时如何配合?
- 如何设计批量更新,避免一次事务锁住过多记录?
- 批量删除历史数据时如何控制事务大小、日志量和复制压力?
- 为什么大批量
DELETE可能造成空间不释放和碎片问题? OPTIMIZE TABLE、重建表和在线变更分别有哪些风险?- Buffer Pool 命中率高是否一定代表查询性能好?
- CPU、IO、锁等待、临时表和连接数同时升高时应该如何建立排查假设?
- 为什么 P99 延迟比平均延迟更能暴露 MySQL 的长尾问题?
- 如何把慢 SQL 模板、参数分布和业务接口关联起来?
- 数据库账号、最小权限、审计和敏感字段脱敏分别如何降低风险?
- JSON 字段适合存什么类型的数据?为什么不能把核心查询都藏在 JSON 中?
- 枚举字段、字典表和状态机在可维护性上如何取舍?
- 多租户数据库设计中共享表、独立 Schema 和独立数据库分别适合什么规模?
- 为什么时间范围查询通常需要明确起止边界并避免对时间列套函数?
- 如何设计按创建时间和主键组合的稳定游标?
- 为什么分页游标不能只使用时间字段?
- 如何为报表、客服查询和核心交易链路做资源隔离?
- 线上修复数据时,为什么必须先保留原值、变更原因和操作人?
- 数据修复脚本如何实现小批量、可重入、可暂停和可校验?
- 数据库迁移脚本如何做到向前兼容和可回滚?
- 如何判断一次数据库变更是否需要应用代码、消息消费者和读模型同时升级?
Redis
- Redis 为什么快?
- Redis 的内存模型、单线程命令执行和 IO 多路复用分别带来什么收益?
- Redis 单线程模型为什么能减少锁竞争?它什么时候会成为瓶颈?
- 为什么大 Key、复杂 Lua 脚本、阻塞命令和全量扫描会拖慢整个实例?
- Redis String 的底层 SDS 解决了 C 字符串的哪些问题?
- String、Hash、List、Set 和 ZSet 分别适合哪些业务场景?
SET key value EX ttl适合什么类型的缓存?- Redis String 的
embstr、整数编码和普通动态字符串有什么区别? - Redis Hash 为什么适合局部更新的对象?什么时候应该使用 JSON String?
- Hash 的紧凑编码和哈希表编码分别适合什么规模的数据?
- 为什么大 Hash 上执行
HGETALL可能造成阻塞? - Redis List 的 quicklist 解决了什么空间和性能平衡问题?
- 如何用 List 实现简单 FIFO 队列和最近浏览列表?
- Redis List 为什么不一定适合需要可靠消费、回溯和消费组语义的场景?
- Set 适合解决哪些去重、标签和集合运算问题?
- ZSet 为什么适合排行榜、延时任务和按权重取 TopN?
- ZSet 的 score、跳表和哈希表分别承担什么作用?
- 如何根据访问模式选择 Redis 数据结构,而不是根据数据看起来像什么选择?
- RDB 和 AOF 的工作方式、恢复速度和数据丢失窗口有什么区别?
- 如果业务既关心恢复速度又不希望丢太多数据,RDB 和 AOF 应该如何组合?
- AOF 重写会带来哪些 CPU、磁盘和延迟风险?
- Redis 主从复制解决什么问题?异步复制会带来什么边界?
- Sentinel 和 Redis Cluster 分别解决什么问题?
- Redis Cluster 的 16384 个槽位如何影响路由和扩容?
- Redis Cluster 下多 Key 操作和 Lua 脚本为什么需要考虑同槽约束?
- 为什么 Cluster 解决容量扩展后仍然可能被热 Key 打爆?
- Cache Aside 模式的读路径和写路径是什么?
- 为什么很多业务选择先更新数据库再删除缓存?
- 直接同时写数据库和缓存为什么容易出现旧值覆盖新值?
- 缓存删除失败、主从延迟和并发回填分别会带来什么一致性问题?
- 延迟双删、重试、消息补偿和订阅变更分别适合解决什么问题?
- 缓存穿透、缓存击穿和缓存雪崩分别是什么?
- 如何使用参数校验、空值缓存和布隆过滤器治理缓存穿透?
- 热点 Key 过期导致缓存击穿时,互斥锁、singleflight、预热和异步刷新如何选择?
- 大量 Key 同时过期导致缓存雪崩时,TTL 抖动、多级缓存、限流和降级如何组合?
- Redis 淘汰策略中的 LRU、LFU、volatile 和 allkeys 分别有什么含义?
- 热点分布明显时,为什么 LFU 可能比 LRU 更稳定?
noeviction在没有容量保护时会带来什么风险?- Redis 容量规划应该关注命中率、内存碎片、淘汰策略和过期删除的哪些指标?
- Redis 分布式锁为什么通常使用
SET key value NX EX seconds? - 解锁时为什么必须校验唯一 value 并使用 Lua 保证比较删除原子性?
- 为什么只使用
SETNX而不设置过期时间会造成死锁? - 锁的过期时间设置过短或过长分别有什么风险?
- 为什么分布式锁不能替代数据库约束、幂等键和状态机?
- Redis Cluster 下实现分布式锁时需要注意哪些多 Key 和故障切换问题?
- 什么是 Redis 大 Key?它会影响命令延迟、复制、持久化和迁移的哪些环节?
- 什么是 Redis 热 Key?为什么增加分片数量不一定能解决它?
- 大 Key 应该如何通过拆分对象、拆分集合和限制全量命令治理?
- 热 Key 应该如何通过本地缓存、多级缓存、Key 复制和读扩散治理?
- 为什么生产环境应避免
KEYS *,而优先使用SCAN? - 如何限制大集合遍历的批次和执行时间,避免阻塞 Redis 主线程?
- Redis 线上监控应该覆盖命令延迟、慢查询、内存、碎片、大 Key、热 Key、淘汰、持久化和复制哪些指标?
- Redis 适合做缓存、计数、排行榜、延时任务和协调,但哪些场景不应该把一致性全部压在 Redis 上?
- Redis 的事件循环如何同时处理网络连接、命令执行和后台任务?
- Redis 命令执行为什么要求单次操作尽量短小?
- 一个复杂 Lua 脚本为什么可能阻塞所有客户端请求?
- Redis 的 O(1)、O(log n) 和 O(n) 命令复杂度如何影响线上风险?
- 如何审查一个 Redis 命令是否会在大数据量下造成长尾延迟?
- String、Hash、List、Set 和 ZSet 的时间复杂度分别应该关注哪些常用操作?
- Redis String 如何实现简单对象缓存、版本号和限流计数?
- Hash 局部更新为什么不代表它适合无限增大的对象?
- Hash 字段数量、字段长度和热点字段分布如何影响内存布局?
- List 的
BRPOP为什么不能自动提供消息确认和失败重试? - 使用 Redis List 实现队列时,消费者崩溃后消息可能处于什么状态?
- Set 的交集、并集和差集操作在集合规模很大时有什么风险?
- ZSet 延时队列如何扫描到期任务并避免重复领取?
- ZSet 排行榜更新和查询的热点会如何影响单分片负载?
- Redis RDB fork 过程为什么可能带来额外内存和写时复制压力?
- Redis AOF fsync 策略如何在数据安全和写延迟之间取舍?
- Redis 主从全量同步和增量同步分别在什么情况下发生?
- 主从复制断链重连时,网络带宽和磁盘 IO 可能受到什么影响?
- Sentinel 的故障检测、主观下线和客观下线分别是什么?
- Redis Cluster 扩容时槽位迁移会如何影响客户端请求和热点 Key?
- Cluster 多 Key 命令为什么需要使用 hash tag?
- Cache Aside 回源失败时,应该返回空结果、旧值、降级结果还是错误?
- 如何验证缓存一致性治理方案是否真的能覆盖删除失败和并发回填?
- Redis 作为临时状态存储时,如何防止过期、淘汰和故障恢复造成业务状态丢失?
Kafka
- Kafka 为什么更像分布式日志系统,而不只是消息转发器?
- Broker、Topic、Partition、Producer、Consumer 和 Consumer Group 分别是什么?
- Kafka 为什么采用 Partition 作为并行和扩展的基本单位?
- Kafka 为什么只能保证分区内有序,不能天然保证全局有序?
- Leader、Follower 和 ISR 分别承担什么职责?
- 为什么新 Leader 通常应该从 ISR 中选举?
unclean.leader.election开启后可能获得什么能力,又会牺牲什么?- Producer 写入 Kafka 的完整链路是什么?
acks、batch.size、linger.ms、重试和幂等配置分别影响什么?- Kafka Consumer 为什么采用主动拉取而不是 Broker 推送?
- Consumer Group 如何实现同一 Topic 的负载均衡?
- 为什么同一消费组内一个分区只能由一个消费者处理?
- 分区数少于消费者数时会发生什么?
- Rebalance 会由哪些事件触发?
- Rebalance 为什么会造成消费暂停、重复消费和延迟抖动?
session.timeout.ms和max.poll.interval.ms分别控制什么?- 如何设计消费逻辑,避免处理时间过长触发 Rebalance?
- Kafka 如何保证同一分区内的消息顺序?
- Producer 重试和多个飞行中请求为什么可能破坏消息顺序?
- At-most-once、At-least-once 和 Exactly-once 分别有什么特征?
- 如何组合
acks=all、副本数和min.insync.replicas降低消息丢失风险? - 为什么
acks=all在 ISR 退化到只剩 Leader 时仍然可能是不安全的? - Kafka Producer 幂等性解决的是哪一段链路的重复问题?
- 如何通过业务唯一键、状态机、去重表或 Redis 实现端到端幂等?
- Kafka 事务和业务幂等之间有什么区别?
- Kafka 为什么依赖顺序写日志获得高吞吐?
- Page Cache 在 Kafka 的读写路径中起什么作用?
- 为什么 Kafka JVM 堆不能无限增大?
- 零拷贝如何减少 Kafka 发送消息时的数据复制和上下文切换?
- 批量发送和压缩为什么可以降低单条消息的协议与系统调用开销?
- 增加 Partition 如何提升吞吐,又会引入哪些顺序和运维成本?
- Kafka 积压应该按照什么顺序排查?
- 为什么增加消费者实例不一定能消除积压?
- 增加 Topic 分区时需要评估哪些顺序、路由和迁移影响?
- Producer、Consumer 和下游数据库之间如何建立回压闭环?
- 哪些非核心消息可以在积压时降级、丢弃或跳过?
- Rebalance 频繁时应该检查哪些指标和消费者参数?
acks=1、副本配置和 ISR 异常为什么可能导致丢消息?- Page Cache 不足时 Kafka 的吞吐和延迟为什么会恶化?
- Kafka retention 配置不合理为什么会导致磁盘打满?
- Kafka 应该监控吞吐、请求延迟、副本健康、Lag、Rebalance、磁盘、网络和 Page Cache 哪些指标?
- 如何设计 Kafka 事件的重放、补偿和死信处理?
- Outbox、Kafka 和下游幂等如何组合,保证数据库事实能够可靠传播?
- 如果下游搜索服务不可用,Kafka 消费者应该如何限速、重试和避免积压无限增长?
- Kafka 的 offset 表示什么?它由 Broker、Consumer 还是业务处理器负责推进?
- 自动提交 offset 和手动提交 offset 分别有哪些重复与丢失风险?
- 为什么消费者应该在业务处理成功后再提交 offset?
- 消费者处理成功但提交 offset 失败时,如何通过幂等应对重复消费?
- 消费者提交 offset 成功但业务处理失败时,为什么可能造成消息丢失?
- Kafka 消息保留时间和消费完成时间之间是什么关系?
- 如何根据消息大小、峰值吞吐和保留周期估算磁盘容量?
- Kafka segment 文件、索引和日志清理分别承担什么职责?
- 时间保留、大小保留和压缩日志分别适合什么消息类型?
- 为什么 Kafka 的顺序只能在业务选择的分区范围内成立?
- 分区 key 选择不均会造成哪些热点和并行度问题?
- 增加分区后,旧消息顺序和新消息路由可能发生什么变化?
- Producer 批量大小过小或过大会分别带来什么问题?
linger.ms增大为什么可能提高吞吐却增加尾延迟?- 压缩算法如何在 CPU、网络带宽和 Broker 磁盘之间取舍?
- Producer 重试时如何避免重复写入、乱序和无限等待?
- Kafka 事务为什么不能替代下游数据库的业务幂等?
- Consumer 批量拉取和批量提交如何影响吞吐、延迟和重复范围?
- 消费线程中执行慢 SQL 或外部 RPC 为什么会造成 Rebalance?
- 如何将消费拉取、业务处理和 offset 提交拆成可控的线程模型?
- Kafka Lag 的绝对值、增长速度和分区分布分别说明什么?
- 如何区分生产速率增加、消费速率下降和单分区热点造成的积压?
- 为什么只扩 Consumer 实例不能突破分区并行度上限?
- 消费者扩容时如何避免 Rebalance 本身制造更大积压?
- 下游数据库限流时,Kafka 消费者如何调整批量、并发和提交节奏?
- 如何通过死信 Topic、重试 Topic 和人工重放处理永久失败消息?
Elasticsearch
- Elasticsearch 与 MySQL 在检索模型上有什么根本区别?
- 什么是倒排索引?它为什么适合全文检索?
- Term、Posting List、Document、Segment 和 Analyzer 分别是什么?
- Posting List 为什么通常还需要记录词频和位置?
- Elasticsearch 为什么适合搜索、过滤和聚合,却不适合作为高频事务主库?
- Index、Primary Shard、Replica Shard 和 Routing 分别是什么?
- 分片解决容量和并行问题,副本解决哪些问题?
- 为什么分片不是越多越好?
- 分片数过多会带来哪些元数据、小 Segment 和协调开销?
- 分片数过少会限制哪些扩展能力?
- 副本数增加后为什么会同时影响读吞吐、容灾、写延迟和网络成本?
- Elasticsearch 一次写入请求经过哪些协调、路由、内存缓冲和副本复制阶段?
- translog、内存 buffer、refresh 和 segment 分别起什么作用?
- 为什么 Elasticsearch 被称为 near real-time search?
- 写入成功为什么不代表文档可以立即被搜索到?
- Elasticsearch 的 Query Phase 和 Fetch Phase 分别做什么?
- 为什么没有 routing 的查询可能广播到多个分片?
- 跨分片查询为什么会增加协调、排序和网络成本?
- Mapping 如何影响搜索质量、聚合能力和资源成本?
text和keyword的区别是什么?- 为什么同一个业务字段经常需要同时保留全文字段和
.keyword子字段? - Analyzer 的字符过滤、Tokenizer 和 Token Filter 分别是什么?
- 中文分词策略如何在召回率和精确度之间取舍?
- 分词器选择不当会造成哪些召回、噪声和聚合问题?
- BM25 主要依据哪些因素计算相关性?
- 为什么业务排序经常需要和相关性评分拆开设计?
filter查询和依赖 score 的查询分别适合什么场景?from + size为什么会在深分页时消耗大量 CPU、内存和网络?scroll、search_after和from + size分别适合什么场景?- 为什么
search_after需要稳定且唯一的排序条件? - Elasticsearch 写入性能优化应该关注 bulk、refresh、副本和 Segment Merge 哪些因素?
- 查询性能优化为什么要缩小时间、租户和业务范围?
- 如何避免动态字段导致 mapping explosion?
- 为什么要控制单分片大小并减少过多小分片?
- Elasticsearch 写入延迟升高时,应该检查 bulk、refresh、translog、merge 和磁盘哪些指标?
- 查询抖动、慢查询和缓存命中率异常应该如何排查?
- 磁盘高水位通常由哪些数据生命周期和副本问题造成?
- ILM、冷热分层和索引保留周期分别解决什么问题?
- “脑裂”问题的本质是什么?现代集群如何降低这种风险?
- Elasticsearch 应该监控集群健康、未分配分片、bulk、refresh、merge、查询延迟、GC 和磁盘哪些指标?
- Elasticsearch 作为搜索读模型时,如何处理索引延迟、索引落后和索引重建?
- Lucene Segment 为什么设计成不可变结构?
- Segment Merge 会带来哪些磁盘、CPU、IO 和查询抖动?
- Segment 数量过多为什么会影响查询和资源占用?
- Elasticsearch refresh interval 如何影响写入可见性和查询性能?
- 强制 refresh 为什么会降低批量写入吞吐?
- translog 持久化和搜索可见性为什么是两个不同的时间点?
- Elasticsearch 写入确认和副本确认之间有什么关系?
- 副本未分配时,写入和读取分别可能受到什么影响?
- 主分片数量创建后为什么不容易直接调整?
- Reindex 为什么常用于 mapping、分词器和索引结构变更?
- Reindex 期间如何处理源库持续变更和新旧索引切换?
- Alias 如何帮助实现无停机索引重建和灰度切换?
- 动态 Mapping 为什么可能造成字段类型错误和字段爆炸?
- 如何为金额、状态、时间、ID 和全文字段选择 Elasticsearch 类型?
keyword字段的 doc_values 适合哪些排序和聚合场景?text字段为什么通常不能直接用于聚合和排序?- Analyzer 在索引时和查询时不一致会造成哪些召回问题?
- 同义词、停用词和自定义词典变更为什么可能需要重建索引?
- BM25 的词频、逆文档频率和字段长度因素如何影响排序?
- 多字段查询中的 boost、should 和 minimum_should_match 分别可能解决什么问题?
- 为什么过滤条件通常应该放进 filter context 而不是全部依赖 score?
- 高基数字段聚合和深分页分别有哪些资源风险?
- 写入拒绝、线程池队列积压和 bulk 超时分别说明什么?
- 删除文档为什么通常表现为删除标记而不是立即物理删除?
- 如何通过索引模板统一新索引的 mapping、settings、分片和副本配置?
- 按天、按月或按租户切索引时,分别会带来哪些查询和生命周期成本?
- 为什么索引生命周期设计应该同时考虑写入热度、查询热度和保留期限?
- 什么时候应该使用 keyword 精确过滤,什么时候应该使用 text 全文匹配?
match、term、range和bool查询分别适合什么条件?- 为什么对 keyword 字段使用错误的 match 查询可能造成意外召回?
- 高亮、聚合和排序分别会增加搜索请求的哪些资源成本?
- 为什么深分页通常应该转化为游标、导出任务或离线查询?
- 如何限制单次搜索的
from、size、聚合桶数和超时时间? - Elasticsearch 查询超时后,客户端应该如何处理部分结果和重试?
- 分片分配失败时,应该检查节点资源、分配规则、磁盘水位和索引设置哪些因素?
- 未分配副本分片为什么会降低容灾能力,即使读请求仍然成功?
- 如何通过限速和维护窗口控制分片迁移对线上流量的影响?
- Elasticsearch 集群为什么不应该把主节点、重写入节点和重查询节点完全混在一起?
- 主节点选举抖动和数据节点 GC 抖动分别应该如何排查?
- bulk 请求过大、过小或并发过高分别会造成什么问题?
- 写入端如何根据拒绝数、延迟和失败率动态调整 bulk 并发?
- 如何用一组可验证指标判断 Elasticsearch 索引设计是否满足搜索质量和性能目标?
- 搜索索引和主数据库之间出现文档缺失时,如何通过对账发现差异?
- 如何设计按时间窗口、租户或业务状态执行的增量重建任务?
- 为什么索引版本号和别名切换可以降低 mapping 变更风险?
- 查询结果为空时,如何区分没有命中、分词错误、过滤错误和索引延迟?
- 查询结果过多时,如何通过召回、过滤、分页和排序控制响应成本?
- 为什么搜索排序稳定性需要包含唯一字段作为次级排序?
- 如何在搜索质量、实时性、集群成本和可运维性之间做取舍?
Docker
- 容器和虚拟机在启动速度、资源开销和隔离边界上有什么区别?
- 容器化为什么不能自动解决状态管理、跨机网络、安全和故障治理?
- Docker Image、Container 和 Runtime 分别是什么?
- Namespace 和 cgroup 分别解决什么问题?
- PID、Network、Mount 和 UTS Namespace 分别隔离了什么视图?
- 为什么容器在宿主机上仍然是普通进程?
- 为什么镜像应该尽量精简?
- 基础镜像、依赖版本和镜像签名会影响哪些安全与可复现问题?
- 为什么容器日志通常应该输出到标准输出和标准错误?
- 容器中的临时文件和持久化数据应该如何区分?
- Volume、Bind Mount 和临时文件系统分别适合什么场景?
- 容器 CPU 和 Memory 限额为什么不能依赖默认配置?
- 容器资源限制设置过低或过高分别会带来什么问题?
- 如何判断容器化部署是否真正提升了交付效率,而不是增加了运维复杂度?
- 容器网络中端口映射、服务发现和跨主机通信分别由什么层负责?
- 容器进程收到停止信号后,为什么需要实现优雅退出?
- 如何排查一个容器“能启动但无法提供服务”的问题?
- Dockerfile 中基础镜像、工作目录、复制文件、安装依赖和启动命令分别应该如何组织?
- 为什么 Dockerfile 指令顺序会影响构建缓存命中率?
- 如何通过先复制依赖清单、后复制业务源码减少镜像重复构建?
- 为什么不应该把编译工具链和源码都保留在最终运行镜像中?
- 多阶段构建如何减小最终镜像并降低攻击面?
- 镜像层中的删除为什么不一定真正减少最终镜像大小?
- 容器镜像标签漂移为什么会破坏发布可追溯性?
- 镜像摘要和不可变版本号如何帮助实现可复现部署?
- 容器内 PID 1 为什么需要正确处理信号和子进程回收?
- 容器中使用 tini 或等价 init 进程可以解决什么问题?
- 容器停止超时过短会如何影响 HTTP 连接、消息消费和数据库事务?
- 容器健康检查与 Kubernetes 探针之间是什么关系?
- 为什么容器重启策略不能替代应用故障根因治理?
- 容器文件系统的可写层为什么不适合作为长期数据存储?
- Volume 的生命周期为什么应该独立于容器生命周期?
- 端口发布和容器内部监听地址之间有什么关系?
- 如何排查容器 DNS、网络命名空间和宿主机防火墙造成的连接失败?
- 内存 limit 触发后为什么可能直接由内核 OOM Killer 终止进程?
- CPU limit 过低为什么可能造成应用延迟升高但进程没有退出?
- 容器的 requests 和 limits 与 Kubernetes 的 requests 和 limits 有什么联系?
- 容器日志输出到标准输出后,采集系统还需要解决哪些轮转和背压问题?
- 容器镜像中的操作系统包如何进行漏洞扫描和版本治理?
- 为什么使用 root 用户运行容器会扩大安全风险?
- Linux capabilities 和 seccomp 可以限制容器的哪些内核能力?
- 为什么 privileged 容器会削弱默认隔离边界?
- 容器逃逸风险通常与哪些内核、运行时和权限配置有关?
- 容器内进程的文件描述符限制如何影响高并发网络服务?
- 如何排查容器中连接数、文件描述符和进程数达到上限的问题?
- 构建过程如何保证第三方依赖版本和软件包来源可追溯?
- 容器运行时、镜像仓库和 Kubernetes 节点之间如何协作?
- 一个容器启动后立即退出时,应该优先检查命令、环境变量、权限还是依赖服务?
- 一个容器内存持续上涨时,如何区分泄漏、缓存增长、堆外内存和页缓存?
- 如何让容器中的任务支持重复执行、失败重试和安全退出?
Kubernetes
- Kubernetes 为什么采用声明式对象和控制器,而不是只提供一个启动容器的命令?
- Pod 为什么是 Kubernetes 的最小调度和运行单元?
- Deployment、StatefulSet、DaemonSet、Job 和 CronJob 分别适合什么场景?
- 为什么数据库或有稳定身份的组件通常不直接使用 Deployment?
- Ingress 与 Service 的职责有什么区别?
- ConfigMap 和 Secret 分别适合保存什么内容?
- Secret 为什么不等于完成了密钥的全生命周期安全治理?
- API Server、Scheduler、Controller Manager 和 etcd 分别负责什么?
- kubelet 和 kube-proxy 分别负责什么?
- Kubernetes 控制器如何持续把实际状态拉回期望状态?
- Scheduler 如何综合节点资源、标签、亲和性、污点和拓扑约束选择节点?
- Pod 调度失败时,为什么集群还有空闲 CPU 也不一定能成功调度?
requests和limits分别代表什么?requests设置过低会导致什么超卖和争抢问题?limits设置过低为什么可能导致 CPU 限流或 OOMKilled?- 为什么工作负载既不设置 requests 也不设置 limits 会增加排障难度?
- Rolling Update 如何降低发布过程中的整体风险?
- Readiness Probe 和 Liveness Probe 分别解决什么问题?
- 为什么启动慢的应用不应该简单交给 Liveness Probe 处理?
preStop和优雅终止如何减少连接被硬切断?- Kubernetes 如何实现服务发现?
- Pod 网络、Service 网络和 Ingress 网络分别位于哪一层?
- 为什么应用不应该依赖 Pod IP 永久稳定?
- 如果域名能访问 Ingress 但后端返回 502,应该按什么层次排查?
- 如何设计 Kubernetes 中配置变更的灰度和回滚路径?
- 为什么发布系统必须关注连接摘流、依赖超时和跨服务版本兼容?
- Pod 长时间处于 Pending 时应该检查哪些资源、PVC、标签、污点和调度事件?
ImagePullBackOff通常由哪些镜像、鉴权和网络问题导致?CrashLoopBackOff应该如何结合容器日志、启动参数和依赖状态排查?- Kubernetes 控制面的 API Server 延迟、etcd 健康和调度失败率分别说明什么?
- 节点 CPU、内存、磁盘、inode 和网络丢包异常会如何影响 Pod?
- 如何通过多副本、跨节点分布和 PodDisruptionBudget 降低运维操作抖动?
- 为什么需要清理无效镜像和历史 ReplicaSet?
- Kubernetes 工作负载应该统一哪些探针、资源、日志和标签规范?
- 如何设计一个可以灰度、观测、暂停和回滚的 Kubernetes 发布流程?
- Kubernetes 具备高可用控制面是否意味着业务应用天然高可用?
- Kubernetes 的声明式 API 为什么有利于审计、回滚和自动收敛?
spec和status在 Kubernetes 对象中分别表达什么?- Controller 为什么需要持续监听资源变化并重复执行收敛逻辑?
- Kubernetes 控制器如何处理事件丢失、重复通知和最终一致性?
- Pod 中的多个容器为什么共享网络命名空间和部分存储卷?
- Sidecar 容器适合承担哪些代理、采集和辅助职责?
- 为什么不应该把所有业务进程都塞进同一个 Pod?
- Pod 重启、Pod 重建和容器重启有什么区别?
- Deployment 的 ReplicaSet 为什么可以帮助实现滚动发布和回滚?
- StatefulSet 的稳定网络身份、稳定存储和有序发布分别解决什么问题?
- DaemonSet 为什么适合节点级日志、监控和网络组件?
- Job 和 CronJob 如何处理一次性任务、失败重试和周期调度?
- Service 的 ClusterIP、NodePort 和 LoadBalancer 分别适合什么访问场景?
- Service selector 配置错误会造成什么现象?
- Endpoint 和 EndpointSlice 在服务发现中承担什么作用?
- Headless Service 适合哪些需要直接发现 Pod 的场景?
- NetworkPolicy 可以限制哪些 Pod 间通信?
- 为什么“Pod IP 可达”不等于“应用接口一定可用”?
- NodeSelector、Node Affinity 和 Pod Affinity 分别适合什么调度约束?
- Pod Anti-Affinity 在高可用服务中有什么价值?
- Burstable、Guaranteed 和 BestEffort 工作负载在资源争抢时有什么差异?
emptyDir、PersistentVolume、PersistentVolumeClaim 和 StorageClass 分别是什么?- PVC 长时间 Pending 时应该检查哪些存储类、访问模式和供给问题?
- Readiness、Liveness 和 Startup Probe 的职责有什么差异?
- 为什么 Startup Probe 可以避免慢启动应用被 Liveness 过早重启?
- 如何在发布过程中保证至少有足够副本继续服务?
- 灰度发布、金丝雀发布、蓝绿发布和滚动发布分别适合什么场景?
- 如何根据指标、日志和业务成功率自动暂停或回滚发布?
- PodDisruptionBudget 如何限制主动驱逐对服务可用性的影响?
- 节点 drain 时,DaemonSet、StatefulSet 和普通 Deployment 的行为有什么区别?
- 为什么节点磁盘压力会导致 Pod 驱逐和新 Pod 调度失败?
- 如何监控节点 inode、容器日志和镜像层造成的磁盘消耗?
- API Server 延迟升高时,如何区分 etcd、认证、Webhook 和控制器压力?
- etcd 数据增长、磁盘延迟和快照失败会如何影响控制面?
- Scheduler 失败率升高时,如何从事件、资源和约束链路定位原因?
- CrashLoopBackOff 的重启退避为什么不能被简单理解为应用已经恢复?
- ImagePullBackOff 时如何区分镜像不存在、鉴权失败、DNS 失败和仓库限流?
- Service 访问偶发失败时,如何检查 Endpoint 变化、连接跟踪和后端就绪状态?
- Pod 被 OOMKilled 后,为什么还要检查实际峰值、sidecar 和节点压力?
- Kubernetes 日志采集链路中的容器日志轮转、节点磁盘和下游积压如何治理?
- Kubernetes 监控应该覆盖控制面、节点、Pod、容器、网络和业务指标哪些层次?
- 多租户 Kubernetes 集群如何通过 Namespace、RBAC、ResourceQuota 和 NetworkPolicy 隔离?
- 为什么 RBAC 最小权限原则需要同时应用于人、服务账号和控制器?
- 如何设计 Kubernetes 集群的备份、灾难恢复和跨区域故障切换?
操作系统
- 进程、线程和协程分别是什么?
- 进程为什么是资源分配的基本单位,线程为什么是常见的调度单位?
- 多进程、多线程和协程在隔离性、调度成本和通信方式上如何取舍?
- 为什么线程共享内存既是性能优势也是并发风险?
- 协程为什么更适合高并发 I/O 场景?它为什么不是免费的线程替代品?
- Linux 进程的运行态、可中断睡眠、不可中断睡眠、僵尸态和停止态分别说明什么?
- 为什么僵尸进程会出现?父进程应该如何回收子进程状态?
- 孤儿进程和僵尸进程有什么区别?
- 线程数暴涨为什么会导致上下文切换、栈内存和尾延迟上升?
- 操作系统调度器如何在优先级、公平性和任务类型之间做平衡?
fork如何通过写时复制降低创建子进程的初始开销?fork后哪些操作会真正触发页面复制?- 为什么
fork后立刻exec是一种常见模式? - 虚拟内存解决了哪些地址空间隔离和资源管理问题?
- 页表和 TLB 分别是什么?TLB 缓存为什么能提高地址转换效率?
- 虚拟地址空间通常包含代码段、全局数据区、堆、栈和映射区域中的哪些部分?
- 缺页异常是如何产生和处理的?
- 内存压力过高时为什么会发生抖动?
- 如何使用
free、vmstat、top和/proc/<pid>/status判断内存问题? - RSS、VIRT 和页错误分别能帮助判断什么?
- 栈和堆在生命周期、分配速度、空间限制和风险上有什么区别?
- 为什么 GC 语言也需要理解对象逃逸和堆分配?
- FIFO、LRU 和 LFU 分别适合什么缓存访问模式?
- 执行
ls时会经过哪些用户态、系统调用、页缓存和文件系统步骤? - 阻塞 I/O、非阻塞 I/O 和 I/O 多路复用分别有什么特点?
select、poll和epoll的核心差异是什么?epoll为什么更适合监听大量网络连接?- 文件 I/O、网络 I/O、WAL 刷盘和日志写入中的性能瓶颈有什么共同点?
- 互斥锁、读写锁、条件变量、信号量和原子操作分别适合什么场景?
- 线程间同步和进程间同步有什么区别?
- 管道、共享内存、消息队列和 Unix 域套接字分别适合什么 IPC 场景?
- 通信和同步为什么不是同一个概念?
- 死锁产生的互斥、占有且等待、不可抢占和循环等待四个必要条件是什么?
- 如何通过统一加锁顺序、缩小临界区和超时回滚降低死锁风险?
- 为什么锁内调用外部服务容易造成线程长期占用和级联阻塞?
- 如何从线程栈、锁等待、
pstack、gdb、jstack或 Goroutine dump 定位死锁? - 为什么
sleep不能替代锁、条件变量或显式事件通知? - 忙等在什么极端低延迟场景可能有价值?它又会带来什么 CPU 风险?
- 为什么高并发网关常采用非阻塞 I/O 和事件循环?
- 为什么任务计算服务可能更适合多进程、线程池或受控执行队列?
- CPU 打满、内存上涨、磁盘繁忙和 load 高但吞吐低分别应该如何解释?
- 如何区分正常 Keep-Alive、半连接堆积、TIME_WAIT 和 CLOSE_WAIT 异常?
- 数据库刷盘、消息落盘和日志刷盘为什么都离不开页缓存与文件系统语义?
- 进程的独立地址空间、文件描述符表和资源上下文分别意味着什么?
- 线程共享代码、堆、文件和全局状态会带来哪些通信便利与数据竞争风险?
- 协程由用户态调度时,哪些工作仍然需要操作系统线程完成?
- 多进程模型为什么通常隔离性更好,但 IPC 和上下文切换成本更高?
- 多线程模型为什么适合共享内存服务,又为什么容易出现局部故障扩散?
- 如何根据隔离性、调度成本和通信方式选择并发模型?
- 运行态和可运行队列分别表示什么?
- 进程为什么会进入可中断睡眠或不可中断睡眠?
- 为什么处于不可中断睡眠的进程可能对普通
kill不敏感? - 父进程没有调用
wait时,子进程退出后会留下什么资源? - 大量僵尸进程如何耗尽 PID 或进程表资源?
- 孤儿进程被重新收养后,为什么通常不会像僵尸进程一样长期占用退出状态?
- 时间片、优先级和公平调度如何共同影响尾延迟?
- 线程栈大小如何影响单进程可创建的线程数量?
- 上下文切换为什么可能同时带来 CPU、缓存和调度器开销?
fork复制页表时为什么仍然可能消耗大量内存和时间?- 父进程和子进程共享文件描述符时,文件偏移和关闭行为会怎样?
exec替换进程映像时,哪些进程属性会保留,哪些会变化?- 信号、管道和等待子进程如何协同实现进程生命周期管理?
- 虚拟地址空间如何隔离不同进程并提供更灵活的内存映射?
- TLB 未命中和页错误有什么区别?
- Minor Page Fault 和需要磁盘读取的 Major Page Fault 在性能上有什么差异?
- 交换分区或 swap 频繁使用为什么会导致服务尾延迟暴涨?
- 内存抖动时为什么可能出现 CPU 不低但业务吞吐下降?
- RSS、VIRT、Shared 和匿名页分别可以帮助定位什么?
- 页缓存增长为什么不一定等于业务内存泄漏?
- 堆碎片、对象缓存和内存映射分别可能造成什么内存现象?
- 栈溢出、堆溢出和内存泄漏在现象和排查方式上有什么区别?
- 文件描述符为什么是进程资源限制中的关键指标?
ulimit -n过低会如何影响高并发网络服务?- 目录项缓存、inode 缓存和页缓存分别提高了哪些文件系统操作的速度?
fsync、fdatasync和异步写入在持久性与延迟上有什么取舍?- 为什么同步刷盘会提高可靠性,却可能造成长尾延迟?
- 顺序写和随机写对磁盘、SSD 和文件系统的压力有什么不同?
select每次调用为什么需要重新传递和遍历文件描述符集合?epoll的水平触发和边缘触发分别有什么语义?- 边缘触发模式为什么要求应用持续读取直到
EAGAIN? - Reactor、Proactor、线程池和协程模型分别如何组织 I/O 事件与业务执行?
- 原子操作适合哪些短小状态更新?它不能解决哪些复合逻辑问题?
- 读写锁在读多写少场景中的优势和饥饿风险是什么?
- 条件变量为什么通常需要放在循环条件判断中使用?
- 如何通过资源排序、锁超时和 try-lock 打破死锁条件?
- 为什么缩短临界区比单纯更换一种锁更重要?
- 如何从 load 高但 CPU 低的现象推断不可中断睡眠或 IO 阻塞?
- 为什么 CPU 高时要区分用户态计算、内核态系统调用、软中断和锁竞争?
- 网络服务的线程数、连接数、文件描述符和事件循环之间有什么容量关系?
- 如何把进程、内存、文件系统、I/O 和同步知识用于解释一次线上高延迟事故?
计算机网络
- OSI 七层模型和 TCP/IP 分层模型在工程上有什么意义?
- “输入一个 URL 后发生了什么”应该按哪些 DNS、TCP、TLS、HTTP 和服务端步骤回答?
- TCP 为什么通常需要三次握手而不是两次?
- TCP 四次挥手为什么通常不是三次?
- TIME_WAIT 是什么?为什么主动关闭连接的一方可能进入 TIME_WAIT?
- CLOSE_WAIT 是什么?大量 CLOSE_WAIT 通常说明哪类应用问题?
- 大量 TIME_WAIT 应该如何区分短连接风暴、正常流量和攻击流量?
- TCP 粘包的本质是什么?
- HTTP 方法的语义如何影响幂等性、缓存性和重试安全性?
- HTTP/1.1、HTTP/2 和 HTTP/3 在连接复用、多路复用、头部压缩和队头阻塞上有什么差异?
- HTTPS 在 HTTP 之下增加了哪些身份认证、加密和完整性能力?
- TLS 握手、证书管理和加解密会带来哪些性能与运维成本?
- DNS 如何参与就近访问、故障切换和流量调度?
ping能证明什么,不能证明什么?- 连接池复用差、TLS 握手过多和 TCP 重传如何共同放大接口延迟?
- 网络超时、重试、幂等和降级应该如何一起设计?
- 网络分层为什么能降低协议实现和故障定位的复杂度?
- SYN Flood 为什么会占用半连接队列?
- 为什么主动关闭方通常进入 TIME_WAIT,而被动关闭方可能进入 CLOSE_WAIT?
- Keep-Alive、连接池和 HTTP/2 多路复用如何降低建连成本?
- Nagle 算法和 TCP_NODELAY 会如何影响小包延迟与网络效率?
- 网络服务为什么需要同时配置连接超时、读超时、写超时和空闲超时?
- 客户端重试为什么必须结合幂等键、退避和抖动?
- HTTP GET、PUT 和 DELETE 的幂等语义如何影响自动重试?
- HTTP POST 如何通过幂等键支持安全重试?
- 代理或网关为什么可能修改 Host、X-Forwarded-For 和协议头?
- HTTP/2 多路复用为什么仍可能受到丢包影响?
- QUIC 为什么能减少 TCP 连接级队头阻塞?
- DNS 递归查询、权威查询和本地缓存之间如何协作?
- CDN 缓存穿透和回源风暴应该如何治理?
- 负载均衡如何处理健康检查、连接摘除和长连接?
- 反向代理重试为什么可能让下游流量成倍增加?
- API Gateway 通常承担哪些鉴权、限流、路由和观测职责?
- Service Mesh 的 sidecar 会引入哪些网络跳数和排障成本?
- “本机正常、跨机器失败”通常应该优先排查哪些网络层差异?
- “连接建立成功但请求无响应”可能由读取、线程、锁和下游依赖哪些问题造成?
- “请求偶发超时”如何区分 DNS、连接建立、TLS、服务端处理和响应传输阶段?
ss中的 Recv-Q 和 Send-Q 可以帮助判断什么队列压力?tcpdump如何通过 SYN、ACK、RST、重传和窗口变化辅助定位故障?curl -v能帮助观察哪些 DNS、连接、TLS 和 HTTP 细节?nc能否证明完整应用协议正常?为什么只能作为粗粒度验证工具?- 连接数很多但 QPS 不高时,可能是 Keep-Alive、慢请求还是连接泄漏?
- CLOSE_WAIT 很多时如何定位未关闭的连接、响应体或文件描述符?
- TIME_WAIT 很多时如何通过连接方向、端口范围和请求模式判断问题?
- 网络丢包、乱序和重传如何影响 TCP 延迟与吞吐?
- 子网、路由表和默认网关如何共同决定数据包路径?
- ARP 缓存错误可能造成什么局部网络故障?
- MTU 不匹配为什么可能导致小请求正常、大请求超时?
- TCP 半连接队列、全连接队列和应用 accept 速度之间有什么关系?
- 监听队列溢出会如何表现为连接超时或连接拒绝?
- 连接复用为什么通常比短连接更节省 CPU 和网络握手开销?
- 连接池最大连接数、空闲连接数和等待超时如何共同影响吞吐?
- 请求已经到达服务端但客户端超时后,服务端如何避免重复副作用?
- RPC 超时预算如何沿调用链传播?
- 级联重试会如何放大 CPU、连接、线程和队列压力?
- DNS 故障切换为什么可能受 TTL 和本地缓存影响而不立即生效?
- 代理层做 TLS 终止后,如何保留原始客户端地址和协议语义?
- 四层负载均衡为什么看不到完整 HTTP 路径?
- 七层负载均衡为什么能够按域名、路径和 Header 路由?
- 长连接和 WebSocket 在负载均衡摘流时需要额外处理什么?
- 抓包时如何判断请求没有发出、发出后被丢弃还是服务端没有响应?
- 网络设备丢包、服务端丢包和应用主动关闭如何在抓包中区分?
- Send-Q 持续增长时,应该检查对端读取、网络拥塞还是应用生产速度?
- Recv-Q 持续增长时,应该检查应用 accept/read 是否及时?
- 网络连接泄漏如何通过连接状态、线程栈和代码路径定位?
- 客户端连接池中的空闲连接为什么可能因为代理或防火墙超时而失效?
- 如何设计连接保活和空闲连接回收,避免使用已经失效的连接?
- DNS 解析结果缓存在哪里?应用、操作系统、递归 DNS 和 CDN 的缓存如何叠加?
- 反向代理如何实现限流、鉴权、灰度、请求体限制和访问日志?
- 代理层的超时、重试和连接池配置为什么必须与应用层协调?
- 负载均衡健康检查为什么可能把一个“能连通但不可用”的实例误判为健康?
- 如何设计包含依赖检查、业务探针和摘流延迟的健康检查?
- HTTP 压缩如何影响 CPU、带宽和响应延迟?
- 网络服务如何处理客户端取消请求和下游已经开始执行的情况?
- 取消传播为什么要同时终止计算、连接和后台任务?
- 多级代理链路中如何传递真实客户端地址、请求 ID 和追踪信息?
- 为什么日志和指标需要同时记录连接阶段耗时和业务处理耗时?
- 如何用请求级 trace 将 DNS、连接、TLS、代理和服务端处理耗时关联起来?
- 网络故障演练中为什么要验证恢复时间、重试放大和连接泄漏?
- 如何为网络协议升级设计客户端兼容、服务端灰度和快速回滚?
Bash
- Shell 在系统设计和线上排障中最适合承担什么角色?
- 为什么说 Shell 的核心价值是组合已有工具,而不是语法复杂度?
- 管道如何把多个命令组合成数据处理流水线?
- Shell 命令退出码如何影响自动化脚本的控制流?
sed如何用于流式替换、清洗和删除无关行?awk如何按字段切分日志并进行条件过滤、统计和计算?sort、uniq -c、head和tail如何组合统计日志热点?- 为什么管道处理大日志时通常比一次性加载到内存更稳妥?
tail -f、grep和sort | uniq -c如何组合观察实时错误?ss和netstat如何查看端口监听、连接状态和收发队列?lsof -i:port如何定位端口被哪个进程占用?ping和traceroute分别适合验证什么网络问题?ssh、scp和nc在远程排查和网络验证中分别有什么用途?- 为什么
dd和nc不能替代专业压测和基准工具? - Shell 环境变量的加载路径和继承关系为什么会影响服务运行?
- 一个可靠的 Shell 小工具应该如何处理参数、错误、输出和副作用?
- 什么情况下 Shell 脚本的复杂度已经超过了它适合处理的范围?
- Shell 中单引号、双引号和命令替换对变量展开有什么影响?
- Shell 函数、局部变量和返回码应该如何设计?
- 环境变量、导出变量和脚本局部变量的继承关系是什么?
- 定时任务、非交互 Shell 和登录 Shell 的环境差异可能来自哪里?
PATH、HOME、PWD和SHELL等环境变量如何影响脚本行为?- 相对路径、脚本所在目录和临时目录应该如何安全地处理?
- Shell 脚本如何接收必填参数、可选参数和默认值?
getopts适合解决什么命令行参数解析问题?trap可以用来实现哪些资源清理和故障记录动作?find -exec、xargs和 Shell 循环在批量文件处理上有什么差异?xargs处理空格、换行和特殊字符时有哪些边界?- 读取大文件时,为什么应优先使用流式处理而不是命令替换?
- 用
awk统计时,字段分隔符、引号和缺失字段会造成什么问题? uniq为什么通常需要先排序才能正确统计相邻重复项?- Shell 脚本调用远程主机时,如何处理超时、认证、输出和部分失败?
- 如何记录脚本版本、执行参数、操作人和结果,保证运维动作可审计?
- 如何判断一个 Shell 工具应该继续维护,还是迁移为 Python、Go 或专用平台任务?
- Shell 脚本如何避免通配符为空时误删当前目录或错误目标?
- 批量修改文件前为什么需要先输出待修改清单并支持 dry-run?
- 如何给 Shell 脚本增加锁,避免多个定时任务实例同时执行?
- 脚本执行外部命令时如何传递退出状态和错误上下文?
- 如何让脚本在网络抖动时区分可重试错误和不可重试错误?
- 如何对 SSH 批量操作设置并发上限和单机超时?
- 处理日志中的 JSON、CSV 和空格分隔字段时,为什么不能只依赖简单的
awk分隔符? - 如何在 Shell 中处理包含换行、引号和 Unicode 的文本?
- Shell 命令替换为什么可能丢失末尾换行并改变空值语义?
- 为什么
for x in $(command)不适合可靠遍历任意文件名? - 如何使用标准输入和
read流式处理大规模文本? - 如何让脚本的日志包含时间、主机、进程、步骤和返回状态?
- 运行系统变更脚本时,为什么需要检查当前状态而不是盲目重复执行?
- 如何设计一次数据库、缓存或网络配置变更脚本的前置检查和回滚动作?
- 为什么 Shell 自动化需要把不可逆操作与只读检查分开?
- 如何评估一条复杂管道的时间复杂度、内存使用和错误传播?
Python
- 为什么 Python 常用于自动化、数据处理、原型验证和跨语言编排?
- 为什么 Python 通常不被默认用于最苛刻的高性能核心路径?
- Python 的
list、dict、set和tuple分别适合什么场景? pathlib、os和shutil如何支持文件与目录自动化?json、csv和pickle分别适合什么数据编解码场景?subprocess如何与 Shell 或系统命令集成?logging和argparse如何让临时脚本演化成可复用工具?- 为什么即使是一次性脚本,也需要明确输入、输出、日志和异常处理?
- NumPy、Pandas、Requests、Click 和 Typer 分别解决哪类工程问题?
- Python 自动化相比完全依赖 Shell 的优势是什么?
- 什么情况下一个 Shell 任务应该切换为 Python 实现?
- GIL 到底限制了什么?
- 为什么 I/O 密集型任务仍然可以从 Python 多线程中受益?
- Python 多线程、多进程和异步模型分别适合什么类型的工作负载?
cProfile、pstats和火焰图分别能帮助定位什么问题?- 算法剪枝、矩阵运算、任务拆分、原生扩展和 GPU 下沉分别适合什么优化阶段?
- 为什么并发可能只是放大无意义计算,而不是解决性能问题?
- Python 和 C/C++ 混合编程常见于哪些场景?
- SWIG、ctypes 和 CFFI 等跨语言边界会带来哪些部署与依赖管理问题?
- Python 依赖打包和运行环境不一致会造成什么线上风险?
- Python 脚本从临时工具演化为长期工具时,应该补哪些工程能力?
- 为什么过早并发、单文件泥团和缺少依赖锁定会增加维护成本?
- 如何判断一个 Python 程序慢在算法、数据布局、解释器开销还是外部依赖?
- Python 自动化工具应该如何处理外部命令失败、超时和部分成功?
- 为什么“先理解算法流程,再谈并行”是 Python 优化的稳妥顺序?
- Python 的可变对象和不可变对象分别有哪些典型类型?
- 默认参数使用可变对象为什么容易产生跨调用状态污染?
- 浅拷贝和深拷贝在嵌套列表、字典和对象中的区别是什么?
- Python 的引用计数和循环垃圾回收分别解决什么问题?
- Python 对象的生命周期如何影响内存占用和资源释放?
- 生成器、迭代器和列表推导式在内存使用和执行时机上有什么区别?
- 为什么处理大文件时生成器通常比一次性读入列表更合适?
- 装饰器、上下文管理器和
with语句分别适合封装什么工程行为? - 如何使用上下文管理器保证文件、锁和数据库连接被正确释放?
- 异常层级、异常捕获范围和异常上下文应该如何设计?
- 为什么不应该用一个宽泛的
except Exception吞掉所有错误? - Python 的模块导入、包结构和循环依赖会带来哪些问题?
- 虚拟环境、依赖锁定和可重复安装为什么重要?
requirements.txt、pyproject.toml和锁文件分别承担什么职责?- Python 程序如何管理配置、密钥和不同环境的参数?
argparse如何支持子命令、默认值、类型检查和帮助信息?- Python 调用
subprocess时如何处理参数转义、输出、错误和超时? - 如何设计一个批量任务的重试、退避、断点和失败记录?
- Python HTTP 客户端应该如何设置连接、读取和总超时?
- 大型 JSON 处理为什么可能造成内存峰值?
- Python 流式解析、批量处理和分块写入如何控制内存?
- Pandas 在数据处理上方便,但为什么不应无条件加载全部数据到内存?
- NumPy 的向量化为什么通常比 Python 层循环更快?
- 多进程之间的数据传递为什么可能产生序列化和内存复制开销?
multiprocessing、线程池和进程池如何根据任务类型选择?- 异步 I/O 如何通过事件循环提高大量网络任务的并发效率?
- 异步代码中阻塞调用为什么会卡住整个事件循环?
- 生产者消费者队列如何限制 Python 任务的并发和内存?
- Python 程序如何区分 CPU、内存、磁盘、网络和外部服务瓶颈?
- 为什么微基准测试结果不能直接代表线上整体性能?
- Python 的对象分配、字符串拼接和临时列表会如何制造额外开销?
- Python 脚本出现内存上涨时,应该如何区分真实泄漏、缓存增长和延迟回收?
- Python 与 C/C++ 扩展的 ABI、平台和编译器差异会造成什么问题?
- 为什么网络、文件和子进程测试需要注入超时、错误和部分失败?
- Python 服务或脚本如何进行优雅退出和信号处理?
- 长时间运行的 Python 工具如何避免日志无限增长和临时文件泄漏?
- 可哈希对象、字典键和集合成员之间有什么关系?
- Python 的闭包如何捕获变量?循环中创建闭包时有哪些常见坑?
- 装饰器如何保留被装饰函数的名称、文档和签名信息?
- 为什么日志中应该记录异常类型、请求标识和关键参数,而不是只打印字符串?
- Python 线程安全问题如何通过锁、队列和不可变对象降低?
queue.Queue和直接共享列表在多线程通信上有什么差异?- 多进程间共享状态为什么需要进程安全的数据结构或 IPC?
- Python 的超时、取消和重试应该如何避免任务重复执行?
- 如何在 Python 中实现批量读取、批量写入和失败记录?
C++
- C++ 的显式对象生命周期和资源管理带来了哪些能力与风险?
- 栈对象和堆对象在生命周期、分配开销和空间限制上有什么区别?
new/delete和malloc/free的本质区别是什么?- 为什么 C++ 代码中不能混用
new/delete和malloc/free? - 移动语义解决了什么问题?
const、引用成员、explicit、=default和=delete分别可以表达什么约束?- C++ 多态、虚函数、虚表和动态绑定分别是什么?
- RTTI、虚函数和继承层次会带来哪些运行时和可维护性成本?
- 菱形继承和对象切片分别是什么问题?
vector、list和deque在内存布局、局部性和操作复杂度上有什么区别?map和unordered_map在排序、范围查询、平均复杂度、内存和最坏情况上有什么区别?set和unordered_set分别适合什么去重和成员判断场景?sort、lower_bound和accumulate分别适合什么算法表达?- 什么是 STL 容器的迭代器失效?
map、unordered_map和list删除元素时的失效规则有什么差异?- STL 容器为什么通常不默认提供线程安全?
- C 风格字符串和
std::string在长度管理、安全性和使用方式上有什么区别? extern "C"在跨语言接口中解决什么问题?- 跨语言字符串接口应该如何明确内存所有权和 ABI 边界?
- 网络协议解析中的字符串和缓冲区为什么必须明确消息边界与异常输入处理?
time、top、perf、gprof、valgrind和gdb分别适合定位什么问题?- 频繁动态分配、深拷贝、容器局部性差和粗粒度锁分别会造成什么性能问题?
- 悬垂指针、重复释放、越界、未初始化变量和对象切片分别如何导致不稳定?
- 析构顺序错误、链接符号缺失、ABI 不兼容和运行时库不一致分别如何排查?
undefined symbol、pkg-config、find_package和ldd在构建排障中分别有什么作用?- 为什么智能指针、明确所有权、少用裸指针和谨慎继承能降低 C++ 工程风险?
unique_ptr、shared_ptr和weak_ptr分别表达什么所有权关系?shared_ptr的引用计数会带来哪些额外成本?- 为什么不应该为了方便把所有对象都改成
shared_ptr? - 移动后对象应该满足什么可用但未指定状态?
- Rule of Three、Rule of Five 和 Rule of Zero 分别解决什么资源管理问题?
- 拷贝构造、移动构造、拷贝赋值和移动赋值的调用时机有什么区别?
- 异常安全的基本保证、强保证和不抛出保证分别是什么?
- RAII 如何帮助 C++ 代码在异常路径上释放锁、文件和内存?
- 构造函数抛出异常时,已经构造的成员和基类会如何析构?
noexcept如何影响移动操作、容器扩容和异常传播?reserve、resize和shrink_to_fit分别改变什么?vector连续内存为什么通常有更好的 CPU Cache 局部性?unordered_map的桶、哈希冲突和 rehash 分别如何影响查询?lower_bound、upper_bound和二分查找分别适合什么排序数据?- C++ 标准库容器在多读一写、多写和并行遍历时需要什么外部同步?
std::stringstream、格式化库和手工拼接在性能和可读性上有什么区别?- UTF-8、字符数量和字节数量在协议与日志处理中为什么不能混用?
- C++ ABI 不兼容通常由哪些编译器、标准库和编译选项差异造成?
- 静态链接、动态链接和运行时库版本之间有什么部署取舍?
ldd输出中缺少动态库或加载到错误版本时如何排查?- 为什么全局变量、静态初始化顺序和析构顺序会造成启动或退出问题?
- 虚函数调用在热路径中可能带来哪些间接调用和分支预测成本?
- RTTI 和异常机制在性能敏感路径中为什么需要谨慎使用?
- 对象切片为什么会丢失派生类状态和多态行为?
- 多重继承、虚继承和组合分别适合什么设计场景?
- 锁粒度、读写锁、无锁结构和线程本地存储如何影响 C++ 并发性能?
- 原子操作的内存序为什么会影响可见性和重排?
- 什么是数据竞争?为什么未定义行为比简单的错误返回更危险?
- C++ 中条件变量为什么需要在循环里重新检查条件?
- 线程池、对象池和连接池分别解决什么问题?
- 频繁分配释放如何造成碎片、锁竞争和尾延迟?
- 内存池和分配器优化什么时候值得引入?
perf如何定位 CPU 热点、锁竞争和上下文切换?valgrind、AddressSanitizer、ThreadSanitizer 和 UndefinedBehaviorSanitizer 分别适合什么问题?- core dump、调试符号和可复现构建为什么对线上崩溃定位重要?
gdb中如何结合线程栈、变量和寄存器判断崩溃原因?- 为什么优化编译、调试编译和链接时优化会影响问题复现?
- C++ 性能优化为什么应同时观察 CPU、内存带宽、Cache Miss 和系统调用?
- 如何判断一个性能问题应该通过算法、数据结构、内存布局还是并发模型解决?
- 如何建立 C++ 模块的所有权、生命周期、异常、构建和运行时边界?
std::move做了什么?为什么它本身不一定真的移动资源?- 右值引用、左值引用和完美转发分别适合什么场景?
std::forward为什么能保留参数的值类别?- 临时对象生命周期延长有哪些规则和陷阱?
- 返回局部对象的引用或指针为什么会产生悬垂引用?
const成员函数、可变成员和线程安全之间有什么关系?- 虚函数调用为什么要求对象的动态类型有效?
- 构造函数和析构函数中调用虚函数为什么可能得不到派生类行为?
std::span或视图类型如何表达不拥有内存的缓冲区?- 不拥有内存的指针、引用和视图如何避免超过被引用对象生命周期?
- 对齐、填充和结构体字段顺序如何影响内存占用?
- false sharing 是什么?它为什么会影响多线程计数器性能?
- Cache line 局部性如何影响
vector、链表和哈希表的实际性能? - 分支预测、虚函数间接调用和随机内存访问为什么会造成性能差异?
Go
- Go 相比 C++ 和 Python,在性能控制、开发复杂度、并发表达和交付方式上做了什么取舍?
- 数组、切片、
map、struct和interface分别表达什么语义? - Go 的
map为什么不能直接安全地并发读写? defer适合承担哪些资源释放职责?它在热路径中有什么成本?- Go 的显式错误返回值如何影响函数设计和失败路径?
panic和普通业务错误分别适合表达什么情况?recover在服务端入口层通常承担什么角色?- G、P、M 调度模型分别代表什么?
- 无缓冲 Channel 和有缓冲 Channel 分别表达什么同步和队列语义?
- 关闭 Channel 后继续读取、读取空 Channel 和向已关闭 Channel 写入分别会怎样?
- 为什么错误的 Channel 设计容易造成 Goroutine 泄漏和死锁?
- 生产者消费者、fan-out/fan-in、worker pool 和批处理分别如何用 Go 表达?
- 为什么 Go 强调小接口和面向消费方定义?
- 为什么过大或过早抽象的接口会降低可维护性?
- 为什么预期内业务失败不应该统一使用
panic? net、net/http、context、sync和runtime分别为网络服务提供什么能力?sync.Mutex、sync.RWMutex、sync.WaitGroup、sync.Once和原子操作分别适合什么场景?- Ticker、Timer、文件、连接和响应体不释放会带来什么资源风险?
- 如何使用 profile 判断 Go 服务慢在分配、对象存活、锁竞争还是并发模型?
- 如何设计一个具备超时、取消、连接复用和优雅退出能力的 Go 网络服务?
make和new分别适合初始化哪些类型?- 指针接收者和值接收者对方法集和接口实现有什么影响?
- 类型断言和类型 switch 分别适合什么运行时类型判断?
- 空接口和泛型分别解决什么抽象问题?
defer的执行顺序、参数求值和闭包捕获有哪些坑?panic在 Goroutine 内发生时为什么不能总被其他 Goroutine 的recover捕获?- 为什么错误信息应该携带操作上下文但避免泄露敏感数据?
- Context 的 deadline、取消信号和 request-scoped value 分别适合什么用途?
- 为什么不应该把 Context 当作普通配置容器?
- Goroutine 泄漏通常由哪些 Channel、Context、Timer 和等待逻辑造成?
- 如何通过 pprof、runtime 指标和 Goroutine dump 定位泄漏?
- GOMAXPROCS 如何影响 CPU 并行和服务吞吐?
- 过多 Goroutine 为什么可能造成调度、内存和下游连接压力?
- 无缓冲 Channel 的发送和接收为什么必须同时就绪?
- 有缓冲 Channel 的容量应该如何根据生产速率、消费速率和内存预算设置?
- 关闭 Channel 和发送结束信号分别适合哪些所有权关系?
- 多个生产者如何安全地协作关闭一个 Channel?
select的随机选择、公平性和 default 分支会带来什么行为?select中的超时分支如何避免 Goroutine 无限等待?- Worker Pool 如何限制并发、传播错误和等待所有任务结束?
- Fan-out/fan-in 如何处理结果顺序、部分失败和取消?
- Go 的 errgroup 适合解决哪些并发任务生命周期问题?
- 为什么并发任务需要明确谁负责取消、关闭和回收?
sync.Mutex和sync.RWMutex如何根据读写比例选择?sync.Once适合初始化什么资源?初始化失败时如何处理?sync.WaitGroup为什么不应该复制或在任务开始后随意修改计数?- 原子操作适合计数和状态交换,但为什么不能替代多字段事务更新?
- Go map 的并发读写应该如何通过锁、单线程拥有者或并发 Map 结构治理?
- 数据竞争检测工具如何帮助发现只在高并发下出现的问题?
sync.Pool的对象为什么可能被运行时随时回收?- Go HTTP Server 的连接、请求、Handler 和 Context 生命周期分别是什么?
- HTTP 客户端 Transport 如何影响连接池、Keep-Alive 和 DNS?
- 为什么每次创建一个默认 HTTP Client 可能导致连接复用和资源治理问题?
- 如何为 Go HTTP 客户端配置连接超时、TLS 握手超时、响应头超时和空闲连接超时?
- 为什么服务端必须设置请求体大小、Header 超时和空闲连接超时?
- 如何通过 context deadline 将一次请求的时间预算传递给下游?
- Go 服务收到 SIGTERM 后应该如何停止接收新请求并等待存量请求完成?
- 如何在服务退出时关闭 Listener、数据库连接、消息消费者和后台 Goroutine?
- Ticker 和 Timer 不停止会造成哪些资源和逻辑问题?
string与[]byte转换为什么可能产生复制和 GC 压力?- 切片复用底层数组时如何避免意外保留大数组?
- 切片扩容、预分配和批量追加如何影响内存分配次数?
- Go GC 的目标与延迟、吞吐和内存占用之间有什么取舍?
- 如何通过 pprof 的 heap、allocs、goroutine、mutex 和 block profile 定位问题?
- Go 服务出现 P99 延迟升高时,应该如何区分 GC、锁、调度、网络和下游依赖?
- cgo 为什么可能阻塞调度、增加线程数量并影响部署复杂度?
- Go 单二进制部署仍然需要关注证书、时区、动态库和 CPU 架构吗?
- Go 模块、版本选择和 vendor 如何保证依赖可复现?
- 如何设计 Go 包的边界,避免循环依赖和过大的公共接口?
- 为什么小接口、组合和依赖注入有利于 Go 服务测试?
- 如何测试 Go 并发代码中的超时、取消、竞态和部分失败?
- 如何设计 Go 消费者的重试、幂等、优雅退出和积压治理?
- Go 的值传递语义与引用类型的共享底层数据之间有什么关系?
append返回新切片为什么必须接收返回值?- 切片截取后为什么可能意外保留整个大数组?
- Go 的包初始化顺序如何影响全局变量和依赖关系?
- Context 取消后,下游 HTTP、数据库和 Goroutine 如何及时停止?
- Channel 缓冲区大小如何根据峰值、突发和处理速率估算?
- Channel 消费者退出但生产者继续发送时,如何避免发送方永久阻塞?
- 多路 Channel 合并时如何保证取消、错误和关闭语义一致?
- 什么时候使用 Channel,什么时候使用 Mutex、原子操作或直接函数调用?
- Go 的逃逸分析如何影响栈分配、堆分配和 GC 压力?
[]byte、string和bytes.Buffer在网络编解码中的取舍是什么?- Go 的 JSON 编解码为什么可能成为 CPU 和内存热点?
- HTTP Handler 中启动后台 Goroutine 时,如何保证请求取消后不会遗留任务?
- Go 数据库连接池中的最大连接、空闲连接和连接生命周期如何设置?
- 数据库连接池耗尽时,如何区分 SQL 慢、事务未提交和连接泄漏?
- Go 消息消费者如何处理批量拉取、手动确认、重试和死信?
- 消费者优雅退出时,如何停止拉取、完成安全任务并提交已处理进度?
- Go 服务如何通过限流、超时和并发信号量保护下游依赖?
- 高基数指标标签为什么可能造成监控系统和服务自身的额外压力?
- pprof 暴露接口为什么需要权限和网络隔离?
- 交叉编译时,CPU 架构、cgo、系统调用和动态库会带来哪些问题?
- Go 模块升级为什么需要关注间接依赖、语义版本和安全公告?
- 为什么并发测试需要控制时间、随机性和调度顺序,避免偶发失败?
- 如何设计 Go 服务的容量测试,分别观察 CPU、GC、连接、锁和下游压力?
- 如何让 Go 服务在依赖不可用时快速失败、有限重试并提供降级结果?
- 如何区分 Go 服务中的业务错误、客户端错误、依赖错误和程序异常?
- Go 的并发控制如何与 Kubernetes 的副本扩展和连接池容量共同规划?
- 多个 Go 实例同时处理同一任务时,如何通过租约、幂等和分片避免重复副作用?
- Go 网络服务的 P99 延迟如何拆分为排队、调度、GC、网络和下游等待?