对于”无服务器”,人们非常兴奋,包括关于它的确切含义的辩论(包括”无服务器”是否是一个有意义的名称,因为代码仍在服务器上运行的某个位置)。无论您的确切定义如何,无服务器的基本思想是通过将开发人员与执行他们创建的编程逻辑的基础结构分离来简化开发人员的生活。
与开发人员在传统的单片应用程序开发中的经验不同,开发人员花费大量时间考虑其代码如何与整体的体系结构和操作集成并交互应用程序,无服务器的承诺是,开发人员可以完全专注于他们的逻辑,利用一个简单的API和抽象。
这允许基础结构和操作团队处理执行该逻辑的环境。存在通用无服务器框架,但同样的概念也可以应用于更具体的技术。
你也可能喜欢:卡夫卡以外的生活与阿帕奇脉冲星。
流处理传统上是专用流处理引擎 (SSP) 的域,如 Apache Storm、Apache Heron 等。这些 SSE 提供复杂的框架和执行模型,能够执行广泛的处理。
他们的方法,基于函数编程概念(如地图,平图等)和编译处理流到定向非循环图(DAGs),也已被纳入许多混合流处理系统,包括Apache Spark流,阿帕奇卡夫卡流和阿帕奇Flink。尽管这些框架功能强大且灵活,但大部分开发人员都不熟悉这些框架,学习起来很麻烦,操作团队在生产中管理起来也很复杂。
复杂性和开销一直是数据处理中采用流式处理的重要障碍。但是,新技术正在将无服务器概念引入流处理领域。在本文中,我们将介绍 Pulsar 函数如何将无服务器概念引入Apache Pulsar消息传递系统内的流处理。
为什么脉冲星函数
数据处理用例有很大一部分是简单和轻量级的。简单的 ETL(提取、转换和加载)操作、基于事件的服务、实时聚合和事件路由是不需要复杂拓扑或处理图形的用例示例。
尽管可以使用 SPE 实现这些用例,但开发人员和用户一直受到以下问题的困扰:
- 设置一个完整的单独的流处理群集过于复杂和繁琐,特别是考虑到用户只需要 SPE 功能的一小部分。
- 对于这种简单的处理,操作成本过高 —— 由于成熟的 SSEs 具有许多功能,因此在部署、监视和维护方面自然具有很高的复杂性
许多 SSE 具有基于函数式编程模型的 API(例如地图、平面图、缩减等)。这些 API 可以是一个强大的工具,但对于许多用例,特别是如果用户对函数式编程模式感到不自在,它可能过于复杂和笨拙。
创建 Pulsar 函数是为了更轻松地开发和部署流数据上的处理逻辑。它开发时具有以下设计目标:
- 简单 API:任何能够用受支持的语言编写函数的人,都应该能够在几分钟内提高工作效率。
- 多语言:支持流行的语言,如Java、Scala、Python、Go和JavaScript。
- 内置状态管理。为了简化开发人员的体系结构,应允许计算在计算之间保持状态。系统应注意以稳健的方式保持此状态。基本的东西,如增量,获取,放置和更新功能是必须的。
- 托管运行时:开发人员不需要担心在何处以及如何运行其计算。开发人员只需提交其计算,系统将运行它。
- 自动负载平衡:托管运行时应负责将工作分配人员分配给函数。
- 放大和缩小:用户应该能够使用托管运行时向上和向下缩放函数实例的数量。
- 容错:托管运行时还应以可靠且容错的方式运行开发人员的计算,以尽量减少停机时间。
- 多租户:不同的计算应该彼此隔离。开发人员应指定其计算所需的资源量,运行时将强制执行这些资源配额。
- 灵活的部署模型:计算应该能够作为线程、进程、docker 容器等运行。此外,它们还应支持在外部调度程序(如 Kubernetes)上运行。
什么是脉冲星函数?
Pulsar 函数是一个轻量级的处理框架,它原生地位于 Apache Pulsar 消息传递和流平台中(请参阅我之前的帖子,了解 Pulsar 的介绍)。脉冲星函数的灵感不仅来自流处理引擎,如阿帕奇Heron和Apache风暴,但也从功能作为服务(FaaS)产品,如AWS兰姆达和谷歌云功能。
使用脉冲星函数,您可以使用通用语言(如 Java、Python 和 Go)编写处理函数,并将这些函数部署到 Pulsar 群集。无需复杂的 SDK。Pulsar 处理设置函数的执行环境,提供弹性,并确保消息传递保证得到遵守。处理逻辑可以是任何可以适合于函数的函数,包括数据转换、动态路由、数据扩充、分析等。
Pulsar 函数的优点是,您可以享受 SPE 的优势,而无需部署 SPE。Pulsar 函数可以处理许多通常发送到 SPE 的处理任务,而无需将部署、管理和开发并部署到一个io/”rel=””不跟随”目标\”\blank”\Heron,或ApacheFlink)。
脉冲星函数的工作原理
Pulsar 函数使用来自一个或多个 Pulsar 主题的数据,使用自定义逻辑处理数据,并在必要时使用简单的 API 将结果写入其他 Pulsar 主题。Pulsar 函数的一个或多个实例执行用户定义的处理逻辑。函数还可以使用提供的状态接口来保留中间结果。其他函数可以查询该状态以检索这些结果。
最简单的形式是,您甚至不需要 SDK 来实现 Pulsar 函数。例如,在 Java 中,用户只需实现 java.util.function.Function
接口,该接口只有一 apply
个方法。下面是一个 Pulsar 函数的示例,该函数将简单转换应用于消息(将”!”追加到字符串中):
import java.util.Function;
public class ExclamationFunction implements Function<String, String> {
@Override
public String apply(String input) { return String.format("%s!", input); }
}
如果用户需要上下文相关信息(如函数的名称),则用户只需实现 PulsarFunction
接口而不是 Java Function
接口。下面是一个示例:
public interface PulsarFunction<I, O> {
O process(I input, Context context) throws Exception;
}
脉冲星函数可以部署在多种配置中,接下来我们将详细讨论。
脉冲星函数部署选项
脉冲星函数由称为实例的执行器运行。单个实例执行函数的一个副本。Pulsar 函数内置并行性,因为函数可以具有多个实例,可以在函数的配置中设置实例的数量。
为了最大限度地提高部署灵活性,Pulsar 函数提供了多个执行环境,以支持多个部署选项和多个运行时来执行用不同编程语言编写的函数。当前支持以下执行环境:
运行 |
描述 |
进程运行时 |
每个实例都作为进程运行。 |
库伯内特斯 / 多克运行时 |
每个实例都作为 Docker 容器运行 |
线程运行时 |
每个实例都作为一个线程运行。此类型仅适用于 Java 实例,因为 Pulsar 函数框架本身是用 Java 编写的。 |
每个执行环境会产生不同的成本,并提供不同的隔离保证帮助器命令行工具使这一点非常简单。在本地运行模式下,该函数作为独立运行时运行,并且可以通过任何可用的进程、Docker 容器或线程控制机制进行监视和控制。
用户可以跨计算机手动生成这些运行时,或者使用复杂的调度程序(如Mesos/Kubernetes)将它们分发到群集中。下面是在”本地运行”模式下启动 Pulsar 函数的命令示例:
$ bin/pulsar-admin functions localrun \
--inputs persistent://sample/standalone/ns1/test_src \
--output persistent://sample/standalone/ns1/test_result \
--jar examples/api-examples.jar \
--className org.apache.pulsar.functions.api.examples.ExclamationFunction
用户还可以与代理一起在 Pulsar 群集内运行函数。在此模式下,用户可以将其函数”提交”到正在运行的 Pulsar 群集,Pulsar 将负责跨群集分发这些函数并监视和执行它们。
此模型允许开发人员专注于编写其函数,而不必担心管理函数的生命周期。下面是提交脉冲星函数以在脉冲星群集中运行的示例:
$ bin/pulsar-admin functions create \
--inputs persistent://sample/standalone/ns1/test_src \
--output persistent://sample/standalone/ns1/test_result \
--jar examples/api-examples.jar \
--className org.apache.pulsar.functions.api.examples.ExclamationFunction \
--name myFunction
另一个选项是将函数的整个配置放在 YAML 文件中,如下所示:
inputs: persistent://sample/standalone/ns1/test_src
output: persistent://sample/standalone/ns1/test_result
jar: examples/api-examples.jar
className: org.apache.pulsar.functions.api.examples.ExclamationFunction
name: myFunction
如果通过 YAML 配置函数,则可以使用这个更简单 create
的命令:
$ bin/pulsar-admin functions create \
--configFile ./my-function-config.yaml
处理保证
脉冲星函数提供以下 ,可以基于每个功能指定:
- 最多一次
- 至少一次
- 有效一次
使用至少一次处理和服务器端消息重复数据消除的组合,实现一次处理后,可以有效地实现处理。这意味着状态更新可以发生两次,但状态更新将仅应用一次,而任何重复状态将在服务器端丢弃。
结论
通过本介绍,我希望我激起了您对 Pulsar 函数的兴趣,并展示了其扩展功能如何允许您使用 Pulsar 作为处理数据流的统一系统。脉冲星函数还有更多的功能和可能性;你可以在阿帕奇脉冲星网站上阅读更多关于他们的信息。
在以后的帖子中,我们将比较脉冲星函数与其他框架,如阿帕奇卡夫卡KStreams和ApacheFlink函数。
敬请期待阿帕奇脉冲星上更令人兴奋的博客!
进一步阅读
com/文章/数据隐私通过洗牌和屏蔽部分-2″rel=”不跟随”=通过洗牌和屏蔽数据隐私- 第2部分。