1.4 数据生态系统
现在已经有很多应用程序加入到我们为数据处理而构建的生态系统中。我们通过应用程序的形式定义了输入,这些应用程序会生成数据或者把数据引入系统中。我们也定义了输出,它们可以是指标、报告或者其他类型的数据产品。我们创建了一个闭环,用组件从系统中读取数据,再用来自其他数据源的数据对已读取的数据进行转换,然后再将其写回数据基础设施。数据类型可以多种多样,每一种可以有不同的内容、大小和用途。
Kafka 为数据生态系统带来了循环能力,如图 1-9 所示。它在基础设施的各个组件之间传递消息,为所有客户端提供一致的接口。如果系统提供了消息模式,那么生产者和消费者之间将不再紧密耦合,我们也不需要在它们之间建立任何类型的直连。我们可以根据业务需要添加或移除组件,因为生产者不再关心谁在使用数据,也不关心有多少个消费者。
图 1-9:大型数据生态系统
应用场景
活动跟踪
Kafka 最初的应用场景是跟踪网站用户的活动。网站用户与前端应用程序发生交互,前端应用程序再生成与用户活动相关的消息。这些消息既可以是一些静态信息,比如页面访问次数和点击量,也可以是一些复杂的操作,比如修改用户资料。这些消息会被发布到一个或多个主题上,并会被后端应用程序读取。这样,我们就可以生成报告,为机器学习系统提供数据,更新搜索结果,或者实现更多其他的功能。
传递消息
Kafka 的另一个基本用途是传递消息。应用程序向用户发送通知(如邮件)就是通过消息传递来实现的。这些应用程序组件可以生成消息,而无须关心消息的格式以及消息是如何被发送出去的。一个公共应用程序会负责读取并处理如下这些消息。
- 格式化消息(也就是所谓的装饰)。
- 将多条消息放在同一个通知里发送。
- 根据用户配置的首选项来发送消息。
使用公共组件的好处在于,无须在多个应用程序中开发重复的功能,并且可以在公共组件中做一些有趣的转换,比如把多条消息聚合成一个单独的通知,而这些工作是无法在其他地方完成的。
指标和日志记录
Kafka 也可以用于收集应用程序以及系统的指标和日志。Kafka 的多生产者特性在这个时候就派上用场了。应用程序定期把指标发布到Kafka 主题上,监控系统或告警系统会读取这些消息。Kafka 也可以被用在离线处理系统(如 Hadoop)中,进行较长时间片段的数据分析,比如年度增长走势预测。我们也可以把日志消息发布到Kafka 主题上,然后再路由给专门的日志搜索系统(如 Elasticsearch)或安全分析应用程序。更改目标系统(如日志存储系统)不会影响前端应用程序或聚合方法,这是Kafka 的另一个优点。
提交日志
Kafka 的基本概念源自提交日志,所以将Kafka 作为提交日志是件顺理成章的事。我们可以把数据库的更新发布到Kafka,然后应用程序会通过监控事件流来接收数据库的实时更新。这种变更日志流也可以用于把数据库的更新复制到远程系统,或者将多个应用程序的更新合并到一个单独的数据库。持久化的数据为变更日志提供了缓冲,也就是说,如果消费者应用程序发生故障,则可以通过重放这些日志来恢复系统状态。另外,可以用紧凑型主题更长时间地保留数据,因为我们只为一个键保留了一条最新的变更数据。
流式处理
流式处理是另一个包含多种类型应用程序的领域。虽然可以认为大部分Kafka 应用程序是基于流式处理,但真正的流式处理通常是指提供了类似 map/reduce(Hadoop)处理功能的应用程序。Hadoop 通常依赖较长时间片段的数据聚合,可以是几小时或几天。流式处理采用实时的方式处理消息,速度几乎与生成消息一样快。开发人员可以通过用流式处理框架开发小型应用程序来处理Kafka 消息,执行一些常见的任务,比如指标计数、对消息进行分区或使用多个数据源的数据来转换消息,等等。第 14章将通过其他案例来介绍流式处理。