每一个流式处理系统都不一样,从基本的消费者、处理逻辑和生产者的组合,到使用了Spark Streaming和机器学习软件包的复杂集群,以及其他很多处于中间位置的组件。这里,对一些常见的流式处理的设计模式进行了罗列,具体如下:
1、单个事件处理
处理单个事件是流式处理最基本的模式。这个模式也叫map或filter模式,因为它经常被用于过滤无用的事件或者用于转换事件(map这个术语是从Map-Reduce模式中来的,map阶段转换事件,reduce阶段聚合转换过的事件)。
在这种模式下,应用程序读取流中的事件,修改它们,然后把事件生成到另一个流上。
2、使用本地状态
大部分流式处理应用程序关系的是如何聚合信息,特别是基于时间窗口进行聚合。要实现这些聚合操作,需要维护流的状态。这些操作可以通过本地状态(而不是共享状态)来实现。
3、多阶段处理和重分区
将多个应用实例上的数据的处理结果写到一个包含单个分区的新主题上,然后由一个单独的实例读取这个分区。
4、使用外部查找——流和表的连接
流式处理有时候需要将外部数据和流集成在一起,比如将用户信息填充到点击事件当中。
为了使用外部查找来实现数据填充,可以这样做:对于事件里的每一个点击事件,从用户信息表里查找相关的用户信息,从中抽取用户的年龄和性别信息,把它们包含在点击事件里,然后将事件发布到另一个主题上。
为了获得更好的性能和更强的伸缩性,需要将数据库的信息缓存到流式处理应用程序里。
如果能够捕获数据库的变更事件,并形成事件流,流式处理作业就可以监听事件流,并及时更新缓存。
5、流与流的连接
连接两个真实的事件流,需要连接所有的历史事件——将两个流里具有相同键和发生在相同时间窗口内的事件匹配起来。流与流的连接也叫作基于时间窗口的连接。
Streams在内的RocksDB里维护了两个主题的连接时间窗口,用来执行连接操作。
6、乱序的事件
处理好乱序的场景,需要做大以下几点:
(1)识别乱序的事件。
(2)规定一个时间段用于重排序的事件。
(3)具有一定时间段内重排序时间的能力。
(4)具备更新结果的能力。
7、重新处理
这个模式有两个变种:
(1)对流式处理应用进行了改进,使用新版本的应用处理同一个事件流,生成新的结果,并比较两种版本的结果,然后在某个时间点将客户切换到新的结果流上。
(2)现有的流式处理出现了缺陷,修复缺陷之后,重新处理事件流并重新计算结果。
两个版本的流式处理,需要满足以下条件:
(1)将吸版本的应用作为一个新的消费者群组;
(2)让它从输入主题的第一个偏移量开始读取数据;
(3)检查结果流,在新版本的处理作业赶上进度时,将客户端应用程序切换到新的结果流上。