一、实时流计算技术应用场景

任何一个系统的产生,都是为了解决一个具体的问题。实时流计算技术的诞生,就是为了更快更完整地获取数据,更快更充分地挖掘出数据价值。

场景1: 某打车软件公司交通热点路段分析及可视化系统。
image.png
场景2:基于 Flink 的实时欺诈检测平台。
image.png

二、实时流计算系统通用架构

比较上面两个场景的流计算系统组成,我们不难发现这些系统,都包含了五个部分:数据采集、数据传输、数据处理、数据存储和数据展现
image.png

数据采集

数据采集,就是从各种数据源收集数据的过程,比如浏览器、手机、工业传感器、日志代理等。

其中有五个关键点。

  • 吞吐量

我们一般用 TPS(Transactions Per Second),也就是每秒处理事务数,来描述系统的吞吐量。当吞吐量要求很高时,通常就只能选择非阻塞 IO 的编程框架了。

  • 时延

当吞吐量和时延同时有性能要求时,我一般是先保证能够满足时延要求,然后在此基础上,再尽可能提高吞吐量。如果一个服务实例的吞吐量,满足不了要求,就部署多个服务实例。

  • 发送方式

数据可以逐条发送,也可以批次发送。相比逐条发送而言,批次发送每次的网络 IO 耗时更多,为了提升接收服务器的吞吐能力,我一般也会采用 Netty 这样的非阻塞 IO 框架。

  • 连接方式

使用长连接还是短连接,一般由具体的场景决定。当有大量连接需要维持时,就需要使用非阻塞 IO 服务器框架,比如 Netty。而当连接数量较少时,采用长连接和连接池的方案,一般也会非常显著提升请求处理的性能。

  • 连接数量

如果数据源相对固定,比如微服务之间的调用,那我们可以采用长连接配合连接池的方案,这样一般会非常显著地提升请求处理的性能。但当数据源很多或经常变化时,应该将连接保持时间(Keep Alive Timeout)设置为一个合理的值。

难点:在高并发和高吞吐场景下,需要对 NIO 和异步编程有非常深刻的理解。

数据传输

我们这里说的数据传输,是指流数据在各个模块间流转的过程。

流计算系统中,一般是采用消息中间件进行数据传输的,比如 Apache Kafka、RabbitMQ 等,在微服务系统中一般是采用 HTTP 或 RPC 的方式进行数据传输。这是流计算系统与微服务系统最明显的区别。

在选择消息中间件时,需要重点考虑五个方面的问题:吞吐量、时延、高可用、持久化和水平扩展

数据处理

接下来,我们来看下流计算系统的核心模块,即数据处理。

我们构建实时流计算系统的目的,就是为了解决具体的业务问题。总的来说,这些业务问题可以分为以下四类。

  • 第一类是数据转化

数据转化包括对流数据的抽取、清洗、转换和加载。比如使用 filter 函数过滤出符合条件的流数据,使用 map 函数给流数据增加新的字段。再比如更复杂的 Flink SQL CDC,也属于数据转化的内容。

  • 第二类是在流数据上统计

各种指标,比如计数、求和、均值、标准差、极值、聚合、关联、直方图等。

  • 第三类是模式匹配

模式匹配是指在流数据上,寻找预先设定的事件序列模式。比如我们常说的 CEP,也就是复杂事件处理,就属于模式匹配。

  • 第四类是模型学习和预测

基于流的模型学习算法,可以实时动态地训练或更新模型参数,继而根据模型做出预测,能更加准确地描述数据背后当时正在发生的事情。

难点:主要表现在与业务的贴合。需要对流计算能够解决哪些问题有比较深刻的理解,并需要熟练掌握解决这些问题的算法。

数据存储

数据存储,是一个非常麻烦的问题,特别是在实时流计算领域,这种大数据、低时延、高吞吐的场景,对我们的数据存储方案,挑战是非常大的。

不知道你是否考虑过这个问题,为什么软件行业,有那么多不同种类的数据库?MySQL、MongoDB、Redis、HBase、ElasticSearch、CockroachDB……随便想一下,就可以列举出数十种数据库。这是因为每种数据库,其实都有其擅长的使用场景,没有一种数据库能够在所有场景下都能胜任。

同样的对于实时场景,也需要根据业务需求来选择。

数据展现

数据展现就是将数据呈现给最终用户的过程。