常见技术问题
OSGi是什么?
Kafka和RocketMQ的区别
- Kafka速度快,功能少,定时队列要自己实现。
GET和POST的区别
- 语义上的区别,GET是获取资源,POST是提交资源。
- GET请求的参数在URL中,POST请求的参数在请求体中。
- POST响应无法被缓存,GET响应可以被缓存。
如何保证消息的顺序
把需要保证顺序的消息放到同一个Q里。
消息队列的作用
- 解耦
- 异步
- 削峰
- 多系统通信
静态类型和动态类型的区别
- 静态类型:变量创建好后,类型固定,不可更改。
- 动态类型:变量类型可以随时更改。
静态类型语言:Java
、C#
、C++
、Go
、Rust
、Kotlin
、TypeScript
、C
动态类型语言:Python
、JavaScript
、Shell
强类型和弱类型的区别
- 强类型:不会自动转换类型,直接报错。
- 弱类型:会尝试自动转换类型。
强类型语言:C#
、Java
、Go
、Rust
、Kotlin
、Python
弱类型语言:JavaScript
、Shell
MySQL查询慢
优化器选错索引
用explain
查看执行计划,看是否选错了索引。
连接数过小
最大连接数默认是100,最大是16384。
使用如下命令修改最大连接数:
set global max_connections = 500;
应用侧连接数过小,扩大连接池。
Buffer Pool过小
Buffer Pool用于缓存查询结果,如果过小,会导致频繁读磁盘。
使用如下命令修改Buffer Pool大小:
set global innodb_buffer_pool_size = 536870912;
查看Buffer Pool缓存命中率:
show status like 'Innodb_buffer_pool_%';
Innodb_buffer_pool_read_requests: 读取请求次数, Innodb_buffer_pool_reads: 从磁盘读取次数。
命中率:
\text{hit rate} = \frac{\text{Innodb_buffer_pool_reads}}{\text{Innodb_buffer_pool_read_requests}} \times 100\%一般在99%以上,低于99%需要调整Buffer Pool大小。
短轮询和WebSocket的区别
短轮询(Short Polling)
- 工作原理:客户端定时向服务器发送请求,询问是否有新的数据,服务器响应后返回最新的数据。
- 优点:简单易实现,支持跨浏览器,适用于低迟要求不高的场景。
- 缺点:会造成频繁的网络请求和服务器压力,无论有无新数据都会发起请求。
- 适用场景:对实时性要求不高,数据更新频率较低的场景,例如一些简单的数据展示页面。
WebSocket
- 工作原理:WebSocket是一种全双工通信协议,通过建立持久连接,双方可以实时进行数据传输。
- 优点:实时性更好,支持服务器主动推送数据,减少了不必要的请求开销。
- 缺点:相对短轮询更复杂,对服务器和客户端都有一定的要求,可能受到网络限制。
- 适用场景:对实时性要求较高,需要频繁传输大量数据的场景,例如在线聊天、实时数据更新等。
消息队列中消费者、分区、消费者组的关系
- 消费者:消费消息的客户端。
- 分区:即队列。
- 消费者组:多个消费者组成一个消费者组。可以做冗余备份、负载均衡,也可以让一条消息被多个消费者组消费,以完成多个业务。
用Docker部署MySQL有什么问题吗?
没有。支持应用隔离,并且支持资源限制,方便迁移与管理。
注意:MySQL的扩缩容应该采用官方提供的读写分离或集群方案。数据库不经常动态扩缩容不代表使用Docker有什么问题。
数据库中last_updated字段的作用
- 数据同步和一致性:可以根据last_updated字段判断哪些数据是最新的,同步数据时只同步最新的数据。
- 审计和追踪:可以根据last_updated字段查看数据的更新时间。
- 并发控制(乐观锁):在更新数据时,检查last_updated字段是否和更新前一致,不一致则更新失败。
- 数据备份和恢复:可以根据last_updated字段判断哪些数据是最新的,哪些数据需要恢复。
- 提高性能:可以根据last_updated字段排除一些不需要查询的数据(冷数据)。
为什么不直接用Elasticsearch存储数据
- Elasticsearch是搜索引擎,不是数据库,不支持事务和ACID。
- 非关系型表达,大量的反范式存储,导致维护基础数据困难(新增异常、修改异常、删除异常)。
1,1,母婴用品,1,强生,...
2,1,母婴用品,2,若思,...
3,2,儿童玩具,2,若思,...
- Elasticsearch的存储基于倒排索引,大行超多字段性能不好。
前端
Vue的ref和reactive的区别
- 如果只是修改对象的属性,不会触发视图更新,可以用reactive。
- 如果修改变量对对象的引用,要用ref。
Options API 和 Composition API的区别
- Options API限制了可重构性,对类型推倒不友好,属性来源不明确(逻辑抽取复用mixin)。
注意:Vue2和Vue3和API类型无关,Vue2.7也可以使用Composition API。
如何控制资源加载优先级
- prefetch:预加载,会在浏览器空闲时加载。
- preload:强制加载,会在文档解析时加载。
- async属性:异步加载,会在文档解析时加载。
- defer属性:延迟加载,会在文档解析完成后加载。
- importance属性:资源重要性,可以设置为
high
、low
、auto
。
Spring如何解决循环依赖
关键:一定要有一个缓存来保存一个Bean的早期对象作为死循环的终止条件,可以是代理对象。
- 多例Bean:每次使用时创建新的Bean,不使用缓存,不能解决循环依赖。
大型分布式项目难点在哪
如何解决网络的不可靠性,如何保证数据的一致性,如何保证服务的高可用。
分布式架构相比单体架构,就是把进程内的调用变成了跨进程的调用(RPC)。
拆成了多个服务,如何知道服务的地址(服务发现)。
每个服务为了保证高可用,都要有多个副本(负载均衡)。
限流/熔断/降级(服务治理)。