译文|借助 Pulsar Functions 迁移到无服务应用程序

504 阅读6分钟

本文作者是 Axel Sirota,译者为 StreamNative 的刘昱、Jennifer、Sijia。

原文链接 streamnative.io/en/blog/tec…

关于 Apache Pulsar

Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。 GitHub 地址:github.com/apache/puls…

Pulsar 2.0 版本引入 Pulsar Functions。Pulsar Functions 支持用户轻松地平滑迁移到无服务应用程序。本文主要介绍 Pulsar Functions 的基本信息以及如何开发 Pulsar Functions。此外,本文还列举了将应用程序迁移到 Pulsar Functions 时的一些注意事项。

简单场景

假设有这样一个使用场景:我们运营一家电子商务公司,公司主要业务是处理支付发票。在 Pulsar 中,这一业务包含以下三步:

  • 将发票导入到订单 topic;
  • 执行代码,以逗号分隔发票值;
  • 将发票值写入 PostgreSQL。

本文主要介绍第二步。一般来说,我们执行的代码可能是在 AWS Lambda 中创建的无服务 function,也可能是成熟的微服务。这种方法有很多缺点。

首先,我们为一段简短代码开发全面服务。由于开发工作比较复杂,所以完全实现可能需要两周时间。

其次,由于源数据 schema 一直在变,维护工作也会越来越难。我们需要对服务和基础 PostgreSQL 表进行完整的版本控制和重新部署,而这一项工作可能需要至少一天时间。

此外,在连接或断开 Pulsar 时,AWS Lambda function 需要进行身份验证。Pulsar 先调用 Lambda function,然后由 Lambda function 自身向 Pulsar 验证身份。由于 Lambda function 引入了非必要的消息双向传递,因此会影响性能。

引入 Pulsar Functions

Pulsar Functions 是轻量级计算框架,用于处理 topic 之间的数据。Pulsar Functions 在 Pulsar 中运行,因此无需单独部署微服务,节省时间,简化排错。

Pulsar Functions 的复杂性比较灵活。Pulsar Functions 不仅支持从一个 topic 转换/移动数据到另一个 topic,还支持发送数据到多个 topic、进行复杂的路由选择和批处理请求等。

Pulsar Functions 易于调试,支持在调试模式下部署 function,即可以在连接到代码并实时执行时进行调试。

开发 Pulsar Functions

使用熟悉的编程语言创建 Pulsar Function 和实现 Pulsar Functions 子类一样简单。下面的代码使用 Java 语言编写,Pulsar 也支持 Python 和 Go 语言。

public class SplitFunction implements Function<String, List<String>> {
   @Override
   public List<String> apply(String input) {
       return Arrays.asList(input.split(","));
   }
}

编译并打包代码后,通过 functions create 命令将 function 部署到 Pulsar 实例中。这一命令的参数为打包的代码和 function 的 input/output topic。

bin/pulsar-admin functions create --jar target/split.jar --classname demo.SplitFunction --input input-topic --output output-topic

开发和部署自定义 Pulsar Function 最多需要两天时间。部署完成后,Pulsar Functions 可以为用户极大简化工作量,缩短产品发布时间。Pulsar 支持用户部署任意数量的 Pulsar Function,用于从 topic 获取数据并发送到其他 topic,还可以轻松地将状态消息写入 Pulsar 日志。Pulsar Functions 不仅简化了 Pulsar 的部署流程,增强了 Pulsar 的灵活性,还拓展了 Pulsar 的功能。

开发完整的 Pulsar Functions

如何充分利用 Pulsar Functions 丰富的特性?

开发完整的 Pulsar Function 和在类中实现 Function 接口一样简单。首先实现 process() 方法,process() 方法提供的语义对象即为连接到 Pulsar 的网关。通过语义对象,我们可以访问记录器、追踪输出、向 topic 发送消息等。

使用 Pulsar Functions 获取输入数据并提取发票价格的示例代码如下。我们可以使用语义对象发送这些数据到另一个 output topic(如想在部署 Function 时发送数据到指定的 output topic,只需将其作为 Function 的返回值返回。本示例通过发送数据到另一个 topic 展示如何使用 Pulsar Functions 进行路由,并从 Function 返回 null。)

import org.apache.pulsar.functions.api.Function;
public class RoutingFunction implements Function<String, Void> {
   @Override
   public Void process(String input, Context context) throws Exception {
       Logger LOG = context.getLogger();
       LOG.info(String.format("Got this input: %s", input));
       Price inputPrice  = new Price(input);
       String topic = String.format("year-%s", inputPrice.getYear());
       context.newOutputMessage(topic, Schema.STRING).value(inputPrice.getPrice()).send();
       // We could also return some object here and it would be sent to the
       // output topic set during function submission
       return null;   
   }
}

比 AWS Lambda 成本低

既然 AWS Lambda 可以实现我们的需求,为什么我们决定改用 Pulsar Functions?相比于 AWS Lambda,Pulsar Functions 具有一系列优势,易于调试、移除了 Pulsar 和 Lambda 之间的双向身份验证等。

下面我们通过一个常见的使用场景来对比一下使用 AWS Lambda 和 Pulsar Functions 的成本。假设某在线拍卖的实时竞价系统中,每秒竞价 1 万次(每月 260 亿请求),仅考虑请求费用,不考虑计算时间,成本为 5000 美元。假设每个请求需要 100 毫秒和 2048 GB 的虚拟机,则计算成本为 8.6 万美元。这还不包括 AWS 传输数据的费用!

AWS Lambda 是用于无服务 functions 的极佳选择,但只适合用于小规模使用场景。使用 Lambda 处理数十亿笔交易的数据管道开销高昂。

使用 Pulsar Functions 可以极大地节省成本。我刚加入 JAMPP 时,JAMPP 团队只使用 Lambda,一小部分数据管道的成本为每月 3 万余美元。当我们从 AWS Lambda 迁移到 Pulsar Functions 后,成本下降到每月几百美元,而这部分支出主要用于在 Amazon EC2 实例上托管 Pulsar。

迁移到 Pulsar Functions

首先看一下使用 Pulsar Functions 的架构。在示例使用场景中,我们在 AWS Lambda 中编写了一个 Java function 来处理 topic 之间的数据。Pulsar Functions 在这一架构中取代了 Lambda,简化了开发和部署。

图片

部署 Pulsar Functions 后,我们需要为数据创建导入和转存脚本。通过 Pulsar IO,用户可以在 Pulsar 内轻松定义外部数据 source/sink,简化了这一过程。Pulsar IO source/sink 本身也是作为 Pulsar Functions 实现的,也就是说,用户可以在 Pulsar 中创建自定义 source/sink,简化调试操作。

迁移到 Pulsar Functions 共需三步:

  • 迁移所有处理逻辑到一个或多个 Pulsar Functions
  • 转换 IO 逻辑(使用 Pulsar IO source/sink)
  • 使用日志 topic 处理日志数据

仅需三步就可以完全迁移到在 Pulsar 中运行的无服务应用程序。

如果用户目前使用的消息系统是 Kafka,该怎么办?不必担心,无需编写代码,使用 Kafka-on-Pulsar 即可从 Kafka 平滑迁移到 Pulsar。

结语

本文简要介绍了如何使用 Pulsar Functions。除了文中讨论的特性以外,Pulsar Functions 正在新增更多令人眼前一亮的特性。比如,StreamNative 最近宣布发布 Pulsar Function Mesh,支持以协调方式部署 Pulsar Function 服务集群。

本文主要介绍了如何开发 Pulsar Functions,如何将应用程序迁移到在 Pulsar 上运行的无服务应用程序,以及 Pulsar Functions 的易用性与灵活性。

预祝迁移顺利!

相关阅读

点击“ 阅读原文 ”,获取 Apache Pulsar 硬核干货资料!