kafka为什么会重复消费消息?
在kafka提交offset的时候,可能由网络延迟或者某些原因导致,offset没有同步,导致其他consumer消费了已经消费的消息
kafka如何实现顺序消费?
kafak的话需要将顺序消费的消息通过指定分区策略发送到指定的partition中
如果了解rocketMq的话,可以顺带一句,rkmq自带顺序消息功能,分为全局顺序和局部顺序消息,一般情况下都采用局部顺序消息这种机制
kafak如何保证消息不丢失?
生产端: ack = all,reties次数加大;消费端:关闭自动提交offset,消费消息成功后手动提交offset
消息进入死信队列的条件?
- 消息到达超时时间
- 队列长度到达限制
- 消息拒绝签收,不把消息放入原队列中
浅拷贝和深拷贝?
- 浅拷贝:在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。
- 深拷贝:在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行拷贝时,创建一个新的对象来保存引用类型的成员变量。
sleep、wait、yeild、join区别?
- sleep 是thread方法,sleep 过程中线程不会释放锁,只会阻塞线程
- wait 是object方法,wait 过程中线程会释放对象锁,只有当其他线程调用 notify 才能唤醒此线程
- yeild 是thread方法,不是释放资源锁,调用yeild的线程进入就绪状态
- join 是等待调用join方法的线程结束之后,程序再继续执行
synchronized 和 lock的区别?
- syn是关键字 lock是接口
- lock需要手动加锁和释放锁,syn不需要
- lock只能锁代码块,syn可以锁类、方法、代码块
- syn是非公平锁,lock既可以是公平锁也可以是非公平锁,默认是非公平锁
- syn修饰的代码在执行异常时,jdk会自动释放线程占有的锁,当Lock发生异常时,如果程序没有通过unLock()去释放锁,则很可能造成死锁现象
- lock可以让等待锁的线程响应中断处理,如tryLock(long time, TimeUnit unit),而syn不行,使用syn时,等待的线程会一直等待下去,不能够中断
- lock可以绑定条件,实现分组唤醒需要的线程;syn要么随机唤醒一个,要么唤醒全部线程
g1和cms的应用场景?
cms应用于老年代,g1应用于内存大于8G的机器,g1不在物理上区分年轻代和老年代
说一下ThreadLocal?
作用:每个线程都会有一份自己的资源变量
ThreadLocalMap中使用的key为ThreadLocal的弱引用,value为强引用。当ThreadLocal没被外部引用时key会被GC回收,导致key为null,而value永远无法被回收从而内存泄漏。最好每次用完ThreadLocal后手动调用remove()。
为什么要使用线程池?
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
tcp 为什么要三次握手,两次不行吗?为什么?
如果采用两次握手,那么只要服务器发出确认数据包就会建立连接,但由于客户端此时并未响应服务器端的请求,那此时服务器端就会一直在等待客户端,这样服务器端就白白浪费了一定的资源。若采用三次握手,服务器端没有收到来自客户端的再此确认,则就会知道客户端并没有要求建立请求,就不会浪费服务器的资源。
为什么要设置Survivor区?
- 如果不设置Survivor区 只有eden区 存活的的对象就会直接被放到送到老年代,老年代被填满就会触发触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)
- 设置两个Survivor区最大的好处就是解决了碎片化
Spring如何解决循环依赖问题?
解决的核心原理就是:在对象实例化之后,依赖注入之前,Spring提前暴露的Bean实例的引用在第三级缓存中进行存储。
- 一级缓存 singletonObjects (concurrentHashmap)
- 二级缓存 earlySingletonObjects (hashmap)
- 三级缓存 singletonFactory (hashmap)
聚簇索引和非聚簇索引在b+树上的展示形式?
- 聚簇索引:数据跟索引绑定在一起
- 非聚簇索引:数据跟索引分开存储
mysql三大范式?
- 每一列都是不可分割的,原子性
- 如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分.
- 表中的非主键列必须和主键直接相关而不能间接相关
MySQL 怎么知道 binlog 是完整的?
- statement格式的 binlog,完整的标识是最后有 COMMIT 关键字
- row 格式的binlog,完整的标识是最后会有一个 XID event 关键字
查询长时间不返回可能是什么原因?应该如何处理?
- 查询速度慢的原因很多:
- 查询字段没有索引或者没有触发索引查询
- I/O 压力大,读取磁盘速度变慢
- 内存不足
- 网络速度慢
- 查询出的数据量过大,可以采用多次查询或其他的方法降低数据量
- 死锁
- 解决方式:
- 正确创建和使用索引。
- 把数据、日志、索引放到不同的 IO 设备上,减少主数据库的 IO 操作。更换 MySQL 的磁盘为固态硬盘,以提高磁盘的 IO 性能。
- 升级内存,更换更大的内存。
- 提升网速,升级带宽。
- 用 Profiler 来跟踪查询,得到查询所需的时间,找出有问题的 SQL 语句,优化 SQL。
- 查询时值返回需要的字段。
- 设置死锁的超时时间,限制和避免死锁消耗过多服务器的资源。
什么是存储引擎?
- 存储引擎:不同的数据文件在磁盘的组织形式
- frm:表结构
- ibd:数据和索引文件
mysql索引失效的情况
- 不符合最左匹配原则
- 索引列有计算
- 有or
- 模糊查询 like %
- 索引列有函数
- 需要类型转换
聚集索引和非聚集索引?
- 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
- 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续
- 聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序
- 非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序.
- 索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
- 聚集索引是主健索引或第一个不为空的唯一索引
- 非聚集索引实际上就是普通索引
MySQL 中可不可以只要 binlog,不要 redo log?
- 不可以,binlog 没有崩溃恢复的能力
MySQL 中可不可以只要 redo log,不要 binlog?
- redo log 是循环写不能保证所有的历史数据,这些历史数据只能在 binlog 中找到
- binlog 是高可用的基础,高可用的实现原理就是 binlog 复制.
MySQL 最多可以创建多少个索引列?
最多可以创建 16 个索引列.
什么叫回表查询?
普通索引查询到主键索引后,回到主键索引树搜索的过程,我们称为回表查询.
mysql的innodb和myisam区别?
- innodb 支持外键,myisam不支持
- innodb 支持事物,myisam不支持
- innodb 支持崩溃后数据恢复
- innodb 支持行级锁,myisam支持表锁
- innodb 不支持全文索引,myisam支持fulltext
mysql如何解决死锁?
死锁概念:是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
- 查出死锁线程 select trx_MySQL_thread_id from information.schema.innodb.trx; 并且kill掉
- 设置锁的超时时间, innodblock_wait_timeout= 1000
mysql如何处理满查询?
- 开启满查询日志,定位哪条语句有问题
- 通过执行计划分析sql语句,获得其使用索引的情况,之后修改语句或者修改索引,使得语句尽可能命中索引
- 如果语句无法继续优化,考虑数据量太大,进行垂直或者水平分表
explain执行计划主要看那几个指标?
- table
- type
- key
- extra
InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红黑树或二叉树?
- B 树:不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
- Hash:虽然可以快速定位,但是没有顺序,IO 复杂度高;
- 二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且 IO 代价高;
- 红黑树:树的高度随着数据量增加而增加,IO 代价高。
MySQL事务隔离级别?
- 读未提交
- 读已提交
- 可重复读
- 串行
事务的基本要素?
- 独立性
- 一致性
- 持久性
- 原子性
事务的并发问题
- 脏读:读取了其他事务未提交的数据.
- 不可重复读:在事务A多次读取数据过程中,事务B修改了这个数据,导致事务A读取的数据不一致.
- 幻读:A修改所有的数据为1的时候,B新增了一条数据,A修改结束后发现还有一条记录没有改过来.
不可重复读侧重于修改,幻读侧重于新增或删除
Redis做消息队列与其他消息队列相比有什么不同?
Redis作为消息队列:
· 如果你的需求是快产快消的即时消费场景,并且生产的消息立即被消费者消费掉。
· 如果速度是你十分看重的,比如慢了一秒好几千万这种。
· 如果允许出现消息丢失的场景。
· 如果你不需要系统保存你发送过的消息。
· 如果需要处理的数据量并不是那么巨大。
其他消息队列:
· 如果你想要稳定的消息队列。
· 如果你想要你发送过的消息可以保留一定的时间,并不是无迹可寻的时候。
· 如果你无法忍受数据的丢失。
· 如果速度不需要那么的快。
· 如果需要处理数据量巨大的时候。
应用场景分析
Redis:轻量级,高并发,延迟敏感即时数据分析、秒杀计数器、缓存等。
其他MQ:重量级,高并发,异步批量数据异步处理、并行任务串行化,高负载任务的负载均衡等。
redis是单线程的,为什么那么快?
- 完全基于内存
- i/o多路复用
- 数据结构简单
- 拥有自己的协议-Redis 序列化协议
什么是分布式事务?
一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败.
CAP定理?
在分布式系统中,可用性、一致性、分区容错性不能同时被满足,P必须满足,剩下的根据业务从AC中选一个
redis和zookeeper分布式锁,哪个性能更高?
- redis的性能优于zookeeper
- redis是基于内存的
- zookeeper需要进行节点数据通过 至少需要两次io