在 《流数据平台构建实战指南》第一部分 中,Confluent联合创始人Jay Kreps介绍了如何构建一个公司范围的实时流数据中心。InfoQ前期对此进行过报道。本文是根据 第二部分 整理而成。在这一部分中,Jay给出了一些构建数据流平台的具体建议。
Kafka集群数量越少,系统架构就越简单,也就意味着集成点更少,新增应用程序的增量成本更低,数据流推理更简单。但出于以下几个方面的考虑,再少也不可能只有一个集群:
以单个基础设施平台为中心实现数据交换可以极大地简化数据流。如果所有系统直接互连,会是下面的样子:
如果有一个数据流平台作为中心,则会是下面的样子:
在第一幅图中,每两个系统之间需要建立两条数据管道,而在第二幅图中,只需要为每个系统创建一个输入和输出连接器来连接流数据管道。系统较多时,这两种情况下的管道数量会有很大差别。
不仅如此,不同的系统可能会有不同的数据模型。点对点集成时,每个系统都需要处理不同系统提供的不同的数据格式,而以数据流平台为中心进行集成的话,每个系统都只需要处理流数据平台的数据格式。这样可以尽量减少价值不高的语法转换。
Kafka并不强制事件数据采用任何特定的格式,使用JSON、XML或Avro都可以。但为事件指定一种在公司范围内通用的数据格式非常关键。数据遵循类似的规范,数据生产者和消费者就不用针对不同的格式编写不同的适配器。这在实现流数据平台之初是最重要的事情。
根据经验,Jay建议选择 Apache Avro 作为统一的数据格式。Avro是一种类似JSON的数据模型,可以用JSON或二进制形式进行表示。它有如下优点:
这在保证数据质量和易用性方面非常关键。Avro可以为数据定义一个“模式(schema)”,后者会带来如下好处:
除了上述建议外,Jay还介绍了他们在LinkedIn的一些做法。
当一项活动在多个系统中都比较常见,就应该为它指定一个通用的模式。一个常见的例子是应用程序错误,它可以以一种非常通用的方式建模,让ErrorEvent流捕获整个企业的错误。
Kafka数据模型是构建来表示数据流的。在Kafka中,一个流被建模成一个topic,即数据的逻辑名称。每条消息都包含一个用于在集群上进行数据划分的键和一个包含Avro数据记录的数据体。Kafka会根据SLA(如保留7天)或大小(如保留100GB)或键来维护流的历史记录。
流数据平台的一个目标是在数据系统之间以流的方式传递数据,另一个目标是在数据到达时进行数据流处理。在流数据平台中,流处理可以简单地建模成流之间的转换,如下图所示:
在流处理过程中,将处理结果重新发布到Kafka有诸多好处。它将流处理的各部分解耦,不同的处理任务可以由不同的团队使用不同的技术实现,下游处理过程缓慢不会对上游过程造成反压,Kafka起到了缓冲区的作用。
实现流处理最基本的方法是使用Kafka API读取输入数据流进行处理,并产生输出数据流。这个过程可以用任何编程语言实现。这种方法比较简单,易于操作,适应于任何有Kafka客户端的语言。不过,有些流处理系统提供了额外的功能,使用它们构建复杂实时流处理会更简单。常见的流处理框架包括 Storm 、 Samza 和 Spark Streaming 。关于它们之间的差别,感兴趣的读者可以查看 这里 、 这里 和 这里 。
感谢徐川对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流。