为应用程序选择合适的流式处理器

news/2024/7/8 9:21:35
\

关键要点

\\
  • 选择一款合适的流式处理器具有一定的挑战性,因为有太多的选择,而最终的选择取决于最终用户的使用场景。\\t
  • 流式SQL提供了更快的应用程序开发速度和高度可维护的部署。\\t
  • 查询编辑环境对开发人员的工作效率有显著的影响,这需要高级图形编辑器和用于流式处理器的调试器。\\t
  • 如果系统需要的吞吐量小于50K事件/秒,那么使用双节点高可用性(HA)部署可节省大量成本。\\t
  • 如果事件速率超出单个流式处理器节点的处理能力,那么就应该将传入事件放入消息代理并启用快照。\
\\

流式处理器是一种软件平台,让用户能够更快地响应传入的数据流(请参阅“什么是流式处理?”)。

\\

在流式处理器上运行的流式应用程序有多种形式。

\\

以下是一些示例:

\\
  1. 检测条件并生成警报(例如,跟踪厨房设备的温度并在超过预定阈值时创建警报);\\t
  2. 计算移动物体的移动平均位置并更新网页(例如,检测人的位置并在地图上绘制他的轨迹);\\t
  3. 检测异常并对其采取行动(例如,检测可疑用户并对其行为进行详细分析)。\

如果你对其他应用程序感到好奇,可以阅读“13 Stream Processing Patterns for Building Streaming and Real-Time Applications”,这篇博文讨论了更多的用例。

\\

正如Quora上的一个问题“What are the best stream processing solutions out there?”所述,有很多流式处理器可供选择。

\\

选择哪一种流式处理器取决于具体用例,本文将讨论如何做出最合适的选择。

\\

我们通过三个步骤来解决这个问题。首先讨论参考架构和流媒体应用程序解析。

\\

然后我们将讨论大多数流式应用程序需要具备的关键功能。

\\

最后,我们将列出用于不同使用场景的可选功能。

\\

流式应用程序参考架构

\\

流式应用程序需要三件组件:数据流、处理数据的处理器和执行决策的代码(参见图1)。

\\

5c8e2b0e7f52ec4ccea7e1829ae1e39a.jpg

\\

图1:流式应用程序参考架构

\\

首先,将从数据源接收到的数据流收集到消息代理的队列中。除非你有特定的要求需要使用不同的设计,否则我们建议你将消息放入消息队列并从消息队列读取消息。在必要的情况下可以重播事件,而且可以简化高可用性(HA)和容错。

\\

流式处理器从消息队列中提取事件,将它们发送到流查询,流查询负责处理数据并生成结果。大多数流式处理器会生成警报、公开或调用API、执行操作以及提供可视化元素。我们以“引言”部分提到的场景为例,就是通过监控室温来检测能源使用的异常情况。应用程序将检测异常,并通过电子邮件发送警报。图2是这个用例的应用程序数据流图。

\\

662c9a971bb77eff2cce1fa952b7e2f5.jpg

\\

图2:用于检测室温异常的流式处理应用程序的架构。

\\

在选择流式处理器时,你需要考虑两种功能:必备功能和可选功能。顾名思义,必备功能就是指肯定会被用到的功能。即使你现在用不到,以后也会用到。你可以根据自己的需要选择可选的功能。本文主要关注必备功能。

\\\\

你应该确保所选的流式处理器支持以下所有功能。

\\

支持使用消息代理进行数据收集

\\

在开发应用程序时,你面临的第一个问题是“应用程序如何从外部数据源接收数据”?答案是使用消息代理,并确保你的流式处理器能够提供支持。大部分流式处理器都提供了这种支持功能。以下是使用消息代理的一些好处:

\\
  1. 立即保存消息。\\t
  2. 消息代理将成为你的高可用端点,而系统的其余部分就不需要高可用。\\t
  3. 如果出现问题,可以重播消息代理中的消息。\\t
  4. 一些可伸缩的消息代理(如Kafka)自动为你处理伸缩性问题。\

关于消息代理的更多优点,请参阅文章“Questioning the Lambda Architecture”和“The Log: What every software engineer should know about real-time data's unifying abstraction”。

\\

流式SQL

\\

第一代流媒体引擎(如Apache Storm和Apache Spark)需要用户编写代码。用户可以将编写的代码放在代理(有时称为actor)中,并将这些代理连接在一起用于收集事件。

\\

虽然这是一种很好的起点,但它需要用户编写代码。容易导致代码重复,并增加了维护成本。

\\

假设你要从数据库获取数据,就需要编写描述如何查找数据的代码。编写流式处理代码并不会好到哪儿去。而在进行批处理时可以不编写代码,可以使用SQL进行查询。我们也可以使用流式分析达到同样的目的,其对应的查询语言被称为流式SQL。

\\

以下是流式SQL语言的一些优点:

\\
  • 容易理解,而且很容易招到已经熟悉SQL的开发人员。\\t
  • 它富有表现力、简洁、甜美、速度快。\\t
  • 它定义了涵盖90%问题的核心操作。\\t
  • 流式SQL语言专家可以通过编写扩展来实现特定于应用程序的自定义分析。\\t
  • 查询引擎可以使用流式SQL模型更好地优化查询。\

有了流式SQL,用户无需编写代码就能查询数据。流式SQL平台负责处理数据传输、数据解析,并且提供了连接、窗口和模式之类的操作符。清单1显示了异常检测应用程序的流式SQL代码。

\\

清单1:室温异常检测应用程序

\\
\@App:name(\"High Room Temperature Alert\")\\@App:description('An application which detects abnormal increase of room temperature.')\\@source(type='kafka', @map(type='json'), bootstrap.servers='localhost:9092',topic.list='inputStream',group.id='option_value',threading.option='single.thread')\define stream RoomTemperatureStream(roomNo string, temperature double);\\t\@sink(type='email', @map(type='text'), ssl.enable='true',auth='true',content.type='text/html', username='sender.account', address='sender.account@gmail.com',password='account.password', subject=\"High Room Temperature Alert\

http://www.niftyadmin.cn/n/3662564.html

相关文章

Java中this关键字概述

this关键字 在类的方法定义中使用的this关键字代表使用该方法对象的引用。当必须指出当前使用方法的对象是谁时要使用this有时使用this可以处理方法中成员变量和参数重名的情况this可以看作是一个变量,它的值是当前对象的引用 public class Leaf{int i0;Leaf(int i…

网站流量日志数据自定义采集

1. 原理分析首先,用户的行为会触发浏览器对被统计页面的一个http请求,比如打开某网页。当网页被打开,页面中的埋点javascript代码会被执行。埋点是指:在网页中预先加入小段javascript代码,这个代码片段一般…

Kotlin与java的纠缠史

1. 背景 Jetbrains早在2010年推出Kotlin,在今年(2017)5月18,谷歌在今日举行的I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言,这个可爱的语言可于Java进行无缝混编。之前做过一段时间的C#和python开发,感觉三者之间总两两相似,…

Adobe安装程序无法初始化的解决方案

将C:\Program Files\Common Files\Adobe\OOBE”目录删除就可以了。 如果是64位操作系统请删除C:\Program Files (x86)\Common Files\Adobe\OOBE目录。

ASP.NET Aries 高级开发教程:Excel导入之多表高级导入配置(中)

前言: 在面对Excel的各种复杂导入情况中,多表导入是很常见的情景。 今天就来写一下多表导入是如何配置的。 1、自定义导入模板 怎么自定义: 其实就是自己新建一个Excel了,把列头都写好。不过有一些下拉选项,可能自己不…

Adobe PR相关使用疑难

怎样剪裁视频画面大小:https://jingyan.baidu.com/article/6c67b1d6aa12902787bb1ec5.html 注:裁剪后勾选缩放即可将画面整个充满控制台。或者也可直接使用效果控件里面的位置和缩放来将换画面充满整个控制台。 加入音轨:https://jingyan.b…

【Java】Java中的HashMap和HashSet

文章目录 一、哈希表1.1 什么是哈希表1.2 哈希冲突1.3 冲突避免1.4 哈希函数1.5 闭散列1.6 开散列 二、HashMap的使用2.1 常用方法2.2 Map.Entry2.3 底层结构2.4 扩容机制2.5 使用案例 三、HashSet的使用3.1 常用方法3.2 底层结构3.3 使用案例 一、哈希表 1.1 什么是哈希表 哈…

Java中static关键字概述

static关键字 在类中,static声明的成员变量是静态成员变量,它为该类的公共变量,它当且仅当在类初次加载时会被初始化,对于该类的所有对象来说,static成员变量只有一份。可以通过对象引用或者类名直接访问静态成员变量…