1 java基础:1 算法1.1 排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序1.2 二叉查找树、红黑树、B树、B+树1.3 BitSet解决数据重复和是否存在等问题2 基本2.1 字符串常量池的迁移jdk1.6,string in PermGen永久代,方法区,在运行时大小不可扩展,jdk1.7,string in heap,-XX:StringTableSize=1009(default),WeakHashMap<String, WeakReference<String>> jdk1.8,string in heap,default table size 25-50K2.2 字符串KMP算法2.3 equals和hashcode2.4 泛型、异常、反射2.5 string的hash算法2.6 hash冲突的解决办法:开放定址法和拉链法2.7 foreach循环的原理2.8 static、final、transient等关键字的作用2.9 volatile关键字的底层实现原理2.10 Collections.sort方法使用的是哪种排序方法2.11 Future接口,常见的线程池中的FutureTask实现等2.12 string的intern方法的内部细节,jdk1.6和jdk1.7的变化以及内部cpp代码StringTable的实现3 设计模式单例模式工厂模式装饰者模式观察者设计模式ThreadLocal设计模式4 正则表达式4.1 捕获组和非捕获组4.2 贪婪,勉强,独占模式5 java内存模型以及垃圾回收算法5.1 类加载机制,也就是双亲委派模型5.2 java内存分配模型(默认HotSpot)线程共享的:堆区、永久区 线程独享的:虚拟机栈、本地方法栈、程序计数器5.3 内存分配机制:年轻代(Eden区、两个Survivor区)、年老代、永久代以及他们的分配过程5.4 强引用、软引用、弱引用、虚引用与GC5.5 happens-before规则5.6 指令重排序、内存栅栏5.7 Java 8的内存分代改进5.8 垃圾回收算法:标记-清除(不足之处:效率不高、内存碎片)复制算法(解决了上述问题,但是内存只能使用一半,针对大部分对象存活时间短的场景,引出了一个默认的8:1:1的改进,缺点是仍然需要借助外界来解决可能承载不下的问题)标记整理5.8 常用垃圾收集器:新生代:Serial收集器、ParNew收集器、Parallel Scavenge 收集器老年代:Serial Old收集器、Parallel Old收集器、CMS(Concurrent Mark Sweep)收集器、 G1 收集器(跨新生代和老年代)5.9 常用gc的参数:-Xmn、-Xms、-Xmx、-XX:MaxPermSize、-XX:SurvivorRatio、-XX:-PrintGCDetails5.10 常用工具: jps、jstat、jmap、jstack、图形工具jConsole、Visual VM、MAT6 锁以及并发容器的源码6.1 synchronized和volatile理解6.2 Unsafe类的原理,使用它来实现CAS。因此诞生了AtomicInteger系列等6.3 CAS可能产生的ABA问题的解决,如加入修改次数、版本号6.4 同步器AQS的实现原理AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改。同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作。同步器主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,对同步状态的修改或者访问主要通过同步器提供的3个方法:getState() 获取当前的同步状态setState(int newState) 设置当前同步状态compareAndSetState(int expect,int update) 使用CAS设置当前状态,该方法能够保证状态设置的原子性。同步器可以支持独占式的获取同步状态,也可以支持共享式的获取同步状态,这样可以方便实现不同类型的同步组件。同步器也是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。6.5 独占锁、共享锁;可重入的独占锁ReentrantLock、共享锁 实现原理6.6 公平锁和非公平锁6.7 读写锁 ReentrantReadWriteLock的实现原理6.8 LockSupport工具6.9 Condition接口及其实现原理6.10 HashMap、HashSet、ArrayList、LinkedList、HashTable、ConcurrentHashMap、TreeMap的实现原理6.11 HashMap的并发问题6.12 ConcurrentLinkedQueue的实现原理6.13 Fork/Join框架6.14 CountDownLatch和CyclicBarrier7 线程池源码7.1 内部执行原理7.2 各种线程池的区别2 web方面:1 SpringMVC的架构设计1.1 servlet开发存在的问题:映射问题、参数获取问题、格式化转换问题、返回值处理问题、视图渲染问题1.2 SpringMVC为解决上述问题开发的几大组件及接口:HandlerMapping、HandlerAdapter、HandlerMethodArgumentResolver、HttpMessageConverter、Converter、GenericConverter、HandlerMethodReturnValueHandler、ViewResolver、MultipartResolver1.3 DispatcherServlet、容器、组件三者之间的关系1.4 叙述SpringMVC对请求的整体处理流程1.5 SpringBoot2 SpringAOP源码2.1 AOP的实现分类:编译期、字节码加载前、字节码加载后三种时机来实现AOP2.2 深刻理解其中的角色:AOP联盟、aspectj、jboss AOP、Spring自身实现的AOP、Spring嵌入aspectj。特别是能用代码区分后两者2.3 接口设计:AOP联盟定义的概念或接口:Pointcut(概念,没有定义对应的接口)、Joinpoint、Advice、MethodInterceptor、MethodInvocationSpringAOP针对上述Advice接口定义的接口及其实现类:BeforeAdvice、AfterAdvice、MethodBeforeAdvice、AfterReturningAdvice;针对aspectj对上述接口的实现AspectJMethodBeforeAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJAfterAdvice。SpringAOP定义的定义的AdvisorAdapter接口:将上述Advise转化为MethodInterceptorSpringAOP定义的Pointcut接口:含有两个属性ClassFilter(过滤类)、MethodMatcher(过滤方法)SpringAOP定义的ExpressionPointcut接口:实现中会引入aspectj的pointcut表达式SpringAOP定义的PointcutAdvisor接口(将上述Advice接口和Pointcut接口结合起来)2.4 SpringAOP的调用流程2.5 SpringAOP自己的实现方式(代表人物ProxyFactoryBean)和借助aspectj实现方式区分3 Spring事务体系源码以及分布式事务Jotm Atomikos源码实现3.1 jdbc事务存在的问题3.2 Hibernate对事务的改进3.3 针对各种各样的事务,Spring如何定义事务体系的接口,以及如何融合jdbc事务和Hibernate事务的3.4 三种事务模型包含的角色以及各自的职责3.5 事务代码也业务代码分离的实现(AOP+ThreadLocal来实现)3.6 Spring事务拦截器TransactionInterceptor全景3.7 X/Open DTP模型,两阶段提交,JTA接口定义3.8 Jotm、Atomikos的实现原理3.9 事务的传播属性3.10 PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED的实现原理以及区别3.11 事物的挂起和恢复的原理4 数据库隔离级别4.1 Read uncommitted:读未提交4.2 Read committed : 读已提交4.3 Repeatable read:可重复读4.4 Serializable :串行化5 sql5.1 数据库性能的优化5.2 深入理解mysql的Record Locks、Gap Locks、Next-Key Locks例如下面的在什么情况下会出现死锁:start transaction; DELETE FROM t WHERE id =6; INSERT INTO t VALUES(6); commit;5.3 insert into select语句的加锁情况5.4 事务的ACID特性概念5.5 innodb的MVCC理解6 ORM框架: mybatis、Hibernate6.1 最原始的jdbc->Spring的JdbcTemplate->hibernate->JPA->SpringDataJPA的演进之路7 SpringSecurity、shiro、SSO(单点登录)7.1 Session和Cookie的区别和联系以及Session的实现原理7.2 SpringSecurity的认证过程以及与Session的关系7.3 CAS实现SSO(详见Cas(01)——简介)8 日志8.1 jdk自带的logging、log4j、log4j2、logback8.2 门面commons-logging、slf4j8.3 上述6种混战时的日志转换9 datasource9.1 c3p09.2 druid9.3 JdbcTemplate执行sql语句的过程中对Connection的使用和管理10 HTTPS的实现原理3 分布式、java中间件、web服务器等方面:1 ZooKeeper源码1.1 客户端架构1.2 服务器端单机版和集群版,对应的请求处理器1.3 集群版session的建立和激活过程1.4 Leader选举过程1.5 事务日志和快照文件的详细解析1.6 实现分布式锁、分布式ID分发器1.7 实现Leader选举2 序列化和反序列化框架Avro、Thrift、Protobuf、Protostuff2.1 Avro研究2.2 Thrift研究2.3 Protobuf研究2.4 Protostuff研究3 RPC框架dubbo源码3.1 dubbo扩展机制的实现,对比SPI机制3.2 服务的发布过程3.3 服务的订阅过程3.4 RPC通信的设计4 NIO模块以及对应的Netty和Mina、thrift源码4.1 TCP握手和断开及有限状态机4.2 backlog4.3 BIO NIO4.4 阻塞/非阻塞的区别、同步/异步的区别4.5 阻塞IO、非阻塞IO、多路复用IO、异步IO4.6 Reactor线程模型4.7 jdk的poll、epoll与底层poll、epoll的对接实现4.8 Netty自己的epoll实现4.9 内核层poll、epoll的大致实现4.10 epoll的边缘触发和水平触发4.11 Netty的EventLoopGroup设计4.12 Netty的ByteBuf设计4.13 Netty的ChannelHandler4.13 Netty的零拷贝4.14 Netty的线程模型,特别是与业务线程以及资源释放方面的理解5 消息队列kafka、MetaQ(后来版本RocketMQ)、Notify、Hermes5.1 kafka的文件存储设计5.2 kafka的高可用设计5.3 kafka本身做的很轻量级来保持高效,很多高级特性没有:事务、优先级的消息、消息的过滤,更重要的是服务治理不健全,一旦出问题,不能直观反应出来,不太适合对数据要求十分严苛的企业级系统,而适合日志之类并发量大但是允许少量的丢失或重复等场景5.4 Notify的事务设计5.5 基于文件的kafka、metaq和基于数据库的Notify和Hermes5.6 设计一个消息系统要考虑哪些方面6 数据库的分库分表mycat7 NoSql数据库mongodb8 分布式缓存 memcached redis8.1 redis对客户端的维护和管理,读写缓冲区8.2 redis事务的实现8.3 Jedis客户端的实现8.4 JedisPool以及ShardedJedisPool的实现8.5 redis epoll实现,循环中的文件事件和时间事件8.6 redis的RDB持久化,save和bgsave8.7 redis AOF命令追加、文件写入、文件同步到磁盘8.8 redis AOF重写,为了减少阻塞时间采取的措施8.9 redis的LRU内存回收算法8.10 redis的master slave复制8.11 redis的sentinel高可用方案8.12 redis的cluster分片方案9 web服务器tomcat、ngnix的设计原理9.1 tomcat的整体架构设计9.2 tomcat对通信的并发控制9.3 http请求到达tomcat的整个处理流程10 ELK日志实时处理查询系统Elasticsearch、Logstash、Kibana11 扩展11.1 SOA与微服务11.2 服务的合并部署、多版本自动快速切换和回滚详见基于Java容器的多应用部署技术实践11.3 服务的治理:限流、降级具体见 张开涛大神的架构系列服务限流:令牌桶、漏桶服务降级、服务的熔断、服务的隔离:netflix的hystrix组件11.4 服务的线性扩展无状态的服务如何做线性扩展:如一般的web应用,直接使用硬件或者软件做负载均衡,简单的轮训机制有状态服务如何做线性扩展:如Redis的扩展:一致性hash,迁移工具11.5 服务链路监控和报警:CAT、Dapper、Pinpoint12 Spring Cloud12.1 Spring Cloud Zookeeper:用于服务注册和发现12.2 Spring Cloud Config:分布式配置12.2 Spring Cloud Netflix Eureka:用于rest服务的注册和发现12.3 Spring Cloud Netflix Hystrix:服务的隔离、熔断和降级12.4 Spring Cloud Netflix Zuul:动态路由,API Gateway13 分布式事务13.1 JTA分布式事务接口定义,对此与Spring事务体系的整合13.2 TCC分布式事务概念13.3 TCC分布式事务实现框架案例1:tcc-transaction13.3.1 TccCompensableAspect切面拦截创建ROOT事务13.3.2 TccTransactionContextAspect切面使远程RPC调用资源加入到上述事务中,作为一个参与者13.3.3 TccCompensableAspect切面根据远程RPC传递的TransactionContext的标记创建出分支事务13.3.4 全部RPC调用完毕,ROOT事务开始提交或者回滚,执行所有参与者的提交或回滚13.3.5 所有参与者的提交或者回滚,还是通过远程RPC调用,provider端开始执行对应分支事务的confirm或者cancel方法13.3.6 事务的存储,集群共享问题13.3.7 事务的恢复,避免集群重复恢复13.4 TCC分布式事务实现框架案例2:ByteTCC13.4.1 JTA事务管理实现,类比Jotm、Atomikos等JTA实现13.4.2 事务的存储和恢复,集群是否共享问题13.4.3 CompensableMethodInterceptor拦截器向spring事务注入CompensableInvocation资源13.4.4 Spring的分布式事务管理器创建作为协调者CompensableTransaction类型事务,和当前线程进行绑定,同时创建一个jta事务13.4.5 在执行sql等操作的时候,所使用的jdbc等XAResource资源加入上述jta事务13.4.6 dubbo RPC远程调用前,CompensableDubboServiceFilter创建出一个代理XAResource,加入上述CompensableTransaction类型事务,并在RPC调用过程传递TransactionContext13.4.7 RPC远程调用来到provider端,CompensableDubboServiceFilter根据传递过来的TransactionContext创建出对应的CompensableTransaction类型事务13.4.8 provider端,执行时遇见@Transactional和@Compensable,作为一个参与者开启try阶段的事务,即创建了一个jta事务13.4.9 provider端try执行完毕开始准备try的提交,仅仅是提交上述jta事务,返回结果到RPC调用端13.4.10 全部执行完毕后开始事务的提交或者回滚,先对jta事务进行提交,提交成功后再对CompensableTransaction类型事务进行提交,如果jta事务提交失败,则需要回滚CompensableTransaction类型事务。13.4.11 CompensableTransaction类型事务的提交就是对CompensableInvocation资源和RPC资源的提交,分别调用每一个CompensableInvocation资源的confirm,以及每一个RPC资源的提交13.4.12 此时每一个CompensableInvocation资源的confirm又会准备开启一个新的事务,当前线程的CompensableTransaction类型事务,所以这里开启事务仅仅是创建了一个新的jta事务而已13.4.13 针对此,每一个CompensableInvocation资源的confirm开启的事务,又开始重复上述过程,对于jdbc等资源都加入新创建的jta事务中,而RPC资源和CompensableInvocation资源仍然加入到当前线程绑定的CompensableTransaction类型事务13.4.14 当前CompensableInvocation资源的confirm开启的事务执行完毕后,开始执行commit,此时仍然是执行jta事务的提交,提交完毕,一个CompensableInvocation资源的confirm完成,继续执行下一个CompensableInvocation资源的confirm,即又要重新开启一个新的jta事务13.4.15 当所有CompensableInvocation资源的confirm执行完毕,开始执行RPC资源的commit,会进行远程调用,执行远程provider分支事务的提交,远程调用过程会传递事务id13.4.16 provider端,根据传递过来的事务id找到对应的CompensableTransaction事务,开始执行提交操作,提交操作完成后返回响应13.4.17 协调者收到响应后继续执行下一个RPC资源的提交,当所有RPC资源也完成相应的提交,则协调者算是彻底完成该事务14 一致性算法14.1 raft14.1.1 leader选举过程,leader选举约束,要包含所有commited entries,实现上log比过半的log都最新即可14.1.2 log复制过程,leader给所有的follower发送AppendEntries RPC请求,过半follower回复ok,则可提交该entry,然后向客户端响应OK14.1.3 在上述leader收到过半复制之后,挂了,则后续leader不能直接对这些之前term的过半entry进行提交(这一部分有详细的案例来证明,并能说出根本原因),目前做法是在当前term中创建空的entry,然后如果这些新创建的entry被大部分复制了,则此时就可以对之前term的过半entry进行提交了14.1.4 leader一旦认为某个term可以提交了,则更新自己的commitIndex,同时应用entry到状态机中,然后在下一次与follower的heartbeat通信中,将leader的commitIndex带给follower,让他们进行更新,同时应用entry到他们的状态机中14.1.5 从上述流程可以看到,作为client来说,可能会出现这样的情况:leader认为某次client的请求可以提交了(对应的entry已经被过半复制了),此时leader挂了,还没来得及给client回复,也就是说对client来说,请求虽然失败了,但是请求对应的entry却被持久化保存了,但是有的时候却是请求失败了(过半都没复制成功)没有持久化成功,也就是说请求失败了,服务器端可能成功了也可能失败了。所以这时候需要在client端下功夫,即cleint端重试的时候仍然使用之前的请求数据进行重试,而不是采用新的数据进行重试,服务器端也必须要实现幂等。14.1.6 Cluster membership changes14.2 ZooKeeper使用的ZAB协议4 大数据方向1 Hadoop1.1 UserGroupInformation源码解读:JAAS认证、user和group关系的维护1.2 RPC通信的实现1.3 代理用户的过程1.4 kerberos认证2 MapReduce2.1 MapReduce理论及其对应的接口定义3 HDFS3.1 MapFile、SequenceFile3.2 ACL4 YARN、Mesos 资源调度5 oozie5.1 oozie XCommand设计5.2 DagEngine的实现原理6 Hive6.1 HiveServer2、metatore的thrift RPC通信设计6.2 Hive的优化过程6.3 HiveServer2的认证和授权6.4 metastore的认证和授权6.5 HiveServer2向metatore的用户传递过程7 Hbase7.1 Hbase的整体架构图7.2 Hbase的WAL和MVCC设计7.3 client端的异步批量flush寻找RegionServer的过程7.4 Zookeeper上HBase节点解释7.5 Hbase中的mini、major合并7.6 Region的高可用问题对比kafka分区的高可用实现7.7 RegionServer RPC调用的隔离问题7.8 数据从内存刷写到HDFS的粒度问题7.9 rowKey的设计7.10 MemStore与LSM8 Spark8.1 不同的部署方式8.2 SparkSql的实现方式8.3 。。。
posted on 2017-04-21 10:19 阅读( ...) 评论( ...)