跳到主要内容

常见技术问题

OSGi是什么?

Kafka和RocketMQ的区别

  • Kafka速度快,功能少,定时队列要自己实现。

GET和POST的区别

  • 语义上的区别,GET是获取资源,POST是提交资源。
  • GET请求的参数在URL中,POST请求的参数在请求体中。
  • POST响应无法被缓存,GET响应可以被缓存。

如何保证消息的顺序

把需要保证顺序的消息放到同一个Q里。

消息队列的作用

  • 解耦
  • 异步
  • 削峰
  • 多系统通信

静态类型和动态类型的区别

  • 静态类型:变量创建好后,类型固定,不可更改。
  • 动态类型:变量类型可以随时更改。

静态类型语言:JavaC#C++GoRustKotlinTypeScriptC

动态类型语言:PythonJavaScriptShell

强类型和弱类型的区别

  • 强类型:不会自动转换类型,直接报错。
  • 弱类型:会尝试自动转换类型。

强类型语言:C#JavaGoRustKotlinPython

弱类型语言:JavaScriptShell

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属性:资源重要性,可以设置为highlowauto

Spring如何解决循环依赖

关键:一定要有一个缓存来保存一个Bean的早期对象作为死循环的终止条件,可以是代理对象。

  • 多例Bean:每次使用时创建新的Bean,不使用缓存,不能解决循环依赖。

大型分布式项目难点在哪

如何解决网络的不可靠性,如何保证数据的一致性,如何保证服务的高可用。

分布式架构相比单体架构,就是把进程内的调用变成了跨进程的调用(RPC)。

拆成了多个服务,如何知道服务的地址(服务发现)。

每个服务为了保证高可用,都要有多个副本(负载均衡)。

限流/熔断/降级(服务治理)。