《Kafka系列》 流式处理笔记

187 阅读3分钟

1. 数据流

也称“事件流”或“流数据”,是无边界数据集的抽象表示。

事件流模型的特点:

  • 无边界:所谓无边界,是因为随着时间的推移,新纪录会不断加进来
  • 有序:事件的发生有先后顺序
  • 数据记录不可变:事件一旦发生,就不能被改变
  • 可重播

2. 三种编程范式

流式处理实质上是一种编程范式,为了更好的理解流式处理,先对比的了解下 请求与响应、批处理、流式处理这三种编程范式。

1)请求与响应

解释:应用程序向处理系统发出请求,然后等待响应。
特点:延迟最小的一种范式,处理模式一般是阻塞的。

2)批处理

解释:处理系统按照设定的时间启动处理进程。
特点:高延迟、高吞吐量。

3)流式处理

解释:实时地处理一个或多个事件流,整个处理过程必须是持续的,并且读取的数据集是无边界的。
特点:延迟介于上述两种范式之间。

3. 流式处理的几个概念

1)时间

在流式处理中,大部分流式应用的操作都是基于时间窗口的。

  • 事件时间:所追踪事件的发生时间和记录的创建时间。
  • 日志追加时间:事件保存到 broker 的时间。
  • 处理时间:应用程序在收到事件之后要对其进行处理的时间。

2)状态

流式处理往往包含多个事件,而事件与事件之间的信息被称为“状态”。

  • 本地状态或内部状态:这种状态只能被单个应用程序实例访问,优势是速度快,缺点是受内存大小的限制。
  • 外部状态:这种状态使用外部的数据存储(例如 NoSQL 系统)来维护,优势是没有大小的限制,可以被多个实例或多个应用程序访问,缺点是引入额外的系统会造成更大的延迟和复杂性。

3)流和表的二元性

流包含了变更——流是一系列事件,每个事件就是一个变更。
表包含了当前的状态,是多个变更所产生的结果。
(二元性即事物的相对性)

4)时间窗口

大部分针对流的操作都是基于时间窗口的,对于时间窗口要考虑几个问题:窗口大小、移动频率、可更新的时间。

4. 流式处理的设计模式

1)单个时间处理

这个模式也叫 map 或 filter 模式

2)使用本地状态

3)多阶段处理和重分区

4)使用外部查找——流和表的连接

5)流与流的连接

流和流的连接也叫作基于时间窗口的连接(windowed-join)。

连接两个流,就是连接两个流的所有历史事件 —— 将两个流里具有相同键和发生在相同时间窗口内的事件匹配起来。

6)乱序事件

要让流处理应用程序处理好乱序事件,需要做到以下几点:

  • 识别乱序事件;
  • 规定一个时间段用于重排乱序的事件;
  • 具有在一定时间段内重排乱序事件的能力;
  • 具备更新结果的能力

7)重新处理

该模式有两个变种:

  • 使用新版本应用处理同一个事件流,生成新的结果, 并比较两种版本的结果,然后在某个时间点将客户端切换到新的结果流上。
  • 当现有的流式处理出现问题时,对当前数据流进行修复,修复完成后重新处理事件流并重新计算结果,这种模式涉及到了“重置”应用。