世界变化很快,要跟上它是很困难的。公司必须改进他们的IT以保持现代化,为客户提供越来越复杂的服务。
因此,事件流处理在迄今主要依赖于批处理数据处理的业务案例中继续增长。近年来,事件流处理在这三种情况下表现得尤为突出:
- 当性能和吞吐量是关键因素时,决策过程必须在几毫秒内完成:例如网络安全、运动遥测、欺诈检测、安全和人工智能。
- 当业务价值由基于事件的数据源(数据流)的计算生成时:例如基于物联网的数据源,如汽车、工业4.0、家庭自动化应用程序、移动应用程序和点击流。
- 当驻留在异构源中的数据的转换、聚合或传输涉及严重的限制时:例如大型机卸载、遗留系统、供应链集成和核心业务流程。
作为一家咨询公司和合流的合作伙伴,Bitrock帮助公司设计可持续的、端到端的定制软件解决方案,以适应他们的IT。我们开始了基于Kafka流和融合平台(主要是融合模式注册和Kafka连接)的内部概念验证(PoC),以证明这些组件在四个特定领域的有效性:
- 数据优化:过滤原始数据,以便为目标客户提供服务,通过I/O节省来扩展应用程序
- 系统弹性:使用Apache Kafka®生态系统,包括监控和流媒体库,以提供弹性系统
- 数据更新:使用Kafka从源获取最新数据
- 优化机器资源:分离数据处理管道,开发并行数据处理和无阻塞IO,以最大化硬件容量
这四个方面可以通过尽可能提高系统性能和限制操作风险来影响数据接收和系统效率。通过提供更灵活、更具弹性的系统,这增加了利润率机会。
在Bitrock,我们通过领域驱动设计来解决软件复杂性,借用有界上下文的概念,并通过松耦合来确保模块化架构。必要时,我们致力于微服务架构。
由于其不可改变的性质,事件非常适合作为我们唯一的真理来源。它们是独立的业务事实单元,也代表了组件之间合同的完美实现。我们之所以选择合流平台,是因为它能够实现一种异步微服务体系结构,这种体系结构可以随着时间的推移而发展,并有一个不可变事件的持久日志作为后盾,随时可供客户端独立使用。
这启发我们创建了一个仪表板,使用上述实践,向最终用户(特别是空中交通)清晰地呈现处理过的数据,从而提供一个开放的、近实时的不断更新的数据流。仪表板的示例如图1所示。
图1 数据可视化流(DVS)用户界面
我们是如何做到的:概念
一旦我们清楚地了解了Kafka的潜力,我们就确定了一个REST数据源API,它能够提供大量、恒定且不断更新的数据。在我们探索不同来源的第一阶段之后,我们决定选择国际飞行系统的API( API of international flight systems)。主要目的是创建一个几乎实时的数据可视化和细化仪表板。
图2 带有箭头指示数据流方向的DVS体系结构
我们实现了一个Kafka生产者,将消息写入Kafka主题,Kafka流可以订阅该主题,还可以使用它执行聚合,并通过WebSocket向我们的客户机提供随时可用的数据。
世界航班流量以一种流式的方式显示在地理地图上,在那里你几乎可以实时看到飞机在我们头顶上环球飞行。就像你最喜欢的视频游戏一样,一些关于全球实时流量的事实会显示在一个小部件中,你可以和你的朋友联系,询问他们最拥挤的机场是什么,提供最快旅行的航空公司等等。所有的数据都是从实时数据中计算一次,然后在数据可用时立即发送给用户。
我们所做的:项目架构
这个项目由几个独立的组件组成,每个组件都有一个特定的职责,从接收和转换到数据可视化。选择像Kafka这样的消息代理作为我们架构的主要支柱,允许我们在定义模块接口之后,将每个组件彼此分离,增加模块性,并并行化工作。
我们已经确定了三种不同类型的数据可视化,如图3所示:
- 航班清单
- 由四个不同等级组成的集合:始发机场、目的地机场、使用中的航空公司和更快的航班
- 实时交通信息
向Kafka发布事件
每架飞机都配有一个GPS和一个转发器,通过HTTP呼叫将飞机数据传送给空中交通管制员。卡夫卡使得这一独特的、受限的服务(我们不知道我们将获得多少有效载荷)很容易变成一个有背压支持的全功能推送系统。让我们看看怎么做。
从你的来源获取数据
剩下的资源要变成一个流动的流,30000个电话每月要花99美元。
我们可以根据以下标准设计经济高效的解决方案:
- 平日的投票数据从欧洲中部时间早上5:00到下午6:00
- 每30秒查询一次飞行数据(飞行坐标、高度、始发机场、目的地机场、时刻表等)
- 每六小时调查一次其他数据:机场(名称、坐标等)、航空公司(公司名称、国家、国旗、标志等)和飞机数据(飞机型号、年份、品牌等)
我们考虑使用连接器 ( connector) 在HTTP上轮询数据,但是由于每月的调用次数受到限制,我们必须在非工作时间关闭生产者,并且连接器中没有相应的设置。在项目的早期阶段,我们还考虑了通过WebSocket提供push API的提供者,但是连接器不支持此选项。
转换事件
用于事件聚合的Kafka流
事件现在被发表到Kafka,我们准备处理它们!UI中显示的每个小部件都链接到一个特定的事件流,所有这些事件流都由Kafka Streams应用程序管理。
首先是飞机记录窗口小部件和地理地图,两者都由 flight_received 流Feed。此流中的事件是对从源轮询的数据的直接转换,它们结合在一起以丰富原始飞行数据,如图4所示。
接下来是航空公司和机场的汇总。我们将生成三个不同的聚合事件流,每个都限制在30秒的窗口内。
最后但并非最不重要的是top_speed 流。我们可以再次生成一个聚合的窗口流,这次在30秒的窗口中找到事件之间的最大速度。
每个流共享相同的源(flight_received topic),但出于不同的目的以不同的方式以相同的顺序处理相同的数据。例如,flight_received_list stream(参见图5)在30秒的窗口中对航班执行聚合,以从源收集所有航班,并向其消费者提供航班的当前快照,只保留任何重复条目中的最新一个。每隔30秒,将创建一个新快照,并按其创建时间对其进行标记。
在计算每个公司的航班数(如图6所示)之后,我们必须按公司对数据进行分区,并计算每个分区中的记录。我们只保留前五大活跃公司,以腾出一些空间和内存。聚合数据发生在30秒的窗口中。
在过去30秒内计算最快飞机的过程是相似的。我们只保留前五名的结果,以避免不必要的数据压倒客户。该流已根据客户的需要进行了定制,因此我们根据自己的规范优化数据。
我们可以计算全球飞行飞机的数量,如图7所示。
将事件流式处理到浏览器
流式API
为了向用户展示处理结果,我们可以使用WebSocket作为主要的API协议,构建一个具有不断更新、近乎实时的感觉的web应用程序。每个小部件都由特定的WebSocket提供,因此是独立的。
在浏览器中可视化数据
为了向用户提供最终体验,我们构建了一个渐进式web应用程序(PWA),它通过各种小部件显示后端应用程序生成的数据。核心选择是:
- Vue.js作为主要的堆栈(组件、客户端路由、CLI和全局存储),提供性能和开发人员体验
- 用 TypeScript 于编写更具弹性的代码的类型脚本
- Google地图作为地图可视化工具
为了确保应用程序对最终用户设备的影响尽可能小,我们遵循最佳实践,如代码拆分和延迟加载、静态资产缓存(通过服务工作者 Server Workder)和通过RxJS(有关更多信息,您可以在浏览器中查看ApacheKafka中使用消息的博客文章 (Consuming Messages Out of Apache Kafka in a Browser)。
每个小部件负责独立地获取、加载和呈现自己的数据,以避免计算瓶颈。这样,全局状态只处理需要跨应用程序共享的小块数据。
我们的设计是一个极简和用户友好的用户界面,使其易于识别屏幕上的更新。基本的用户体验模式和组件继承自我们自己的Amber设计系统( Amber Design System.)。
如果您想在浏览器上查看流,请查看我们的DVS站点。您还可以查看我们的代码库,它是公开的,可以免费使用:
DVS的经验教训
尽管DVS乍一看可以作为一个“数据操作”练习出现,但它的主要目标是使用Kafka流使数据操作过程更容易,并且不需要复杂的提取、转换和加载(ETL)过程。DVS帮助我们自我评估和挑战端到端的业务技能,从功能分析到部署到生产。采用的体系结构通过确保服务、数据和可伸缩性的可靠性和可用性来加快开发时间。
在构建DVS时,我们发现所管理的数据量不会影响项目的执行。每天或每分钟处理数千条消息对实现没有影响。当我们过滤数据源以将数据流仅限于欧洲数据以最小化调试需求时,这一点就显露出来了。在将其发布到生产环境之前,我们移除了过滤器并进行了负载测试,结果发现数据增加了一个数量级。移除过滤器后,服务器内存消耗仅受到轻微影响,CPU负载也一样。这是由于卡夫卡所使用的零拷贝技术。
除了工业先驱和金融科技、保险科技和电子商务的早期采用者,卡夫卡采用的机会是巨大的。以遥测技术为例,在遥测技术中,不断增加的数据量从车载设备或内部传感器收集,并与来自智能城市物联网平台的数据流合并。还有工业4.0场景,在这些场景中,传统的医疗保健基础设施正迅速演变为基于数据的复杂系统。在过去的10年里,食品市场的传统供应链也经历了快速发展,转向了能够实现高标准数据驱动、质量保证和跟踪的立体平台。智能农业同样利用了新的技术领域。
在这些以及许多其他目前和未来准备就绪的市场中,事件流处理正成为一个关键工具,使行业能够在更复杂的分析平台的帮助下,更接近客户并丰富业务。
DVS项目路线图
能在UI中几乎实时地看到航班真是太好了,但是如果我想看到昨天从纽约到巴黎的旅行呢?如果事件流直接来自原始api,这是不可能实现的,但是由于我们有Kafka在幕后,我们可以有效地从任何时间点重放事件流!
我们还可以找到更多的数据流与我们的数据流结合在一起。有没有航空公司在推特上发布过关于闪电促销的消息?你要飞往洛杉矶,想知道航班当天的天气吗?我们目前正在评估ksqlDB以帮助获得这些答案。同时,如果您想了解更多,可以下载Confluent平台,开始使用由Apache Kafka的原始创建者构建的完整事件流平台。
原文:https://www.confluent.io/blog/data-stream-processing-with-kafka-streams-bitrock-and-confluent/
本文:http://jiagoushi.pro/node/991
讨论:请加入知识星球或者微信圈子【首席架构师圈】
- 登录 发表评论
- 38 次浏览
最新内容
- 4 days 23 hours ago
- 6 days 21 hours ago
- 1 week ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago