Skip to main content

综合21-40

41.RabbitMQ 中无法路由的消息会去到哪里?

展开
  • 默认行为是将消息直接丢弃
  • 可以指定主交换机的备用交换机,然后消息会转发到备用交换机
  • 可以配置将消息返回给生产者,生产者需要监听basic.return 事件

42.MySQL 三层 B+ 树能存多少数据?

展开
  • 计算方法为:根节点存储行数*第二层节点存储行数*叶子节点存储行数
  • 根节点和第二层节点存储行数:假设一页16KB,一个keyj加上指针占十几B,大概1000行
  • 叶子节点要看是二级索引还是主键索引,主键索引大概16行,大概2000w数据,二级索引大概能存16亿数据

43.Kafka为什么要抛弃 Zookeeper?

展开

todo:在 Kafka 旧架构,Zookeeper负责存储集群元数据,控制选举,配置管理和集群成员管理。

44.详细描述一条 SQL 语句在 MySQL 中的执行过程。

展开
  • 连接器,客户端和服务端建立连接,客户端向服务端发送请求
  • 查询缓存,8.0已移除
  • 分析器,进行词法和语法的分析
  • 优化器,决定使用哪个索引,调整sql执行顺序
  • 执行器,据优化器的计划,调用存储引擎接口执行查询。

45.Kafka 中 Zookeeper 的作用?

展开

todo

  • 一个分布式协调服务,负责管理 Kafka 集群的元数据和协调分布式操作。
  • 存储和管理元数据(主题、Broker、消费者组)。
  • 协调控制器选举(确保单一控制器)。
  • 管理集群成员(跟踪 Broker 状态)。
  • 维护分区和副本状态(支持 Leader 选举和分配)。
  • 存储动态配置(主题和 Broker 参数)。

46.MySQL 是如何实现事务的?

展开
  • 通过锁,日志和MVCC实现的
  • undo log保证了事务的原子性
  • redo log保证了事务的持久性
  • 锁和MVCC实现了四种隔离级别,保证了事务的一致性和隔离性

47.为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?

展开

Java 8 移除永久代(PermGen)并引入元空间(Metaspace),是为了解决永久代内存大小难以配置、容易造成 OutOfMemoryError: PermGen 的问题,并将类元信息存储从堆内存转移到本地内存(Native Memory)中,以提高可扩展性和稳定性,更符合jvm的规范。

48.说一下 Kafka 中关于事务消息的实现?

展开

todo

49.MySQL 事务的二阶段提交是什么?

展开

MySQL 的事务二阶段提交是协调 InnoDB 的 redo log 与 binlog 的一致性机制,因为redo log 与 binlog 的内容差异很大,无法交叉补全,通过 prepare & commit 两步, 能够在任意的崩溃时机,去回滚或者提交redo log的prepare状态,确保事务的原子性和崩溃恢复安全,是 MySQL 内核实现事务可靠性的核心手段之一。

50.说一下 RocketMQ 中关于事务消息的实现?

展开

todo

51.MySQL中长事务可能会导致哪些问题?

展开
  • 长事务的事务id一般是比较老的,会导致uodo log不被清理,占用磁盘空间,回滚时间过长。并且当长事务查询其他事务修改的行,该行可能被多次修改,需要遍历很长的回滚段,MVCC 性能下降
  • 行锁持有时间过长,导致并发度下降,死锁风险

52.RocketMQ 的事务消息有什么缺点?你还了解过别的事务消息实现吗?

展开

todo

53.MySQL 中的 MVCC 是什么?

展开

多版本并发控制,通过uodo log获取版本链,通过read view(读视图),记录当前事务的事务id等信息,查询的时候根据read view和行记录里的隐藏字段去版本链中对应的版本,实现了无锁的视图一致,解决了对等值查询的并发读。

54.为什么需要消息队列?

展开
  • 为分布式环境中各服务的通信提供了中间件
  • 可以持久化消息,提供了可靠性保证
  • 可以异步的消费消息,提供响应速度
  • 削峰填谷,缓冲突发流量
  • 系统解耦,消费者单独处理消息,不影响主业务

55. MySQL 中的事务隔离级别有哪些?

展开
  • 读未提交
  • 读已提交
  • 可重复读
  • 可串行化

56.说一下消息队列的模型有哪些?

展开
  • 队列模型,点对点的消息传递,只有单一消费者,适用于异步队列处理,任务调度
  • 发布订阅模型,多消费者,动态订阅,适用于事件广播,比如rabbit mq中的Fanout Exchange
  • 路由模型,消费者根据不同的key订阅同一个topic的不同消息,比如rabbit mq中的Topic Exchange
  • 请求-回复模型,类似远程调用,有消息回复

57.MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

展开
  • 可重复读
  • 这个级别解决了幻读,不可重复度,脏读的问题,就是说这个级别不会读到其他事务未提交数据,并且通过MVCC保证了单行读的一致性,通过next-key lock保证了范围读的一致性

58.谈谈你了解的最常见的几种设计模式,说说他们的应用场景

展开
  • 单例模式,用于需要全局共享对象或者资源的场景,比如说某些中间件的客户端对象,线程池,数据库连接处等对象的创建。
  • 工厂模式,提供一个创建对象的接口,由子类决定实例化哪一个类,当业务中需要根据不同条件生成不同实例时,但这些实例都有同样接口的时候。Spring的BeanFactory
  • 观察者模式,相当于回调,钩子函数,当一个对象状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。比如需要异步的接收任务处理结果。
  • 装饰器模式,可以在不修改原有对象的基础上,增强原对象,动态地为其添加新功能。一般是将装饰器作为新类型的一个属性。
  • 策略模式,定义一系列算法,把它们封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户端而变化。比如说不同的支付方式,优惠策略
  • 代理模式,通过代理对象控制对原始对象的访问。比如Spring AOP 。

59.MySQL 中有哪些锁类型?

展开
  • 行锁
  • 表锁
  • 间隙锁
  • 意向锁
  • 元数据锁

60.什么是策略模式?一般用在什么场景?

展开
  • 策略模式是一种行为模式,它定义了一系列算法,并将它们封装在独立的类中,通过上下文类管理并且给客户端调用。
  • 策略模式的组成是策略接口,具体策略和上下文。
  • 策略模式适用于需要解耦相似的算法,需要客户端动态调用算法的场景。