每天一套面试题Day19-阿里巴巴高频(3)
13.消息队列如何保证消息不丢?
14.消息队列如何保证不重复消费
幂等性是一个数学概念,在消息队列中的意思是: 无论同一条消息被消费多少次,产生的结果都和消费一次是一样的。
消息队列通过以下机制避免重复消费:1. 生产者端添加唯一消息ID实现发送幂等性;2. 消息队列服务端支持Exactly-Once语义(如Kafka事务消息);3. 消费者端采用去重机制(如数据库唯一索引、Redis原子操作记录已消费ID);4. 业务逻辑设计幂等处理(如状态检查、乐观锁);5. 正确维护消费位移,确保异常后能从正确位置恢复。
15.什么是进程和线程?进程和线程的区别?
进程是操作系统中资源分配的基本单位,线程是进程中执行的基本单位,进程拥有独立的内存空间,而线程共享进程的内存空间和资源。 内存空间 进程:拥有独立的内存空间。 线程:共享进程的内存空间。
资源开销 进程:创建和切换开销大。 线程:创建和切换开销小。
通信方式 进程:通过进程间通信(IPC)进行数据交换,如管道、消息队列、共享内存。 线程:通过共享内存直接通信,速度快但需注意同步。
并发性 进程:适合多任务并发,进程间隔离性好。 线程:适合多线程并发,资源共享效率高。
16.建索引时需注意哪些事项?
建索引时需注意以下事项:首先,选择合适的列进行索引,优先考虑经常用于查询条件、排序和连接的列;其次,避免在频繁更新的列上建立索引,以减少维护开销;此外,控制索引的数量,过多的索引会影响写入性能;同时,注意索引的选择性,选择性高的索引能更有效地过滤数据;最后,定期分析和优化索引,以适应数据和查询模式的变化
17.SQL 调优常见方法有哪些?
我的博客详解 先监控发现慢SQL,然后通过EXPLAIN分析执行计划,接着从索引和SQL语句本身这两个成本最低的方面入手进行优化。如果这些手段都达到了瓶颈,最后才会考虑读写分离、分库分表等架构层面的方案。
18.大表(千万级)查询 / 维护该怎么办?
千万级”是一个量级描述,通常指的是数据库表中数据行的数量。 千万级: 具体指 10,000,000 行级别的数据。
诊断与监控: 使用 EXPLAIN 分析慢查询SQL,使用数据库监控工具(如Prometheus, PMM)定位瓶颈。
基础优化:
优化SQL和索引: 这是投入产出比最高的步骤。
架构优化:
数据归档: 将数据库中不常使用但又有保留价值的历史数据,从主业务表中移动到专门的归档表或存储中,以保持主业务表的高效运行。
使用分区表: 如果数据有明显的范围特性(如时间),分区是很好的选择。
引入读写分离: 缓解主库压力。
终极方案:
分库分表: 当以上所有手段都无法满足性能要求时,再考虑这个最复杂但扩展性最强的方案。
19.深度分页、读写分离、分库分表后 SQL 该如何优化?
- 深度分页:核心问题是
OFFSET效率低。首选方案是游标分页(基于ID或时间戳),其次是子查询优化,最后是业务上的限制。 - 读写分离:核心问题是主从延迟。对于一致性要求高的场景,采用强制读主库的方案,并可以通过AOP注解实现。同时,业务设计上也可以做最终一致性的妥协。
- 分库分表:这是架构上的重大变化,SQL优化思路完全不同。核心是一切围绕分片键进行。
- 首先要保证有全局ID。
- 其次,所有查询尽量带上分片键,避免跨库查询。
- 对于JOIN,采用业务层组装或字段冗余。
- 对于聚合和复杂查询,交给异构索引库(如ES) 或 OLAP系统 来处理。
记录刷过的面试真题
查看16道真题和解析