为应用程序选择合适的流式处理器
\\\关键要点
\\
- 选择一款合适的流式处理器具有一定的挑战性,因为有太多的选择,而最终的选择取决于最终用户的使用场景。\\t
- 流式SQL提供了更快的应用程序开发速度和高度可维护的部署。\\t
- 查询编辑环境对开发人员的工作效率有显著的影响,这需要高级图形编辑器和用于流式处理器的调试器。\\t
- 如果系统需要的吞吐量小于50K事件/秒,那么使用双节点高可用性(HA)部署可节省大量成本。\\t
- 如果事件速率超出单个流式处理器节点的处理能力,那么就应该将传入事件放入消息代理并启用快照。\
流式处理器是一种软件平台,让用户能够更快地响应传入的数据流(请参阅“什么是流式处理?”)。
\\在流式处理器上运行的流式应用程序有多种形式。
\\以下是一些示例:
\\- 检测条件并生成警报(例如,跟踪厨房设备的温度并在超过预定阈值时创建警报);\\t
- 计算移动物体的移动平均位置并更新网页(例如,检测人的位置并在地图上绘制他的轨迹);\\t
- 检测异常并对其采取行动(例如,检测可疑用户并对其行为进行详细分析)。\
如果你对其他应用程序感到好奇,可以阅读“13 Stream Processing Patterns for Building Streaming and Real-Time Applications”,这篇博文讨论了更多的用例。
\\正如Quora上的一个问题“What are the best stream processing solutions out there?”所述,有很多流式处理器可供选择。
\\选择哪一种流式处理器取决于具体用例,本文将讨论如何做出最合适的选择。
\\我们通过三个步骤来解决这个问题。首先讨论参考架构和流媒体应用程序解析。
\\然后我们将讨论大多数流式应用程序需要具备的关键功能。
\\最后,我们将列出用于不同使用场景的可选功能。
\\流式应用程序参考架构
\\流式应用程序需要三件组件:数据流、处理数据的处理器和执行决策的代码(参见图1)。
\\\\图1:流式应用程序参考架构
\\首先,将从数据源接收到的数据流收集到消息代理的队列中。除非你有特定的要求需要使用不同的设计,否则我们建议你将消息放入消息队列并从消息队列读取消息。在必要的情况下可以重播事件,而且可以简化高可用性(HA)和容错。
\\流式处理器从消息队列中提取事件,将它们发送到流查询,流查询负责处理数据并生成结果。大多数流式处理器会生成警报、公开或调用API、执行操作以及提供可视化元素。我们以“引言”部分提到的场景为例,就是通过监控室温来检测能源使用的异常情况。应用程序将检测异常,并通过电子邮件发送警报。图2是这个用例的应用程序数据流图。
\\\\图2:用于检测室温异常的流式处理应用程序的架构。
\\在选择流式处理器时,你需要考虑两种功能:必备功能和可选功能。顾名思义,必备功能就是指肯定会被用到的功能。即使你现在用不到,以后也会用到。你可以根据自己的需要选择可选的功能。本文主要关注必备功能。
\\\\你应该确保所选的流式处理器支持以下所有功能。
\\支持使用消息代理进行数据收集
\\在开发应用程序时,你面临的第一个问题是“应用程序如何从外部数据源接收数据”?答案是使用消息代理,并确保你的流式处理器能够提供支持。大部分流式处理器都提供了这种支持功能。以下是使用消息代理的一些好处:
\\- 立即保存消息。\\t
- 消息代理将成为你的高可用端点,而系统的其余部分就不需要高可用。\\t
- 如果出现问题,可以重播消息代理中的消息。\\t
- 一些可伸缩的消息代理(如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='[email protected]',password='account.password', subject=\"High Room Temperature Alert\