Flink 配置文档

重要的配置

Task Manager

内存

taskmanager.memory.process.size

整个 Task Manager 的内存大小

Task Manager 的堆大小

如果不配这个, 会默认按百分比配置, 导致堆分到的内存变小, 造成内存浪费.

配置了这个后不要再配置 taskmanager.memory.process.size

taskmanager.memory.managed.size

Task Manager 的管理内存大小

这个内存要指定大小, 否则会按默认百分比配置, 造成内存浪费.

Task Slot

taskmanager.numberOfTaskSlots

每个 Task Manager 的 Task Slot 的数量

参考文档: https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/deployment/config/

Flink Standalone 部署文档

准备

  1. Linux 操作系统
  2. 安装 JDK 8
  3. 下载 Flink 发行版
  4. 解压到指定目录

开始 Standalone 集群

  1. 进入 Flink 目录
  2. 启动集群: ./bin/start-cluster.sh

关闭 Standalone 集群

  1. 进入 Flink 目录
  2. 关闭集群: ./bin/stop-cluster.sh

参考文档: https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/deployment/resource-providers/standalone/overview/

总结-开思-数据集成平台-V1.0

架构

设计阶段应注重异常流程的设计, 否则写出来的没有经过设计的异常处理代码会非常臃肿.

流处理程序中, 应保证元数据的一致性

即一个元数据应该只对应一个特定的数据体. 即使元数据里面的内容是相同的, 也不能随意的更换它

当系统较复杂时, 类型键的命名应该具体, 以避免歧义.

  • 正例: 数据业务类型: 商品 / 订单
  • 反例: 数据类型: 商品 / 订单

代码评审

审核代码时不应只注意代码的规范, 还应注意新旧代码的一致性

  • 比如命名和方法名的语义性

Elasticsearch

ES 限制最大的查询结果为 10000 条. 超过后即使分页查询第 10001 条也会报错

解决方案: 将限制由 10000 改为 1000000

1
2
3
4
PUT _all/_settings?preserve_existing=true
{
"index.max_result_window" : "10000000"
}

避免 Index 中的字段动态, 因为可能会导致整个 ES 服务超时

由于 ES 会为 Index 的每个新增的字段创建一个 mapping, 当 Index 中字段过多时, mappings 会非常多.
创建或删除 document 时由于会改变字段的 mapping, 会占用非常多的 CPU 时间. 从而导致整个 ES 服务超时.

每个 Index 尽量保证字段不变或很少变

消息组件

消息组件不是用来发送单条大 size 的数据的, 而是用来发送多条小 size 的数据的

Kafka

Kafka 中存在 transction 的概念. Producer 会收集一批数据后一次性发送

Flink

SonarLint 使用手册

目的

指导开发人员安装/使用 SonarLint, 帮助开发人员统一应用公司代码检测配置. 以减少远程 CI 时质量检测不通过的几率, 提高开发效率.

安装

  1. 在 Intellij IDEA 的 Plugin Marketplace 中搜索 SonarLint
  2. 点击 INSTALL
  3. 重启 IDE

使用

  1. 包扫描

  2. 文件扫描

使用远程 SonarQube Server 代码检测配置

  1. 配置 SonarQube 远程服务器

    1. 配置名称及 URL

      URL: http://10.118.71.198:9000/

    2. 配置 Token

      Token: e76568b88f7e8788f60afda7b9f26aa0db9ec64f

    3. 更新配置到本地

      PS: 更新配置时会弹出如下警告窗口, 是远程服务器 PHP 代码检测模块和 Python 代码检测模块版本过低导致. 对 Java 检测没有影响.

  2. 绑定项目

Q & A

1. 在实际开发过程中远程配置是否生效?

A: 生效, 验证如下:

  1. 使用本地默认配置检测 unused imports 规则, 结果是可以检测出来

  2. 在远程配置中禁用掉对 unused imports 规则的检测

  3. 使用远程配置检测 unused imports 规则, 结果是无法检测出来

2. Intellij IDEA 中一个Project中多个微服务, 如何保证远程配置生效?

A: 绑定项目步骤中绑定组内随机一个微服务, 即可使用本组的远程配置

Thoughtwork-TDD-笔记

思想

极限编程是指将最佳实践做到极限

防御性测试代价太大, 应该只测试 80%的正确业务场景

git 规范

git commit 提现业务价值

命名

测试方法名称使用下划线方式命名

命名使用一般含义而非具体实现来命名

写完方法名后让队友读一下以检测可读性

TDD

Why TDD

简化设计

活文档

测试用例维护好后方法签名本身就是活文档

快速反馈

安全保障

测试替身

正交分解法

Code Review 原则

关注 git commits

每个测试通过都要提交一次代码. 至少 30 秒一次提交

commit 粒度:

  1. 经验丰富的开发人员: 15m
  2. 经验不足的开发人员: 2h

Story 拆分

架构

  1. 对请求和响应的处理放在 controller 层

PS: 1 个架构师带 8 个新人

功能

  1. 识别 MVP(最重要部分)

    1. 点到点走通
    2. 阻断性功能

半白盒测试

某些单元测试是半白盒的

某些测试依赖于功能的关键实现点. 比如随机数生成

重构过程中发现 bug 暂不进行更改. 重构后再进行

模块中某个单词只能代表一个含义


重构

性能优化非重构

书籍:

  1. 程序员修炼之道
  2. 架构整洁之道

不重构的情况

  1. 不动不看
  2. 不知目标: 不知道什么才是好的
  3. 不如重写

如何重构

  1. 旧的不变
  2. 新的创建
  3. 一步切换: 注释旧代码, 切换到新代码
  4. 旧的再见: 删除旧代码

继承体系不能过长

最好不超过三层

遗留系统重构

获取测试人员的测试清单. 想办法转为单元测试

一部分一部分的重构

优先重构依赖少价值高的代码

副作用

尽量不要写有副作用的函数

副作用: 对输入没有更改

纯函数: 没有状态

只能修改自己类的东西

如何下手

  1. 掌握系统业务
  2. 明确系统边界
  3. 小步改造系统

系统架构可视化工具: C4 模型

  1. 系统上下文图
  2. 容器图
  3. 组件图
  4. 代码图

设计模式-简介

定义

设计模式是软件开发人员在软件开发过程中面临的通用问题的解决方案

这些解决方案是众多软件开发人员经过相当长的时间的试验和错误中总结出来的

作用

设计模式是一套被反复使用的, 多数人知晓的, 经过分类编目的, 代码设计经验的总结

使用设计模式是为了重用代码, 让代码更容易被他人理解, 保证代码可靠性

面对对象的设计原则

  • 对接口编程而不是对实现编程
  • 优先使用组合而不是继承

类型

创建型模式

定义

这些设计模式

结构型模式

行为型模式

J2EE模式

设计模式-抽象工厂

设计模式-拦截过滤器

简介

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理. 定义过滤器, 并在把请求传给实际目标应用程序之前应用在请求上. 过滤器可以做认证/授权/记录日志, 或者跟踪请求, 然后把请求传给相应的处理程序. 以下是这种设计模式的实体.

  • 过滤器(Filter): 过滤器在请求处理程序执行请求之前或之后, 执行某些任务.
  • 过滤器链(Filter Chain): 过滤器链带有多个过滤器, 并在 Target 上按照定义的顺序执行这些过滤器.
  • 目标(Target): 目标对象是请求处理程序.
  • 过滤管理器(Filter Manager): 过滤管理器管理过滤器和过滤器链.
  • 客户端(Client): Client 是向 Target 对象发送请求的对象.

类图

类图

和过滤器模式(Filter Pattern)的区别

  1. 过滤器模式中没有FilterChain这个概念, 无法阻止对目标的调用. 而拦截过滤器模式由于有这个概念, 在每个Filter执行时选择是否执行FilterChain里的下一个Filter. 如果不执行, 则不会对目标进行调用

  2. 过滤器模式是对已有对象列表过滤. 而拦截过滤器模式是对调用目标的单个请求的过滤

例子

拦截过滤器模式在 javax.servlet 中的应用

Filter接口

1
2
3
4
5
public interface Filter {
...
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
...

FilterChain接口

1
2
3
4
public interface FilterChain {
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException;
}

FilterChain实现类ApplicationFilterChain

1
2
3
final class ApplicationFilterChain implements FilterChain {

}

1. Filter初始化过程

  1. ContextConfig#webConfig方法中扫描web.xml文件, 构建WebXml对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
    * Scan the web.xml files that apply to the web application and merge them
    * using the rules defined in the spec. For the global web.xml files,
    * where there is duplicate configuration, the most specific level wins. ie
    * an application's web.xml takes precedence over the host level or global
    * web.xml file.
    */
    protected void webConfig() {
    ...
    WebXml webXml = createWebXml();
    ...
    configureContext(webXml);
    ...
    }
  2. ContextConfig#configureContext方法将WebXml中解析到的FilterMap列表放入StandardContext

    1
    2
    3
    4
    5
    6
    7
    private void configureContext(WebXml webxml) {
    ...
    for (FilterMap filterMap : webxml.getFilterMappings()) {
    context.addFilterMap(filterMap);
    }
    ...
    }

2. Filter执行过程

  1. ApplicationDispatcher#doDispatch方法处理请求

    1
    2
    3
    4
    private void doDispatch(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    ...
    invoke(state.outerRequest, state.outerResponse, state);
    }
  2. ApplicationDispatcher#invoke调用方法创建FilterChain, 执行FilterChaindoFilter方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void invoke(ServletRequest request, ServletResponse response,
    State state) throws IOException, ServletException {
    ...
    ApplicationFilterChain filterChain = ApplicationFilterFactory. createFilterChain(request, wrapper, servlet);
    try {
    // for includes/forwards
    if ((servlet != null) && (filterChain != null)) {
    filterChain.doFilter(request, response);
    }
    // Servlet Service Method is called by the FilterChain
    }
    ...
    }
  3. ApplicationFilterFactory#createFilterChain提取StandardContext中的Filter列表放入新创建的FilterChain

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public static ApplicationFilterChain createFilterChain(ServletRequest request, Wrapper wrapper, Servlet servlet) {
    ...
    filterChain = new ApplicationFilterChain();
    ...
    // Add the relevant path-mapped filters to this filter chain
    for (int i = 0; i < filterMaps.length; i++) {
    if (!matchDispatcher(filterMaps[i] ,dispatcher)) {
    continue;
    }
    if (!matchFiltersURL(filterMaps[i], requestPath))
    continue;
    ApplicationFilterConfig filterConfig = (ApplicationFilterConfig)
    context.findFilterConfig(filterMaps[i].getFilterName());
    if (filterConfig == null) {
    // FIXME - log configuration problem
    continue;
    }
    filterChain.addFilter(filterConfig);
    }
    ...
    }
  4. FilterChaindoFilter方法中获取第一个Filter并执行其doFilter方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void doFilter(ServletRequest request, ServletResponse response)
    throws IOException, ServletException {
    ...
    internalDoFilter(request,response);
    ...
    }

    private void internalDoFilter(ServletRequest request, ServletResponse response){
    ...
    filter.doFilter(request, response, this);
    ...
    }

应用

业务代码中应用的可行性探讨

参数校验上使用的可行性

通过拦截过滤器模式进行参数校验. 满足过滤器条件的继续执行, 不满足的直接返回.

使用注解关联调用类和过滤器

动物园建设说明书

简介

Zoo 是一个工具集网站
提供提高生产力的各种工具, 并允许开发者自由发布工具

现状

目前已有网站. 网站拥有展示功能, 缺少发布和推荐功能.

架构设计

用例图

用例图

ER图

ER图

表结构

表结构

功能需求

上传工具信息

规划: 1.增加发布功能.提供入口供开发者发布工具信息.包括介绍/网址/开发者等 2.增加一键生成 Jira 任务功能,与现有 Story 工具整合,减少迭代管理中的重复劳动 3.增加 Jenkins 插件工具. 减少开发人员操作 Jenkins 的时间 4.增加现有优秀生产力工具推荐功能.供开发人员快捷使用,提高传播和开发效率

动物园建设说明书

简介

Zoo 是一个工具集网站
提供提高生产力的各种工具, 并允许开发者自由发布工具

现状

目前已有网站. 网站拥有展示功能, 缺少发布和推荐功能.

架构设计

用例图

用例图

ER图

ER图

表结构

表结构

功能需求

上传工具信息

规划: 1.增加发布功能.提供入口供开发者发布工具信息.包括介绍/网址/开发者等 2.增加一键生成 Jira 任务功能,与现有 Story 工具整合,减少迭代管理中的重复劳动 3.增加 Jenkins 插件工具. 减少开发人员操作 Jenkins 的时间 4.增加现有优秀生产力工具推荐功能.供开发人员快捷使用,提高传播和开发效率