1.Spring相关
1.1 Autowired、Resource区别
Spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。
共同点:
@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
不同点
@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byType自动注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
1.2 @RestController和@Controller的区别
@RestController=@Controller+@ResponseBody
RestController只返回return后面的字符串,Controller返回jsp页面
2.JVM调优
3.Kafka相关
3.1 kafka介绍
Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。
3.2 为什么使用kafka,为什么要使用消息队列
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3.3 kafka 为什么那么快
Cache Filesystem Cache PageCache缓存
顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。
Zero-copy 零拷⻉技术(参考:图解Kafka的零拷贝技术到底有多牛),文章写得通俗易懂
Batching of Messages 批量处理 合并小的请求,然后以流的方式进行交互,直顶网络上限。
Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符。
3.4 kafka是如何保证不丢失消息的
参考:kafka消息不丢失
ACK 机制
通过 ACK 机制保证消息送达。Kafka 采用的是至少一次(At least once),消息不会丢,但是可能会重复传输。
发送消息
为了得到更好的性能,Kafka 支持在生产者一侧进行本地buffer,也就是累积到一定的条数才发送,如果这里设置不当是会丢消息的。
生产者端设置 producer.type=async, sync,默认是 sync。
当设置为 async,会大幅提升性能,因为生产者会在本地缓冲消息,并适时批量发送。
如果对可靠性要求高,那么这里可以设置为 sync 同步发送。
3.5 kafka是如何保证消息的有序性
顺序写磁盘
顺序写磁盘的性能是随机写入的性能的6000倍的提升,媲美内存随机访问的性能,磁盘不再是瓶颈点。
3.6 为什么kafka不支持读写分离
参考:https://www.jianshu.com/p/8b3dc29eeabd
4.Java基础
· 虐人必备
4.1 Object类的对象有哪些方法?分别作用是什么?使用场景是什么?
Object类九大方法:Java中的object九大方法
引申问题:HashCode()和Equals区别:看似简单的hashCode和equals面试题,竟然有这么多坑!
4.2 Integer常量缓存池
参考:Integer常量池
4.3 String Pool
reference: string-pool-in-java8
The change has been done on java7 itself that the constant pool has been moved to typical heap space from permgen space(still the pool behaviour is same) where as permgen space completely removed in Java 8. Metaspace is nothing to do with constant pool specially, it is generic for all objects.
4.4 Throwable Exception
5. Redis相关
5.1 哈希一致性算法
6.RPC
https://www.jianshu.com/p/193634cca86a
7.Storm 调优
8. log4j
9. 其他
1. VM和容器的区别
2.