在“永远在线”的未来,数十亿台设备互联互通,存储原始数据以供后续分析将不再是一种选择,因为用户需要实时的准确响应。预测故障和其他上下文敏感的条件需要实时处理数据——当然是在数据进入数据库之前。
人们很容易简单地说“云将扩展”以满足实时处理流数据的需求,但一些简单的例子表明,云永远无法满足对无限数据流的实时响应需求。在这些情况下——从移动设备到物联网 (IoT)——需要一种新的范例。云计算依赖于“存储然后分析”的大数据方法,而现在迫切需要软件框架,这些框架能够舒适地即时处理源源不断、嘈杂且大量的数据流,以便实现实时的响应、预测或洞察。
例如,加利福尼亚州帕洛阿尔托市每天从其交通基础设施产生的数据流比 Twitter Firehose 还要多。这是大量的数据。为 Uber、Lyft 和 FedEx 等消费者预测城市交通需要实时的分析、学习和预测。在云中进行事件处理会导致每个事件大约半秒的不可避免的延迟。
我们需要一种简单而强大的编程范例,让应用程序在这些和类似情况下能够动态地处理无限的数据流
- 数据量巨大,或者移动原始数据的成本很高。
- 数据由广泛分布的资产(例如移动设备)生成。
- 数据具有短暂的价值,分析不能等待。
- 始终拥有最新的洞察至关重要,而外推法是行不通的。
发布和订阅
事件驱动系统领域的一个关键架构模式是发布/订阅(pub/sub)消息传递的概念。这是一种异步通信方法,其中消息从发布者(任何产生数据的实体)传递到订阅者(处理数据的应用程序)。发布/订阅将任意数量的发送者与一组未知的消费者解耦。
在发布/订阅模式中,数据源为主题发布事件到代理,代理按照接收顺序存储这些事件。应用程序订阅一个或多个主题,代理转发匹配的事件。Apache Kafka 和 Pulsar 以及 CNCF NATS 都是发布/订阅系统。用于发布/订阅的云服务包括 Google Pub/Sub、AWS Kinesis、Azure Service Bus、Confluent Cloud 等。
发布/订阅系统不运行订阅者应用程序——它们只是传递数据给主题订阅者。
流数据通常包含对应用程序或基础设施状态的更新事件。在选择处理数据的架构时,诸如发布/订阅框架之类的数据分发系统的作用是有限的。消费者应用程序的“如何”超出了发布/订阅系统的范围。这给开发人员留下了大量的复杂性需要管理。所谓的流处理器是一种特殊的订阅者,它动态地分析数据并将结果返回给同一个代理。
Apache Spark
Apache Spark 是一个用于大规模数据处理的统一分析引擎。通常,Apache Spark Streaming 被用作流处理器,例如,用新数据来训练机器学习模型。Spark Streaming 将数据分解为微批次,每个微批次由 Spark 模型或某些其他系统独立分析。事件流被分组为微批次进行分析,但流处理器本身必须是弹性的
- 流处理器必须能够随着数据速率扩展,甚至跨服务器和云,并且还需要在实例之间平衡负载,确保弹性和其他应用程序层面的需求。
- 它必须能够分析来自报告速率差异很大的数据源的数据,这意味着它必须是有状态的——或者将状态存储在数据库中。当 Spark Streaming 用作流处理器时,后一种方法经常被使用,并且在需要超低延迟响应时可能会导致性能问题。
一个相关的项目 Apache Samza 提供了一种处理实时事件流的方法,并可以使用 Hadoop Yarn 或 Apache Mesos 来弹性扩展,以管理计算资源。
解决数据扩展问题
重要的是要注意,即使是 Samza 也无法完全减轻应用程序开发人员的数据处理需求。扩展数据速率意味着处理事件的任务需要在许多实例之间进行负载均衡,并且在实例之间共享生成的应用程序层状态的唯一方法是使用数据库。然而,一旦应用程序的任务之间的状态协调演变为数据库,就会对性能产生不可避免的连锁反应。此外,数据库的选择至关重要。随着系统扩展,数据库的集群管理将成为下一个潜在的瓶颈。
这可以通过替代解决方案来解决,这些解决方案是有状态的、弹性的,并且可以用来代替流处理器。在应用程序层(在每个容器或实例中),这些解决方案从流式更新中动态构建并发的、相互关联的“Web 代理”的状态模型。代理是并发的“纳米服务”,它们为单个数据源消费原始数据并维护其状态。代理相互连接以共享状态,这种状态基于数据中发现的数据源之间的真实世界关系,例如包含和邻近关系。因此,代理形成了一个并发服务图,可以分析它们自己的状态以及与它们链接的代理的状态。每个代理都为单个数据源提供纳米服务,该服务将原始数据转换为状态,并从自身及其链接子图的变化中进行分析、学习和预测。
这些解决方案简化了应用程序架构,允许代理(真实世界数据源的数字孪生)广泛分布,即使在应用程序层维护将它们互连的分布式图时也是如此。这是因为链接是 URL,这些 URL 映射到解决方案的当前运行时执行实例和代理本身。通过这种方式,应用程序可以跨实例无缝扩展,而无需担心 DevOps 问题。代理消费数据并维护状态。它们还计算自身状态和其他代理的状态。由于代理是有状态的,因此不需要数据库,并且洞察是以内存速度计算的。
使用开源读取世界数据
我们看待数据的方式正在发生巨大的变化:真实世界正在成为记录系统,而不是数据库,真实世界事物的数字孪生可以持续流式传输其状态。幸运的是,开源社区正在引领潮流,为处理实时事件提供了丰富的项目平台。从发布/订阅(其中最活跃的社区是 Apache Kafka、Pulsar 和 CNCF NATS)到持续处理流式数据的分析框架(包括 Apache Spark、Flink、Beam、Samza 和 Apache 许可的 SwimOS 和 Hazelcast),开发人员拥有最广泛的软件系统选择。具体而言,没有比这更丰富的专有软件框架集可用了。开发人员已经发声,软件的未来是开源。
评论已关闭。