0%

1 Java基础

1.1 Collection和Map

  1. 掌握Collection和Map的继承体系。Java Collection与map
  2. 掌握ArrayList、LinkedList、Vector、Stack、PriorityQueue、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap、WeakHashMap、EnumMap、TreeMap(红黑树)、HashTable的特点和实现原理。
  3. 掌握CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的实现原理和适用场景。
  4. Java并发容器

1.2 IO

  1. 掌握InputStream、OutputStream、Reader、Writer的继承体系:
    Java IO ,
    Java 压缩 ,
    Java XML与JSON,
    Java序列化
  2. 掌握字节流(FileInputStream、DataInputStream、BufferedInputStream、FileOutputSteam、DataOutputStream、BufferedOutputStream)和 字符流(BufferedReader、InputStreamReader、FileReader、BufferedWriter、OutputStreamWriter、PrintWriter、FileWriter),并熟练运用。
  3. 掌握NIO实现原理及使用方法。
    IO模式
    Java NIO
  4. Netty原理 这可能是目前最透彻的Netty原理架构解析
  5. IO理论 高性能网络编程

1.3 异常

  1. 掌握Throwable继承体系。深入理解java异常处理机制
  2. 掌握异常工作原理。
  3. 了解常见受检异常(比如FileNotFoundException)、非受检异常(比如NullPointerException)和错误(比如IOError)。

1.4 多线程

  1. 线程池的实现原理、参数配置、平滑关机
    了解Executors可以创建的三种 (JAVA8增加了一种,共四种)线程池的特点及适用范围。
    Java多线程5: 线程池

  2. 掌握多线程同步机制,并熟练运用。

  3. 并发包

1.5 Socket

  1. 掌握Socket通信原理。Java Socket
  2. 熟练使用多线程结合Socket进行编程。

1.6 Stream API

  1. Lambda 实现原理
  2. 懒加载实现原理

2 Java虚拟机

2.1 JVM内存区域划分

深入理解JVM(Java虚拟机)
Java性能专题

  1. 掌握JMM分区: 程序计数器、堆、虚拟机栈、本地方法栈、方法区(JAVA8已移除)、元空间(JAVA8新增)的作用及基本原理。
  2. 掌握堆的划分:新生代(Eden、Survivor1、Survivor2)和老年代的作用及工作原理。
  3. 垃圾回收:常见算法与策略、CMS GC、G1
  4. [重点] 掌握JVM内存参数设置及调优
    • Eden与Survivor分配
    • JStack、Jstat、vmstat、jmap、jutil
    • 线上排查

2.2 类加载

  1. 掌握类的加载阶段:加载、链接(验证、准备、解析)、初始化、使用、卸载。
  2. 掌握类加载器分类及其应用:启动类加载器、扩展类加载器、应用程序类加载器、自定义加载器。
  3. 双亲委派
  4. 动态加载
  5. CodeGen

3 J2EE

  1. 掌握JSP内置对象、动作及相关特点和工作原理。JSP
  2. 掌握Servlet的特点和工作原理。 Servlet
  3. Spring: IOC和AOP实现原理(控制反转和动态代理)。 Spring
  4. MVC框架(Spring MVC,Struts等)的工作原理,并熟练运用。 Struts2 Spring MVC工作原理、事务
  5. Spring MVC: 线程安全、请求原理、事务与传递、异步
  6. ORM框架(Hibernate,MyBatis等)的工作原理,并熟练运用。 Hibernate基本概念 Hibernate关联关系XML实现 Hibernate注解 MyBatis原理与缓存

4 数据结构与算法

  1. 掌握线性表的特点并熟练运用: B-Tree节点结构
  2. 掌握常用排序和查找算法:插入排序(直接插入排序、希尔排序)、选择排序(直接选择排序、堆排序)、交换排序(冒泡排序、快速排序)、归并排序,顺序查找、二分查找、二叉查找树、哈希查找。广度优先搜索(队列实现)
  3. 熟练运用常见排序和查找算法思想解决编程问题: Top K问题、大数组查找TopN、数组去重、跳台阶问题、不定长字符串转定长字符串
  4. 了解几大基本算法:贪心算法、分治策略、动态规划、蓄水池抽样
  5. LeetCode

5 计算机网络

  1. 掌握网络的分层结构,及每层的功能特点。计算机网络基础知识
  2. Http报文、状态码
  3. 掌握TCP/IP的通信原理(三次握手、四次挥手)
  4. HTTPS,
    加密、验签与证书
  5. Https创建连接的过程

6 数据库

  1. 掌握复杂的SQL语句编写。MySQL 数据库设计
  2. 掌握数据库的优化(SQL层面和表设计层面)。MySQL 性能优化的最佳20多条经验
  3. MySQL
    • InnoDB数据结构、索引
    • InnoDB与MyASIM区别
    • 行级锁与表级锁
  4. MySQL集群
    • 集群
    • 读写分离与实现
    • 双写
  5. 熟悉高并发、大数据情况下的数据库开发。

7 Web技术

  1. 掌握AJAX的工作原理。
  2. 至少熟悉一款JS框架(比如JQuery)。JQuery

8 设计模式

  1. 熟悉常见的设计模式
  2. 会将设计模式理论应用到实际开发中。

9 Linux

  1. 熟练运用Linux常见命令。
  2. 熟悉Linux操作系统基本概念及特点。
  3. 熟悉Shell脚本

10 操作系统

  1. 掌握操作系统的进程管理。
  2. 了解操作系统的I/O。
  3. Linux系统调优: 命令与方法
  4. 用户态与核心态

11 正则表达式

  1. 掌握常见正则表达式符号。
  2. 熟练运用正则表达式解决实际问题(比如匹配电话号码、邮箱、域名等)。常用的正则表达式与Java中的运用

12 安全

  1. XSS
  2. CROS
  3. RTFS
  4. 加密解密与验签
  5. HTTPS
  6. 跨域请求的方法

13 分布式

  1. 分布式事务
    • 分布式锁:基于DB事务、基于Redis、基于ZooKeeper
    • ACID
    • CAP、BASE
    • TCC
  2. 微服务
  3. Nginx: 原理、负载均衡算法、动态切换
  4. 消息中间件 Kafka、ActiveMQ
  5. 分布式缓存及其集群: 雪崩、穿透、Master选举切换
  6. Redis:集群、并发竞争问题、事务与CAS操作、持久化、订阅、缓存失败策略
  7. Memcached: 数据结构
  8. ZooKeeper: 数据结构、集群、Master选举切换
  9. RPCWebService: SOAP、UUDI、WSDL
  10. 服务治理SOA框架的使用与原理
    • Dubbo: 架构、雪崩、服务异常与逻辑异常追踪、服务降级、服务发现
  11. 分库分表
    • 常见分库分表方案:水平分表与垂直分表的业务设计
    • 扩容与迁移
    • MyCat
    • Sharding-JDBC
  12. 唯一主键生成器
  13. 算法: 一致性hash、轮询、Paxos、fast leader、raft
  14. 系统设计
    • 高可用
    • 可扩展
    • 限流(滑动窗口、漏桶、令牌桶)
    • 幂等
  15. 常见场景
    • 电商
  16. Docker

14 大数据

  1. 复杂SQL语句
  2. 实时计算: 基数算法
  3. Storm 原理
  4. Hadoop
    • NameNode动态切换
    • MapReduce与shuffle、数据倾斜问题
  5. Yarn
  6. HBase
  7. Kylin
  8. Hive
  9. Lucene、solar、ElasticSearch
  10. 爬虫
  11. 推荐算法:协同过滤
  12. 画像系统原理

Flink知识图谱

14.2 ES

  1. es分页机制

14.3 Kafka

  1. ack机制
  2. Kafka生产者ack机制剖析

15 机器学习

16 其他

  1. Quartz 原理:调度与分布式
  2. 缓存: Ehcache、Spring Data cache、Guava-cache
    • LRUCache
    • FastLRUCache
  3. 连接池:Druid
  4. 虐菜
  5. 软件工程基本知识
  6. CORBAR
  7. WebSocket
  8. Tomcat实现原理

妙极监控设计

TDE是一个全内存的分布式KV存储系统,写操作即put单台机器能力为6.6万笔/秒,读操作即get达到38万笔/秒。

FlinkKuduSink

1
2
--kudu.cache.size 2000 
--kudu.write.thread.cnt 10

image-20210425095426335

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

org.apache.kudu.client.NonRecoverableException: Couldn't find a valid master in (9.7.185.196:7050). Exceptions received: [org.apache.kudu.client.RpcRemoteException: [peer master-] server sent error Service unavailable: service kudu.master.MasterService not registered on TabletServer]
at org.apache.kudu.client.KuduException.transformException(KuduException.java:110)
at org.apache.kudu.client.KuduClient.joinAndHandleException(KuduClient.java:413)
at org.apache.kudu.client.KuduClient.tableExists(KuduClient.java:229)
at org.apache.flink.connectors.kudu.connector.writer.KuduWriter.obtainTable(KuduWriter.java:74)
at org.apache.flink.connectors.kudu.connector.writer.KuduWriter.<init>(KuduWriter.java:59)
at org.apache.flink.connectors.kudu.streaming.KuduSink.open(KuduSink.java:62)
at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36)
at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.open(AbstractUdfStreamOperator.java:102)
at org.apache.flink.streaming.api.operators.StreamSink.open(StreamSink.java:48)
at org.apache.flink.streaming.runtime.tasks.StreamTask.openAllOperators(StreamTask.java:426)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:292)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:726)
at java.lang.Thread.run(Thread.java:748)
Suppressed: org.apache.kudu.client.KuduException$OriginalException: Original asynchronous stack trace
at org.apache.kudu.client.ConnectToCluster.incrementCountAndCheckExhausted(ConnectToCluster.java:244)
at org.apache.kudu.client.ConnectToCluster.access$100(ConnectToCluster.java:49)
at org.apache.kudu.client.ConnectToCluster$ConnectToMasterErrCB.call(ConnectToCluster.java:363)
at org.apache.kudu.client.ConnectToCluster$ConnectToMasterErrCB.call(ConnectToCluster.java:352)
at com.stumbleupon.async.Deferred.doCall(Deferred.java:1280)
at com.stumbleupon.async.Deferred.runCallbacks(Deferred.java:1259)
at com.stumbleupon.async.Deferred.handleContinuation(Deferred.java:1315)
at com.stumbleupon.async.Deferred.doCall(Deferred.java:1286)
at com.stumbleupon.async.Deferred.runCallbacks(Deferred.java:1259)
at com.stumbleupon.async.Deferred.callback(Deferred.java:1002)
at org.apache.kudu.client.KuduRpc.handleCallback(KuduRpc.java:275)
at org.apache.kudu.client.KuduRpc.errback(KuduRpc.java:329)
at org.apache.kudu.client.RpcProxy.responseReceived(RpcProxy.java:247)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
org.apache.kudu.client.NonRecoverableException: must specify at least one key column
at org.apache.kudu.client.KuduException.transformException(KuduException.java:110)
at org.apache.kudu.client.KuduClient.joinAndHandleException(KuduClient.java:413)
at org.apache.kudu.client.KuduClient.createTable(KuduClient.java:118)
at org.apache.flink.connectors.kudu.connector.writer.KuduWriter.obtainTable(KuduWriter.java:78)
at org.apache.flink.connectors.kudu.connector.writer.KuduWriter.<init>(KuduWriter.java:59)
at org.apache.flink.connectors.kudu.streaming.KuduSink.open(KuduSink.java:62)
at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36)
at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.open(AbstractUdfStreamOperator.java:102)
at org.apache.flink.streaming.api.operators.StreamSink.open(StreamSink.java:48)
at org.apache.flink.streaming.runtime.tasks.StreamTask.openAllOperators(StreamTask.java:426)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:292)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:726)
at java.lang.Thread.run(Thread.java:748)
Suppressed: org.apache.kudu.client.KuduException$OriginalException: Original asynchronous stack trace
at org.apache.kudu.client.RpcProxy.dispatchMasterError(RpcProxy.java:386)
at org.apache.kudu.client.RpcProxy.responseReceived(RpcProxy.java:279)
at org.apache.kudu.client.RpcProxy.access$000(RpcProxy.java:59)
at org.apache.kudu.client.RpcProxy$1.call(RpcProxy.java:149)
at org.apache.kudu.client.RpcProxy$1.call(RpcProxy.java:145)
at org.apache.kudu.client.Connection.messageReceived(Connection.java:390)
at org.apache.kudu.shaded.org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.apache.kudu.client.Connection.handleUpstream(Connection.java:238)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.apache.kudu.shaded.org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:70)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.apache.kudu.shaded.org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.apache.kudu.shaded.org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.apache.kudu.shaded.org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
at org.apache.kudu.shaded.org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.apache.kudu.shaded.org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.apache.kudu.shaded.org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
at org.apache.kudu.shaded.org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.apache.kudu.shaded.org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.apache.kudu.shaded.org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
at org.apache.kudu.shaded.org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
at org.apache.kudu.shaded.org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
at org.apache.kudu.shaded.org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
at org.apache.kudu.shaded.org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at org.apache.kudu.shaded.org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.apache.kudu.shaded.org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
... 1 more

Rows per page:
5
1 - 1 of 1

1 Stream processing with Apache Flink

1.1 状态+重放是保证exactly once的基础

Connecting a stateful streaming application running on Flink and an event log is interesting for multiple reasons.
In this architecture the event log persists the input events and can replay them in deterministic order.
In case of a failure, Flink recovers a stateful streaming application by restoring its state from a previous checkpoint and resetting the read position on the event log.
The application will replay (and fast forward) the input events from the event log until it reaches the tail of the stream.
This technique is used to recover from failures but can also be leveraged to update an application, fix bugs and repair previously emitted results, migrate an application to a different cluster, or perform A/B tests with different application versions.

将运行在Flink上的有状态流应用程序与事件日志连接起来非常有趣,原因有很多。在这种体系结构中,事件日志保存输入事件,并可以以确定的顺序重播它们。在失败的情况下,Flink通过从以前的检查点恢复有状态流应用程序的状态并重新设置事件日志上的读位置来恢复有状态流应用程序。应用程序将重播(并快进)事件日志中的输入事件,直到它到达流的尾部。此技术用于从故障中恢复,但也可用于更新应用程序、修复bug和修复以前发出的结果、将应用程序迁移到不同的集群或使用不同的应用程序版本执行a/B测试。

1.2 事件驱动

Event-driven applications offer several benefits compared to transactional applications or microservices. Local state access provides very good performance compared to reading and writing queries against remote datastores. Scaling and fault tolerance are handled by the stream processor, and by leveraging an event log as the input source the complete input of an application is reliably stored and can be deterministically replayed. Furthermore, Flink can reset the state of an application to a previous savepoint, making it possible to evolve or rescale an application without losing its state.

与事务性应用程序或微服务相比,事件驱动应用程序有几个优点。与对远程数据存储读写查询相比,本地状态访问提供了非常好的性能。扩展和容错由流处理器处理,通过利用事件日志作为输入源,应用程序的完整输入被可靠地存储并可以确定地重播。此外,Flink可以将应用程序的状态重置为以前的保存点,从而可以在不丢失状态的情况下演化或重新调整应用程序