服务端2月21日 20:38
Promise.any() 有什么作用?和 Promise.race 有什么区别?`Promise.any()` 的作用是:一组 Promise 里只要有一个成功,就立刻返回这个成功结果;只有全部失败时,才会 reject,并抛出 `AggregateError`。它适合“多个候选源,谁先成功用谁”的场景,比如多 CDN 拉资源、多个镜像接口兜底。面试里要强调:它忽略失败,只关心第一个成功;这和 `Promise.race()` 谁先 settled 就返回完全不同。
## 追问
### Promise.any 和 Promise.race 最大区别是什么?
`race` 看第一个完成,不管成功还是失败;`any` 看第一个成功,失败会被暂时忽略,除非全部失败。
...服务端2月21日 20:51
RPC 和 RESTful API 有什么区别?什么时候选 RPC?RPC 和 RESTful API 的核心区别是抽象不同:RPC 像调用远程函数,关注方法、参数和返回值;REST 更像操作资源,关注 URL、HTTP 方法和状态码。内部微服务、低延迟、高吞吐、强类型契约、双向流式通信,通常选 RPC,比如 gRPC、Dubbo。对外开放接口、浏览器直接访问、需要易调试和缓存语义,REST 更合适。面试里不要说谁替代谁,关键是边界:内部效率优先选 RPC,对外通用性优先选 REST。
## 追问
### RPC 为什么通常性能更好?
很多 RPC 框架使用二进制序列化和长连接,协议开销更小,也更容易做连接复用、流式传输和代码生成。
### REST...服务端2月21日 20:52
RPC 常见序列化协议有哪些?各自怎么选?RPC 常见序列化协议有 Protobuf、Thrift、JSON、Hessian、MessagePack 和 Avro。面试先给结论:内部高性能微服务优先 Protobuf 或 Thrift;需要可读、易调试、对外兼容用 JSON;Java 旧系统可能见到 Hessian;需要类 JSON 但更小的体积可考虑 MessagePack;大数据和日志链路常用 Avro。选择时看四件事:体积、速度、跨语言、schema 演进能力。
## 追问
### Protobuf 为什么常用于 RPC?
它是二进制格式,体积小、解析快,靠 .proto 定义字段和类型,跨语言代码生成成熟。缺点是调试不...服务端2月21日 20:53
如何优化 RPC 调用性能并降低网络延迟?优化 RPC 性能先看调用链路:连接、序列化、网络传输、线程模型、服务端处理和观测。面试可以先答:复用长连接,开启连接池和预热;选 Protobuf、Thrift 这类二进制协议,减少字段和大对象;小包低延迟场景开启 TCP_NODELAY;用异步调用、批量请求、就近路由和客户端缓存降低等待时间。最后用 P95/P99、错误率、QPS、线程池队列和链路追踪定位瓶颈,不要只凭感觉调参数。
## 追问
### TCP_NODELAY 一定要开吗?
不一定。它能减少小包等待,但可能增加包数量。低延迟 RPC 常开,吞吐优先的批量传输要压测后决定。
### 序列化为什么影响延迟?
序列化影响...服务端2月21日 21:02
RPC 负载均衡算法有哪些?如何选择合适策略?RPC 负载均衡常见算法有随机、轮询、加权随机/轮询、最少连接、最少活跃、最短响应时间、一致性哈希和 IP Hash。面试里先说选择原则:实例差不多用随机或轮询;机器配置不同用加权;请求耗时差异大用最少连接/最少活跃;需要会话保持或本地缓存命中用一致性哈希。真正落地还要配健康检查、熔断、权重动态调整,否则算法再好也会把流量打到故障节点。
## 追问
### 随机和轮询有什么区别?
随机实现最简单,长期看分布均匀;轮询更可预测,但如果某台机器变慢,仍会按顺序分流。两者都适合实例能力接近的场景。
### 为什么 Dubbo 默认常用加权随机?
它简单、开销低,配合权重能表达机器能力差异。...服务端2月21日 21:03
什么是分布式链路追踪?OpenTelemetry、Jaeger 和 SkyWalking 怎么选?分布式链路追踪就是给一次请求打上 Trace ID,把它经过的网关、服务、数据库、消息队列调用都串起来。面试里先答核心:Trace 表示一次完整请求,Span 表示其中一次操作,Span 之间用 parentId 形成调用树;上下文通常通过 HTTP Header、RPC Metadata 传播;数据由 SDK 或 Agent 采集,再异步上报到 Jaeger、SkyWalking、Zipkin 等后端。现在更推荐用 OpenTelemetry 做统一采集标准,后端再按团队习惯选择 Jaeger、SkyWalking 或商业 APM。
## 追问
### Trace、Span、Tra...前端2月21日 21:07
MobX 中 observable 怎么用?有哪些注意事项?MobX 的 observable 用来把普通状态变成“可被追踪的状态”。组件、computed、autorun 或 reaction 读取它时,MobX 会记录依赖;之后状态变化,相关派生值和视图就会自动更新。现在项目里更常用 `makeAutoObservable` 或 `makeObservable`,装饰器写法能见到,但要看团队 Babel/TypeScript 配置。注意:修改状态最好放在 action 里,大对象可用 shallow 降低追踪成本。
## 追问
### makeAutoObservable 和 makeObservable 有什么区别?
`makeAuto...前端2月21日 21:09
MobX 中 computed 有什么作用?和 reaction 怎么选?MobX 的 computed 用来声明“由 observable 推导出来的值”,比如过滤后的列表、总价、表单是否有效。它的关键点是自动追踪依赖、懒计算、缓存结果:没人读取时不算,依赖没变时重复读取也不重算。面试回答要强调:computed 应该像纯函数,只负责返回值,不要发请求、写日志或修改状态;这些副作用应该交给 reaction。
## 追问
### computed 为什么能提升性能?
因为它会缓存上一次计算结果。只有依赖的 observable 变化,并且 computed 再次被读取时,MobX 才会重新计算;复杂过滤、排序、聚合都适合放进去。
### compute...前端2月21日 21:10
MobX 中 autorun、reaction 和 when 有什么区别?MobX 里的 reaction 用来处理副作用:状态变了以后,去做日志、请求、持久化、路由跳转这类“不产生派生值”的事。常见有三种:`autorun` 会立即执行并自动追踪用到的 observable;`reaction` 把“追踪什么”和“执行什么”分开,更适合精确控制触发条件;`when` 只在条件第一次满足时执行一次,然后自动清理。面试里要先说清:派生数据用 computed,副作用才用 reaction。
## 追问
### autorun 和 reaction 有什么区别?
`autorun` 会立即跑一次,函数里读到什么 observable 就追踪什么。`reacti...服务端2月21日 21:13
React 中如何正确使用 MobX 和 observer?在 React 中用 MobX,核心是让读取 observable 的组件被 `observer` 包住。store 可以通过 Context、props 或模块变量传入;实际项目更推荐 Context,测试和多实例更好控。`observer` 会追踪组件渲染时真正读到的 observable,相关字段变化才重渲染,所以不要在外层提前把 observable 解成普通值再传下去。函数组件优先用 `mobx-react-lite`,类组件或旧项目才考虑 `mobx-react`。
## 追问
### observer 应该包父组件还是子组件?
谁读取 observable 就包谁。把整个...