“无服务器”令人兴奋,包括对其确切含义的争论(例如,考虑到代码仍在某些服务器上运行,“无服务器”是否是一个有意义的名称)。不管“无服务器”的确切定义如何,无服务器的基本思想是通过将开发人员与执行他们创建的编程逻辑的基础设施分离来简化开发人员的生活。与传统单体应用程序开发中的开发人员体验不同,开发人员往往会花费大量时间思考他们的代码如何与整个应用程序的架构和操作集成和交互。相比之下,无服务器的承诺是开发人员只需专注于通过简单的API和抽象实现他们的逻辑,而基础设施和运营团队负责处理和执行该逻辑的环境。市场上已经有相当多的通用无服务器框架,但同样的概念也可以应用于更具体的技术支持。现在让我们谈谈“流处理”。传统上,流处理一直是专用流处理引擎(SPE,或“专用流处理引擎”)的领域,例如ApacheStorm、ApacheHeron等。这些SPE提供了一个复杂的框架和执行模型,能够执行各种各样的流程。流处理的方法主要是基于函数式编程的概念(如map、flatmap等)和将处理流编译成有向无环图(DAG)的思想。同时,流处理的方法也被集成到很多混合流处理系统中,包括ApacheSparkStreaming、ApacheKafkaStreams、ApacheFlink等。尽管这些框架功能强大且灵活,但大多数开发人员并不熟悉这些框架,而且学习起来可能非常乏味。另一方面,运营团队在生产中的管理也很复杂。总之,复杂性和开销一直是在数据处理中使用流的重大障碍。然而,新技术正在将无服务器的概念带入流处理的世界。在本文中,我们将探讨Pulsar函数如何将无服务器概念引入ApachePulsar消息传递系统中的流处理。流处理的方法主要是基于函数式编程的概念(如map、flatmap等)和将处理流编译成有向无环图(DAG)的思想。同时,流处理的方法也被集成到很多混合流处理系统中,包括ApacheSparkStreaming、ApacheKafkaStreams、ApacheFlink等。尽管这些框架功能强大且灵活,但大多数开发人员并不熟悉这些框架,而且学习起来可能非常乏味。另一方面,运营团队在生产中的管理也很复杂。很多数据处理应用场景都是简单轻量级的。简单的ETL(提取、转换和加载)操作、基于事件的服务、实时聚合和事件路由都是不需要复杂拓扑或处理框架的场景。虽然这些应用场景可以使用SPE(SpecializedStreamProcessingEngine)来实现,但是开发者和用户一直被以下问题所困扰:1.搭建一个单独的流处理集群过于复杂和繁重,尤其是考虑到用户只需要SPE功能2.如此简单的处理,运维成本太高,因为成熟的SPE特性非常多,在部署、监控、维护等方面自然具有很高的复杂度;3、对于大多数简单的应用场景,成熟的SPE的API过于繁杂复杂。许多SPE都有基于函数式编程模型(例如map、flatmap、reduce等)的API,这些API可能是一个强大的工具。但对于很多应用场景,特别是如果用户不熟悉函数式编程范式,这种方案可能显得过于复杂和笨拙。Pulsar函数的创建是为了更容易在流数据上开发和部署处理逻辑。它的开发具有以下设计目标。1.简单的API:任何能够用支持的语言编写函数的人都应该能够在几分钟内完成工作;2、多语言:支持Java、Scala、Python、Go、JavaScript等流行编程语言;3.内置状态管理能力:为了简化开发者的架构,应该允许计算在计算过程中保持状态。系统要以稳固的方式维护这个状态,需要增量、获取、存储和更新等基本功能;4.Managedruntime:开发者不用担心在哪里和如何运行计算,开发者只需要提交他/她的计算,系统就会运行它:5.自动负载均衡:managedruntime应该负责分配工作线程到函数。6.可调:用户应该能够使用托管运行时来调整函数实例的数量。7.容错:托管运行时还应该以可靠和容错的方式运行开发人员的计算,以便最大限度地减少停机时间。8.多租户:不同的计算应该相互隔离。开发人员应指定他们的计算所需的资源量,运行时将强制执行这些资源配额。9.灵活的部署模型:计算应该能够作为线程、进程、docker容器等运行。此外,它们应该支持在Kubernetes等外部调度程序上运行。什么是Pulsar函数?PulsarFunctions是一个轻量级处理框架,位于ApachePulsar消息传递和流媒体平台中。Pulsar函数不仅受到ApacheHeron和ApacheStorm等流处理引擎的启发,还受到AWSLambda和GoogleCloudFunctions等函数即服务(FaaS)产品的启发。PulsarFunctions可以使用Java、Python等通用语言编写处理函数,将这些函数部署到Pulsar集群中,无需使用复杂的SDK。Pulsar负责为函数设置执行环境,提供弹性支持,并确保遵循消息传递保证。处理逻辑可以是函数中的任何内容,包括数据转换、动态路由、数据丰富、数据分析等。简而言之,PulsarFunctions的美妙之处在于开发者无需部署SPE即可享受SPE(ServiceProvisioningEnvironment,简称“服务供应环境”)带来的好处。如果开发人员已经在使用SPE或仍需要部署SPE,Pulsar可以轻松连接到任何流处理引擎(包括ApacheSparkStreaming、ApacheStorm、ApacheHeron或ApacheFlink)。PulsarFunctions的工作原理Pulsar函数使用来自一个或多个Pulsar主题的数据,启用自定义逻辑来处理数据。并且,在必要时,它支持使用简单的API将结果写入其他Pulsar主题。同一Pulsar函数的一个或多个实例可以执行用户定义的处理逻辑。其中,一个函数可以使用提供的状态接口来持久化中间结果,而其他函数则负责查询状态以检索这些结果。在最简单的情况下,您甚至不需要SDK来实现Pulsar功能。例如,在Java中,用户只能实现只有一个应用方法的java.util.function.Function接口。下面是一个Pulsar函数的例子,它对消息应用了一个简单的转换操作(向字符串添加一个字符“!”):importjava.util.Function;publicclassExclamationFunctionimplementsFunction
